Amazon web services 使用无服务器框架在AWS的跨帐户角色中使用外部Id

Amazon web services 使用无服务器框架在AWS的跨帐户角色中使用外部Id,amazon-web-services,amazon-iam,serverless-framework,serverless,aws-serverless,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文档 这是类似于此任务的iam规范示例。serverless中的yaml模板在我的项目中如下所示: -

问题是:我需要在AWS帐户A(根AWS帐户A)中使用Lambda函数将一些数据写入AWS帐户B(根AWS帐户B)中的DynamoDB表。所有项目都是使用Node.js中的无服务器框架编写的

我知道我需要在Lambda函数中使用交叉帐户角色来实现这一点。因为Serverless使用的模板与cloudformation模板有很多相似之处。然后,我对如何使用交叉帐户角色做了一些研究,这是AWS文档

这是类似于此任务的iam规范示例。serverless中的yaml模板在我的项目中如下所示:

    - Effect: Allow
      Principal: 
        AWS: 'AWS Account B External ID'
      Action:
        - sts:AssumeRole
      Resource:
        - '*'    
但当我尝试部署无服务器模板时: 我得到的错误如下:

发生错误:IamRoleLambdaExecution-策略文档不应指定主体。(服务:AmazonIdentityManagement;状态代码:400;错误代码:格式错误的策略文档;请求ID:XXXX-XXXX-XXXX-XXXX)

我想知道根据需求指定模板的正确方法是什么。
感谢任何类型的帮助

通过创建
AWS::IAM:Role
资源,您可以允许使用外部ID扮演角色。下面的示例提供了对S3 bucket的访问,但方法是相同的

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>"
ExternalS3AccessRole:
类型:AWS::IAM::角色
特性:
蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸
假设政策文件:
版本:'2012-10-17'
声明:
-效果:允许
行动:sts:假设角色
负责人:
AWS:“示例公司的AWS帐户ID”
条件:
StringEquals:
'sts:ExternalId':“12345”
政策:
-策略名称:ExternalS3AccessPolicy
政策文件:
版本:'2012-10-17'
声明:
-效果:允许
行动:
-s3:得到*
-s3:列表*
资源:
-“arn:aws:s3::/*”
-效果:允许
行动:
-s3:得到*
-s3:列表*
资源:
-“arn:aws:s3::”

您可以通过创建
AWS::IAM:Role
资源,允许使用外部ID扮演角色。下面的示例提供了对S3 bucket的访问,但方法是相同的

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>"
ExternalS3AccessRole:
类型:AWS::IAM::角色
特性:
蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸蛋氨酸
假设政策文件:
版本:'2012-10-17'
声明:
-效果:允许
行动:sts:假设角色
负责人:
AWS:“示例公司的AWS帐户ID”
条件:
StringEquals:
'sts:ExternalId':“12345”
政策:
-策略名称:ExternalS3AccessPolicy
政策文件:
版本:'2012-10-17'
声明:
-效果:允许
行动:
-s3:得到*
-s3:列表*
资源:
-“arn:aws:s3::/*”
-效果:允许
行动:
-s3:得到*
-s3:列表*
资源:
-“arn:aws:s3::”