【问题标题】:Is it possible to define constants in SAM templates to make my template file more maintainable?是否可以在 SAM 模板中定义常量以使我的模板文件更易于维护?
【发布时间】:2020-10-07 03:19:52
【问题描述】:

我正在使用 AWS SAM 将我的 AWS Lambda 函数部署到 AWS。

我能够在 Globals 部分中定义一次 Runtime,我想知道是否可以为我的 Lambda 承担的 AWS 角色定义一个常量 (Role: arn:aws:iam::12345678:role/lambda-role),目前在每个函数的模板文件。

这是我的 SAM 模板:

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

Globals:
  Function:
    Runtime: python3.7

Resources:
  FunctionA:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: lambdas/
      Handler: app.event_handler_a
      Role: arn:aws:iam::12345678:role/lambda-role

  FunctionB:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: lambdas/
      Handler: app.event_handler_b
      Role: arn:aws:iam::12345678:role/lambda-role

【问题讨论】:

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


    【解决方案1】:

    您可以使用参数并在部署时覆盖它们,或使用引导部署来保存它们以供下次部署运行。

    检查此模板:

    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31
    
    Globals:
      Function:
        Runtime: python3.7
    
    Parameters:
      role:
        Type: String
    
    Resources:
      FunctionA:
        Type: AWS::Serverless::Function
        Properties:
          CodeUri: lambdas/
          Handler: app.event_handler_a
          Role: ${role}
    
      FunctionB:
        Type: AWS::Serverless::Function
        Properties:
          CodeUri: lambdas/
          Handler: app.event_handler_b
          Role: ${role}
    

    如何部署:

    sam deploy --template-file template.yaml --stack-name mystack --capabilities CAPABILITY_IAM --parameter-overrides role=arn:aws:iam::12345678:role/lambda-role

    或者,您可以使用 --guided cli 参数。查看以下来自 AWS 的文档:

    例如,当执行 sam deploy --guided 命令时,AWS SAM CLI 自动将所需参数添加到配置中 文件。您可以随后执行不带参数的 sam deploy ,并且 这些值将从配置文件中检索。

    【讨论】:

      【解决方案2】:

      您可以为此使用 ParametersMappings

      例如使用参数

      Parameters:
      
        LambdaRoleArn:
          Type: String
          Default: arn:aws:iam::12345678:role/lambda-role
      
      # Then for example
      
      Resoureces:
      
        FunctionB:
          Type: AWS::Serverless::Function
          Properties:
            CodeUri: lambdas/
            Handler: app.event_handler_b
            Role: !Ref LambdaRoleArn
      

      例如使用 映射

      Mappings:
      
        Lambda:
           Role: 
             Value: arn:aws:iam::12345678:role/lambda-role
      
      # Then for example
      
      Resoureces:
      
        FunctionB:
          Type: AWS::Serverless::Function
          Properties:
            CodeUri: lambdas/
            Handler: app.event_handler_b
            Role: !FindInMap [Lambda, Role, Value]
      

      映射的优点是在部署模板时不能修改它们。但显然,如果你想能够做到,那么就应该使用参数。

      【讨论】:

        猜你喜欢
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        相关资源
        最近更新 更多