【问题标题】:AWS SAM managed policy for SSM get parameter适用于 SSM 获取参数的 AWS SAM 托管策略
【发布时间】:2019-04-21 01:08:14
【问题描述】:

对于 Lambda 函数的 ssm:GetParameter* 权限,是否有任何类似于 DynamoDBReadPolicy 的托管策略?我正在使用 aws-sam-cli 并尝试关注 this,但是当我尝试在使用 sam local start-api 时获取参数时,出现以下错误:

InvalidAction: The action or operation requested is invalid. Verify that the action is typed correctly.

这是我尝试获取参数的sn-p:

const ssm = new AWS.SSM();
const param = {
    Name: "param1",
    WithDecryption: true
};
const secret = await ssm.getParameter(param).promise();

相关模板部分如下。谢谢!

KeyAlias:
    Type: AWS::KMS::Alias
    Properties:
      AliasName: 'param1Key'
      TargetKeyId: !Ref Key
Key:
    Type: AWS::KMS::Key
    Properties:
      KeyPolicy:
        Id: default
        Statement:
        - Effect: Allow
          Principal:
            AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
          Action:
          - 'kms:Create*'
          - 'kms:Encrypt'
          - 'kms:Describe*'
          - 'kms:Enable*'
          - 'kms:List*'
          - 'kms:Put*'
          - 'kms:Update*'
          - 'kms:Revoke*'
          - 'kms:Disable*'
          - 'kms:Get*'
          - 'kms:Delete*'
          - 'kms:ScheduleKeyDeletion'
          - 'kms:CancelKeyDeletion'
          Resource: '*'
          Sid: Allow root account all permissions except to decrypt the key
        Version: 2012-10-17

LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ../
      Handler: app.lambda
      Runtime: nodejs8.10
      Policies:
      - DynamoDBReadPolicy:
          TableName: !Ref Table
      - KMSDecryptPolicy:
          KeyId: !Ref Key
      # I think I need the ssm policy here

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-serverless aws-sam-cli serverless-application-model


    【解决方案1】:

    可用的 SAM 策略模板为 listed in their Github repository。这些策略模板均未授予任何 SSM 操作的权限,因此您目前无法使用 SAM 策略模板授予您的 AWS Lambda 函数访问 SSM 参数的权限。

    作为一种解决方法,您可以手动将所需的策略语句内联添加到您的策略中。看起来像:

    LambdaFunction:
        Type: AWS::Serverless::Function
        Properties:
          CodeUri: ../
          Handler: app.lambda
          Runtime: nodejs8.10
          Policies:
          - DynamoDBReadPolicy:
              TableName: !Ref Table
          - KMSDecryptPolicy:
              KeyId: !Ref Key
          - Statement:
            - Action:
                - ssm:GetParameter
              Effect: Allow
              Resource: arn:aws:ssm:region:account-id:parameter/parameter_name
    

    您还应该考虑打开一个拉取请求,为 SAM 添加用于 SSM 参数访问的策略模板,因为这样的模板当然是表达此类权限的更方便的方式。根据我的经验,开发人员非常友好,总是欢迎这样的添加。

    更新:AWS SAM 中现在提供了SSMParameterReadPolicy,因此您现在可以简单地执行以下操作,而不是使用解决方法:

    LambdaFunction:
        Type: AWS::Serverless::Function
        Properties:
          CodeUri: ../
          Handler: app.lambda
          Runtime: nodejs8.10
          Policies:
          - DynamoDBReadPolicy:
              TableName: !Ref Table
          - KMSDecryptPolicy:
              KeyId: !Ref Key
          - SSMParameterReadPolicy:
              ParameterName: parameter_name
    

    【讨论】:

    • 谢谢!这有助于在我部署时获取参数,但是在本地测试时,我仍然收到Invalid Action 错误。本地运行时SSM可能不存在?
    • 没错。当使用 AWS SAM CLI 在本地运行应用程序时,本地也没有可用的 SSM 参数存储。巧合的是,我不久前打开了一个关于此的问题:github.com/awslabs/aws-sam-cli/issues/616
    • SSMParameterReadPolicy 现在存在
    猜你喜欢
    • 2023-01-27
    • 1970-01-01
    • 2020-10-28
    • 2021-09-14
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多