У меня проблемы с тем, чтобы мой пользователь IAM принял существующую роль, выполняя пошаговую функцию.
Итак, у меня есть пользователь IAM (а не пользователь IAM с правами root-пользователя), для которого я хотел бы написать некоторый код .NET, чтобы предположить, что Роль существует.
И я бы хотел назначить ему эту роль с помощью некоторого кода C #.
А затем выполните пошаговую функцию, используя ее ARN, теперь, когда я принял на себя роль, чтобы запустить ее для моего пользователя IAM.
Это код, который в основном работает
using Amazon;
using Amazon.Extensions.NETCore.Setup;
using Amazon.SecurityToken;
using Amazon.SecurityToken.Model;
using Amazon.StepFunctions;
using Amazon.StepFunctions.Model;
using Newtonsoft.Json;
using SimpleStepFunction;
using System;
using System.Threading.Tasks;
namespace InvokeStatemachine
{
class Program
{
static void Main(string[] args)
{
var options = new AWSOptions()
{
Profile = "default",
Region = RegionEndpoint.EUWest2
};
var assumedRoleResponse = ManualAssume(options).ConfigureAwait(false).GetAwaiter().GetResult();
var assumedCredentials = assumedRoleResponse.Credentials;
var amazonStepFunctionsConfig = new AmazonStepFunctionsConfig { RegionEndpoint = RegionEndpoint.EUWest2 };
using (var amazonStepFunctionsClient = new AmazonStepFunctionsClient(
assumedCredentials.AccessKeyId,
assumedCredentials.SecretAccessKey, amazonStepFunctionsConfig))
{
var state = new State
{
Name = "MyStepFunctions"
};
var jsonData1 = JsonConvert.SerializeObject(state);
var startExecutionRequest = new StartExecutionRequest
{
Input = jsonData1,
Name = $"SchedulingEngine_{Guid.NewGuid().ToString("N")}",
StateMachineArn = "arn:aws:states:eu-west-2:<SomeNumber>:stateMachine:StateMachine-XXXXXXX"
};
var taskStartExecutionResponse = amazonStepFunctionsClient.StartExecutionAsync(startExecutionRequest).ConfigureAwait(false).GetAwaiter().GetResult();
}
Console.ReadLine();
}
public static async Task<AssumeRoleResponse> ManualAssume(AWSOptions options)
{
var stsClient = options.CreateServiceClient<IAmazonSecurityTokenService>();
var assumedRoleResponse = await stsClient.AssumeRoleAsync(new AssumeRoleRequest()
{
RoleArn = "arn:aws:iam::XXXXXX:role/SimpleStepFunction-StateMachineRole-XXXXXX",
RoleSessionName = "test"
});
return assumedRoleResponse;
}
}
}
Это консольное приложение .NET Core 2.1, и это используемые Nugets
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AWSSDK.Core" Version="3.3.29" />
<PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.3.6" />
<PackageReference Include="AWSSDK.SecurityToken" Version="3.3.4.22" />
<PackageReference Include="AWSSDK.StepFunctions" Version="3.3.2.24" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SimpleStepFunction\SimpleStepFunction.csproj" />
</ItemGroup>
</Project>
Я обновил роль, которую хочу взять на себя для своего пользователя IAM, и отредактировал «доверительные отношения» для роли, включив в нее пользователя IAM arn, что-то вроде этого
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "states.eu-west-2.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::XXXXMyIamUSer" },
"Action": "sts:AssumeRole"
}
]
}
Это позволяет мне взять на себя роль, как показано здесь
Но когда я прихожу, чтобы запустить самую последнюю строку, где я пытаюсь сделать это
amazonStepFunctionsClient.StartExecutionAsync(startExecutionRequest)
.ConfigureAwait(false).GetAwaiter().GetResult();
Я получаю это исключение "Маркер безопасности, включенный в запрос, недействителен."
Понятия не имею, как это исправить, у кого-нибудь есть идеи?