【问题标题】:Use SSM parameter whose name depends on a CFN parameter使用名称取决于 CFN 参数的 SSM 参数
【发布时间】:2020-03-11 19:51:49
【问题描述】:

我有一个如下所示的 CloudFormation 模板:

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  env:
    Type: String
    Default: NONE
Resources:
  GraphQLAPI:
    Type: AWS::AppSync::GraphQLApi
    Properties:
      Name: !Sub 'my-api-${env}'
      AuthenticationType: AMAZON_COGNITO_USER_POOLS
      UserPoolConfig:
        UserPoolId: <something>
        AwsRegion: !Ref AWS::Region
        DefaultAction: ALLOW

假设我已经有一个名为 /dev/cognitoUserPoolId 的 SSM 参数。当我创建这个模板并传递 env=dev 时,我想将该参数的值用作UserPoolId。我想避免为每个 SSM 参数手动传递一个新的 CFN 参数,因为在实践中可能会有很多。

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation aws-parameter-store


    【解决方案1】:

    您应该能够在模板中使用对 SSM 参数的动态引用。

    类似:

    AWSTemplateFormatVersion: '2010-09-09'
    Parameters:
      env:
        Type: String
        Default: NONE
    Resources:
      GraphQLAPI:
        Type: AWS::AppSync::GraphQLApi
        Properties:
          Name: !Sub 'my-api-${env}'
          AuthenticationType: AMAZON_COGNITO_USER_POOLS
          UserPoolConfig:
            UserPoolId: !Sub '{{resolve:ssm:/${env}/cognitoUserPoolId:1}}'
            AwsRegion: !Ref AWS::Region
            DefaultAction: ALLOW
    

    https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html

    【讨论】:

    • 这看起来几乎完美——但文档说你必须将特定的参数版本硬编码到模板中。这似乎使该功能无用,因为如果为一个环境更新参数,则所需的版本号将与其他环境中的不同。有没有办法解决这个问题?
    • @ThomSmith 是的,这是真的......在“cognitoUserPoolId:1”中,这种情况下的“1”是 SSM 存储参数中数据的版本号。每次数据更改时都需要在模板中手动递增,因为 SSM 会在更新时递增。 AWS 承认,目前无法告诉 CFN 模板使用最新版本的 SSM 存储参数。我希望这是将来会发生的事情。
    • 您可以为 lambda 添加自定义 CloudFormation 资源,查询参数存储 api 以获取最新版本并返回该整数。然后,您可以将其放入您的字符串中。将 python 函数组合在一起应该不会花费太多时间。
    • 我还没有编写任何自定义资源,但这似乎是合理的。编写一个返回最新值而不是最新版本号的资源可能更简单。
    • (自定义资源建议可以是它自己的单独答案。)
    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多