这里是问题:我需要在AWS账户A(在根AWS账户A中)中使用Lambda函数,将一些数据写入到AWS账户B(在根AWS账户B中)中的DynamoDB表中。所有项目都使用Node.js中的无服务器框架编写。
我知道我需要在Lambda函数中使用跨帐户角色来做到这一点。由于Serverless使用的模板共享了许多与cloudformation模板相似的内容。然后,我对如何使用交叉帐户角色进行了一些研究,这是AWS文档https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {"AWS": "Example Corp's AWS Account ID"},
"Condition": {"StringEquals": {"sts:ExternalId": "12345"}}
}
}
这是此类任务的示例iam规范。无服务器的yaml模板在我的项目中如下所示:
- Effect: Allow
Principal:
AWS: 'AWS Account B External ID'
Action:
- sts:AssumeRole
Resource:
- '*'
但是当我尝试部署无服务器模板时: 我收到这样的错误:
发生错误:IamRoleLambdaExecution-策略文档不应指定主体。 (服务:AmazonIdentityManagement;状态代码:400;错误代码:MalformedPolicyDocument;请求ID:XXXX-XXXX-XXXX-XXXX-XXXX)。
我想知道根据需求指定模板的正确方法是什么? 感谢各种帮助
答案 0 :(得分:0)
您可以通过创建AWS::IAM:Role
资源来使用外部ID担任假定的角色。下面的示例提供对S3存储桶的访问权限,但是方法相同。
ExternalS3AccessRole:
Type: AWS::IAM::Role
Properties:
RoleName: SomeRoleName
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: sts:AssumeRole
Principal:
AWS: "Example Corp's AWS Account ID"
Condition:
StringEquals:
'sts:ExternalId': "12345"
Policies:
- PolicyName: ExternalS3AccessPolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- s3:Get*
- s3:List*
Resource:
- "arn:aws:s3:::<BUCKET_NAME>/*"
- Effect: Allow
Action:
- s3:Get*
- s3:List*
Resource:
- "arn:aws:s3:::<BUCKET_NAME>"