这是一个问题:我需要在AWS帐户中使用lambda函数A(在root AWS帐户A中(将一些数据写入AWS帐户B中的DynamoDB表(在Root AWS中(帐户b(。所有项目中的所有项目都使用Node.js中的无服务器框架。
我知道我需要在lambda函数中使用跨元角色来做到这一点。由于无服务器使用类似于云形式模板的许多内容的模板。然后,我对如何使用跨帐户角色进行了一些研究,这是AWS文档https://docs.aws.aws.amazon.com/zh_cn/iam/latest/userguide/ID_ROLES_CREATE_FOR-USER_FOR-USER_EXTERNENID.HTML.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;错误代码:MalformedPolecyDocument;请求ID:XXXX-XXXX-XXXX-XXXX-XXXX-XXXX(。
我想知道根据需求指定模板的正确方法。感谢任何种类的帮助
您可以通过创建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>"