本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:在 Step Function AWS s 中访问跨账户资源
借助 Step Functions 中的跨账户存取支持,您可以共享不同 AWS 账户配置的资源。在本教程中,我们将引导您完成访问在名为生产的账户中定义的跨账户 Lambda 函数的过程。该函数从名为开发的账户中的状态机调用。在本教程中,开发账户被称为源账户,生产账户是包含目标IAM角色的目标账户。
首先,在您所在Task
州的定义中,指定状态机在调用跨账户 Lambda 函数之前必须扮演的目标IAM角色。然后,修改目标IAM角色中的信任策略以允许源账户临时担任目标角色。此外,要调用 AWS 资源,请在目标IAM角色中定义相应的权限。最后,更新源账户的执行角色,指定担任目标角色所需的权限。
您可以将状态机配置为IAM扮演访问多个资源的角色 AWS 账户。但是,根据状态的定义,状态机在给定时间只能扮IAM演一个角色。Task
注意
目前,跨区域 AWS SDK集成和跨区域 AWS 资源访问在 Step Functions 中不可用。
先决条件
-
本教程以 Lambda 函数为例,演示如何设置跨账户存取。您可以使用任何其他 AWS 资源,但请确保已在其他账户中配置该资源。
重要
IAM角色和基于资源的策略仅在单个分区内为账户委派访问权限。例如,假定您在标准
aws
分区的美国西部(加利福尼亚北部)中有一个账户。您在aws-cn
分区的中国(北京)中也有一个账户。您不能使用中国(北京)的账户中 Amazon S3 基于资源的策略,来允许标准aws
账户中用户的访问权限。 -
在文本文件中记下跨账户资源的 Amazon 资源名称 (ARN)。在本教程的后面部分,你将在状态机的
Task
状态定义ARN中提供这一点。以下是 Lambda 函数的示例:ARNarn:aws:lambda:us-east-2:123456789012:function:
functionName
-
确保你已经创建了状态机需要IAM扮演的目标角色。
第 1 步:更新 Task 状态定义以指定目标角色
在工作流的 Task
状态下,添加一个 Credentials
字段,其中包含状态机在调用跨账户 Lambda 函数之前必须承担的身份。
以下过程演示了如何访问名为 Echo
的跨账户 Lambda 函数。您可以按照以下步骤调用任何 AWS 资源。
-
打开 Step Functions 控制台
,然后选择创建状态机。 -
在选择创作方法页面上,选择直观地设计工作流,并保留所有默认选择。
-
要打开 Workflow Studio,请选择下一步。
在操作选项卡上,将一个
Task
状态拖放到画布上。这将调用使用此Task
状态的跨账户 Lambda 函数。-
在配置页面上,执行以下操作:
-
将状态重命名为
Cross-account call
。 -
对于函数名称,选择输入函数名称,然后在框ARN中输入 Lambda 函数。例如,
arn:aws:lambda:us-east-2:111122223333:function:
。Echo
-
在 “提供IAM角色” 中ARN,指定目标IAM角色ARN。例如,
arn:aws:iam::111122223333:role/LambdaRole
。提示
或者,您也可以在包含角色的状态JSON输入中指定现有键值对的引用路径。IAM ARN为此,请从状态输入中选择 “ARN在运行时获取IAM角色”。有关使用引用路径指定值的示例,请参见指定JSONPath为IAM角色 ARN。
-
-
选择下一步。
-
在检查生成的代码页面上,选择下一步。
-
在 指定状态机设置页面上,指定新状态机的详细信息,例如名称、权限和日志级别。
-
选择创建状态机。
-
在文本文件中记下状态机的IAM角色ARN和状态机ARN。您需要在目标账户的信任政策ARNs中提供这些信息。
现在,您的 Task
状态定义应类似于以下定义。
{
"StartAt": "Cross-account call",
"States": {
"Cross-account call": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Credentials": {
"RoleArn": "arn:aws:iam::111122223333:role/LambdaRole"
},
"Parameters": {
"FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:Echo
",
},
"End": true
}
}
}
第 2 步:更新目标角色的信任策略
该IAM角色必须存在于目标账户中,并且您必须修改其信任策略以允许源账户临时担任此角色。此外,您可以控制谁可以担任目标IAM角色。
创建信任关系后,源账户中的用户可以使用 AWS Security Token Service (AWS STS) AssumeRoleAPI操作。此操作提供临时安全证书,允许访问目标账户中的 AWS 资源。
-
打开IAM控制台,网址为https://console.aws.amazon.com/iam/
。 -
在控制台的导航窗格上,选择角色,然后使用搜索框搜索目标IAM角色。例如,
。LambdaRole
-
选择信任关系选项卡。
-
选择编辑信任策略并粘贴以下信任策略。请务必替换 AWS 账户 号码和IAM角色ARN。
sts:ExternalId
字段进一步控制谁可担任该角色。状态机的名称必须仅包含 AWS Security Token ServiceAssumeRole
API支持的字符。有关更多信息,请参阅 “AWS Security Token Service API参考” AssumeRole中的。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::123456789012:role/ExecutionRole" // The source account's state machine execution role ARN }, "Condition": { // Control which account and state machine can assume the target IAM role "StringEquals": { "sts:ExternalId": "arn:aws:states:us-east-1:123456789012:stateMachine:testCrossAccount" //// ARN of the state machine that will assume the role. } } } ] }
-
保持此窗口处于打开状态,然后继续阅读下一个步骤以进行后续操作。
第 3 步:将所需权限添加到目标角色
IAM策略中的权限决定是允许还是拒绝特定请求。目标IAM角色必须具有调用 Lambda 函数的正确权限。
-
选择权限选项卡。
-
选择添加权限,然后选择创建内联策略。
-
选择JSON选项卡,将现有内容替换为以下权限。请务必替换您的 Lambda 函数。ARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:
Echo
" // The cross-account AWS resource being accessed } ] } -
选择查看策略。
-
在检查策略页面上,输入一个权限名称,然后选择创建策略。
第 4 步:在执行角色中添加承担目标角色的权限
Step Functions 不会自动为所有跨账户服务集成生成AssumeRole政策。您必须在状态机的执行角色中添加所需的权限,以允许其在一个或多个中IAM扮演目标角色 AWS 账户。
-
在IAM控制台中打开状态机的执行角色,网址为https://console.aws.amazon.com/iam/
。要实现此目的,应按照以下步骤进行: -
在源账户中打开第 1 步中创建的状态机。
-
在状态机详细信息页面上,选择IAM角色ARN。
-
-
在权限选项卡上,选择添加权限,然后选择创建内联策略。
-
选择JSON选项卡,将现有内容替换为以下权限。请务必替换您的 Lambda 函数。ARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::111122223333:role/
LambdaRole
" // The target role to be assumed } ] } -
选择查看策略。
-
在检查策略页面上,输入一个权限名称,然后选择创建策略。