Cloudformation YAML 自定义变量

Mar*_*tik 10 yaml amazon-web-services aws-cloudformation

我试图在 AWS Cloudformation YAML 文件中实现类似于下面的内容:

AWSTemplateFormatVersion: 2010-09-09

testAttribute = "test"

Resources:
  Lambda:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: python3.7
      Role: !GetAtt iam.Arn
      MemorySize: 128
      Timeout: 10
      Handler: lambda_function.lambda_handler
      FunctionName: "testName"+${testAttribute}
      Description: 'This is my lambda'
      Code:
        S3Bucket: myBucket
        S3Key: "lambda/testName"+${testAttribute}+".zip"
Run Code Online (Sandbox Code Playgroud)

我知道上面不太正确,但在搜索如何实现它时找不到好的答案。有人对这个问题有一些指导吗?

Dou*_*roa 13

这取决于用例,但如果“变量”是静态的并且您在部署堆栈时不需要更改它,我建议使用替代解决方案,即使用映射部分

这允许您定义一些静态值,而无需在部署堆栈时发送它们(您将拥有更清晰的部署命令,并且逻辑将位于模板端而不是部署端)。

在本例中,我使用带有映射的!Sub内部函数(您可以使用 !Sub 设置要替换的多个变量):

AWSTemplateFormatVersion: 2010-09-09

Mappings:
 attributes:
  lambda:
   testAttribute: "test"

Resources:
  Lambda:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: python3.7
      Role: !GetAtt iam.Arn
      MemorySize: 128
      Timeout: 10
      Handler: lambda_function.lambda_handler
      FunctionName: !Sub 
                     - "testName${attr}"
                     - {attr: !FindInMap [attributes, lambda, testAttribute]}
      Description: 'This is my lambda'
      Code:
        S3Bucket: myBucket
        S3Key: !Sub 
                - "lambda/testName${attr}.zip"
                - {attr: !FindInMap [attributes, lambda, testAttribute]}
Run Code Online (Sandbox Code Playgroud)

注意:映射具有强制性的三级嵌套,在设计解决方案时请考虑到这一点


Mar*_*cin 6

您可以在模板中使用具有默认值的参数Sub :

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  testAttribute:
    Type: String
    Default: test

Resources:
  Lambda:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: python3.7
      Role: !GetAtt iam.Arn
      MemorySize: 128
      Timeout: 10
      Handler: lambda_function.lambda_handler
      FunctionName: !Sub "testName${testAttribute}"
      Description: 'This is my lambda'
      Code:
        S3Bucket: myBucket
        S3Key: !Sub "lambda/testName${testAttribute}.zip"

Run Code Online (Sandbox Code Playgroud)

[已编辑错字]