具有相同内联策略的AWS SAM多种功能

时间:2020-10-25 12:44:22

标签: amazon-web-services aws-lambda aws-sam

在AWS SAM .yaml模板中,我可以为每个lambda函数声明一个内联策略,如下所示:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  MyFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://my-bucket/function.zip'
      Policies:
      - Statement:
        - Sid: SSMDescribeParametersPolicy
          Effect: Allow
          Action:
          - ssm:DescribeParameters
          Resource: '*'
        - Sid: SSMGetParameterPolicy
          Effect: Allow
          Action:
          - ssm:GetParameters
          - ssm:GetParameter
          Resource: '*'

但是,如果我希望多个功能共享同一个内联策略文档,我们是否在模板的“全局”部分中声明它?

到目前为止,文档使我相信,做到这一点的最干净的方法是使用附加的策略来创建角色,而只是像这样声明每个功能的角色:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources: 
  MyFunction:
    Type: 'AWS::Serverless::Function' 
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://my-bucket/function.zip' 
      Role: arn:aws:iam::111111111111:role/SAMPolicy

是否可以在模板中声明内联策略,而仅在每个函数上引用它?

2 个答案:

答案 0 :(得分:2)

内联策略不能被引用和重复使用。但是,您可以创建和引用AWS Managed PolicySAM policy template而不是内联策略。

如果要使用可重用的自定义策略,则必须创建Customer Managed Policy并通过Role property附加到Lambda函数。

答案 1 :(得分:2)

如果我希望多个功能共享同一内联策略文档,我们是否在模板的“全局”部分中声明它? 是。这是一个示例:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'

Globals:
  Function:
    Policies:
      - Statement:
          - Sid: SSMDescribeParametersPolicy
            Effect: Allow
            Action:
              - ssm:DescribeParameters
            Resource: '*'
          - Sid: SSMGetParameterPolicy
            Effect: Allow
            Action:
              - ssm:GetParameters
              - ssm:GetParameter
            Resource: '*'

Resources:
  MyFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://my-bucket/function.zip'
  MyOtherFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://my-bucket/other-function.zip'