Amazon cloudformation 使用Lambda函数自动创建的角色的ARN

Amazon cloudformation 使用Lambda函数自动创建的角色的ARN,amazon-cloudformation,aws-sam,Amazon Cloudformation,Aws Sam,在SAM模板中,是否有方法引用使用Lambda函数自动创建的角色的ARN 我需要在模板中的其他地方使用ARN # this is the role Role: Type: AWS::IAM::Role Properties: RoleName: client-role AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effec

在SAM模板中,是否有方法引用使用Lambda函数自动创建的角色的ARN

我需要在模板中的其他地方使用ARN

# this is the role

  Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: client-role
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
          - Effect: Allow
            Principal:
              AWS: "arn:aws:iam::xxxx:role/xxxxxxx-ApiHandlerRole-12UWXALxxxxx"
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonS3FullAccess

# this is the lambda

  ApiHandler:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: api-handler
      ......
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref Table
        - S3ReadPolicy:
            BucketName: !Ref Bucket
        - S3WritePolicy:
            BucketName: !Ref Bucket
        - Version: "2012-10-17"
          Statement:
            - Effect: Allow
              Action: sts:AssumeRole
              Resource: !GetAtt Role.Arn

我认为您所做的是将角色的资源构建分开


那你就可以用这个了!在任何需要的地方引用角色,包括lambda角色。

您可以自己构建角色的ARN。它有固定的格式。发件人:

如果未指定角色,将为您创建一个逻辑ID为function logical idRole的角色

例如,使用
Sub

!Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/function-logical-idRole"
其中,
函数逻辑id
是lambda函数逻辑id。

类似于

# this is the lambda

  ApiHandler:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: api-handler
      Policies:
      ......

# this is the role

  Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: client-role
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
          - Effect: Allow
            Principal:
              AWS: !GetAtt ApiHandlerRole.Arn
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonS3FullAccess
假设您尚未为函数指定“AssumePolicyDocument”。 (以上代码基于pastebin),SAM cli将为您生成一个名为“ApiHandlerRole”的角色

从:

如果未指定此属性,AWS SAM将添加默认的假定角色 用于此功能

从外观上看,你可能想进一步探索这一特性。我是AWS SAM的新手,但必须有办法在这里插入“arn:AWS:iam::AWS:policy/AmazonS3FullAccess”。)

希望这对大家都有帮助

文档链接:


解决方案: 所以,我今天碰到了这种情况

假设您的资源Lambda名为MyLambda,则使用

!Ref MyLambdaRole.Arn
经过考验,效果很好

工作原因:如果展开已处理的模板,IAM角色资源将使用以下术语命名

<lambda-logical-id>Role
角色

别忘了投票D

你能给我们看一下你的例子吗?@petey我已经把相关的部分贴在这里了-我可能不得不走这条路,但情况似乎并非如此,因为在末尾似乎添加了一个额外的随机字符串:arn:aws:iam::xxxx:role/xxxxxxx-ApiHandlerRole-12uwxalxxx
!Sub
是野兽!通常情况下,保存一天,而不是今天。@t如果是这样,那么文档是不正确的。可能需要向AWS报告。