使用无服务器框架在AWS的跨账户角色中使用外部ID

时间:2019-06-24 15:05:23

标签: amazon-web-services amazon-iam serverless-framework serverless aws-serverless

这里是问题:我需要在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)。

我想知道根据需求指定模板的正确方法是什么? 感谢各种帮助

1 个答案:

答案 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>"