// Copyright Epic Games, Inc. All Rights Reserved. using AutomationTool; using EpicGames.Core; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.Json; using System.Xml; namespace BuildGraph.Tasks { /// /// Parameters for an AWS CLI task /// public class AwsAssumeRoleTaskParameters { /// /// Role to assume /// [TaskParameter] public string Arn; /// /// Name of this session /// [TaskParameter] public string Session; /// /// Duration of the token in seconds /// [TaskParameter(Optional = true)] public int Duration = 1000; /// /// Environment variables /// [TaskParameter(Optional = true)] public string Environment; /// /// File to read environment variables from /// [TaskParameter(Optional = true)] public string EnvironmentFile; /// /// Output file for the new environment /// [TaskParameter] public string OutputFile; } /// /// Spawns AWS CLI and waits for it to complete. /// [TaskElement("Aws-AssumeRole", typeof(AwsAssumeRoleTaskParameters))] public class AwsAssumeRoleTask : SpawnTaskBase { class AwsSettings { public AwsCredentials Credentials { get; set; } } class AwsCredentials { public string AccessKeyId { get; set; } public string SecretAccessKey { get; set; } public string SessionToken { get; set; } } /// /// Parameters for this task /// AwsAssumeRoleTaskParameters Parameters; /// /// Construct an AWS CLI task /// /// Parameters for the task public AwsAssumeRoleTask(AwsAssumeRoleTaskParameters InParameters) { Parameters = InParameters; } /// /// Execute the task. /// /// Information about the current job /// Set of build products produced by this node. /// Mapping from tag names to the set of files they include public override void Execute(JobContext Job, HashSet BuildProducts, Dictionary> TagNameToFileSet) { StringBuilder Arguments = new StringBuilder("sts assume-role"); if(Parameters.Arn != null) { Arguments.Append($" --role-arn {Parameters.Arn}"); } if (Parameters.Session != null) { Arguments.Append($" --role-session-name {Parameters.Session}"); } Arguments.Append($" --duration-seconds {Parameters.Duration}"); Dictionary Environment = SpawnTaskBase.ParseEnvVars(Parameters.Environment, Parameters.EnvironmentFile); IProcessResult Result = SpawnTaskBase.Execute("aws", Arguments.ToString(), EnvVars: Environment, LogOutput: false); JsonSerializerOptions Options = new JsonSerializerOptions(); Options.PropertyNameCaseInsensitive = true; AwsSettings Settings = JsonSerializer.Deserialize(Result.Output, Options); if (Settings.Credentials != null) { if (Settings.Credentials.AccessKeyId != null) { Environment["AWS_ACCESS_KEY_ID"] = Settings.Credentials.AccessKeyId; } if (Settings.Credentials.SecretAccessKey != null) { Environment["AWS_SECRET_ACCESS_KEY"] = Settings.Credentials.SecretAccessKey; } if (Settings.Credentials.SessionToken != null) { Environment["AWS_SESSION_TOKEN"] = Settings.Credentials.SessionToken; } } FileReference OutputFile = ResolveFile(Parameters.OutputFile); DirectoryReference.CreateDirectory(OutputFile.Directory); FileReference.WriteAllLines(OutputFile, Environment.OrderBy(x => x.Key).Select(x => $"{x.Key}={x.Value}")); } /// /// Output this task out to an XML writer. /// public override void Write(XmlWriter Writer) { Write(Writer, Parameters); } /// /// Find all the tags which are used as inputs to this task /// /// The tag names which are read by this task public override IEnumerable FindConsumedTagNames() { yield break; } /// /// Find all the tags which are modified by this task /// /// The tag names which are modified by this task public override IEnumerable FindProducedTagNames() { yield break; } } }