Cloudformation KeyValuePair列表作为参数

时间:2017-12-14 20:18:52

标签: amazon-web-services amazon-cloudformation amazon-ecs

在创建ECS基础架构时,我们使用CloudFormation描述了Task Definitions。我们希望能够将环境变量作为参数动态传递给模板。根据文档,Environment具有KeyValuePair类型,但CloudFormation参数不具有此类型。 我们无法将环境变量硬编码到模板中,因为此模板用作嵌套堆栈,因此环境变量将在其中动态传递。

我目前看到的唯一可能的方法是将所有参数作为CommaDelimitedList传递,然后以某种方式使用CloudFormation functions解析并映射它。我可以Fn ::拆分键和值中的每个实体,但是如何在CloudFormation中动态构建KeyValuePair数组?

或许有一种更简单的方法,我错过了一些东西?提前感谢任何想法。

2 个答案:

答案 0 :(得分:0)

您可能需要考虑使用EC2参数存储来创建CloudFormation支持的安全密钥/值对,并且可以与ECS环境集成。

AWS Systems Manager Parameter Store

  

AWS Systems Manager参数存储提供安全的分层结构   用于配置数据管理和秘密管理的存储。您   可以存储密码,数据库字符串和许可证代码等数据   作为参数值。您可以将值存储为纯文本或加密   数据。然后,您可以使用您的唯一名称来引用值   在创建参数时指定。高度可扩展,可用,   且持久,Parameter Store由AWS Cloud支持。参数   商店免费提供。

虽然Parameter Store具有用于存储应用程序机密的强大安全功能,但它也可用于存储非敏感应用程序字符串,如公钥,环境设置,许可证代码等。

CloudFormation直接支持它,允许您轻松捕获,存储和管理ECS可以访问的应用程序配置字符串。 此模板允许您通过控制台或CLI在堆栈创建时提供参数存储键值:

Description: Simple SSM parameter example
Parameters:
  pSMTPServer:
    Description: SMTP Server URL eg [email-smtp.us-east-1.amazonaws.com]:587
    Type: String
    NoEcho: false
  SMTPServer:
    Type: AWS::SSM::Parameter
    Properties: 
      Name: my-smtp-server
      Type: String
      Value: !Ref pSMTPServer

任何AWS运行时环境(EC2,ECS,Lambda)都可以轻松安全地检索这些值。从控制台端,有很好的参数管理器界面,可以维护参数版本历史记录。它与IAM集成,因此权限由标准IAM策略语法控制:

{
    "Action": [
        "ssm:GetParameterHistory",
        "ssm:GetParameter",
        "ssm:GetParameters",
        "ssm:GetParametersByPath"
    ],
    "Resource": [
        "arn:aws:ssm:us-west-2:555513456471:parameter/smtp-server"
    ],
    "Effect": "Allow"
},
{
    "Action": [
        "kms:Decrypt"
    ],
    "Resource": [
        "arn:aws:kms:us-west-2:555513456471:key/36235f94-19b5-4649-84e0-978f52242aa0a"
    ],
    "Effect": "Allow"
}

最后,这个blog article显示了一种在运行时将权限读入Dockerfile的技术。他们建议使用AWS参数存储在Docker中处理环境变量的安全方法。作为参考,我在这里包括他们的Dockerfile:

FROM grafana/grafana:master

RUN curl -L -o /bin/aws-env https://github.com/Droplr/aws-env/raw/master/bin/aws-env-linux-amd64 && \
  chmod +x /bin/aws-env

ENTRYPOINT ["/bin/bash", "-c", "eval $(/bin/aws-env) && /run.sh"]

通过该调用,每个参数都可用作容器中的环境变量。你的应用程序可能需要也可能不需要包装器来从环境变量中读取参数。

答案 1 :(得分:0)

我面临着同样的问题,我需要使用环境变量创建一个lambda资源。 我们决定修复初始的环境变量集,并且键名也预先确定。 因此,我添加了四个参数,并在保留固定键名的同时使用Ref作为值。