使用参数在AWS SAM中动态创建资源名称

时间:2019-09-03 11:52:11

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

如果可以的话,我想在使用AWS SAM时为我的Cloud Formation堆栈中的资源动态创建名称。

例如当我打包或部署时,我希望能够在命令行中添加东西:

sam package --s3-bucket..... --parameters stage=prod

在我的template.yml文件中,以某种方式执行以下操作:

Resources:
  OrdersApi:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: orders-api-${stage}
      CodeUri: ./src/api/services/orders/
      ...

请注意OrdersApi的{​​{1}}属性,我想将其动态设置为FunctionName,这是我试图在CLI上传递的值。

我可以使用无服务器框架很容易地做到这一点,但是我还不太清楚如何使用SAM来实现。

2 个答案:

答案 0 :(得分:3)

您可以使用Sub之类的函数在CloudFormation中构造资源名称。大致情况:

Parameters:
  stage:
    Type: String
    Default: dev
    AllowedValues:
      - dev
      - prod
Resources:
  OrdersApi:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Sub 'orders-api-${stage}'

答案 1 :(得分:0)

Lexicore发布的答案是正确的,您可以使用template.yaml函数在!Sub文件的某些部分中形成值,例如

FunctionName: !Sub 'orders-api-${stage}'

此方法行不通的缺失之处在于,您需要以特定格式将参数传递给sam deploy命令。通过阅读AWS文档,sam deployaws cloudformation deploy...的简写。该命令允许您使用以下语法传递参数:

aws cloudformation deploy .... --parameter-overrides stage=dev

此语法也可以与sam deploy命令一起使用,例如

sam deploy --template-file packaged.yml ..... --parameter-overrides stage=dev

请注意,在此示例中,stage=dev适用于Parameters文件的template.yaml部分,例如

Parameters:
  stage:
    Type: String
    AllowedValues:
      - dev
      - stage
      - prod

这种方法使我可以在部署云形成堆栈时传递参数并动态更改值。