Amazon web services Cloudformation KeyValuePair列表作为参数
在创建ECS基础设施时,我们使用CloudFormation来描述我们的应用程序。我们希望能够动态地将环境变量作为参数传递给模板。根据文档,有一个类型,但CloudFormation参数没有这个类型。 我们不能将环境变量硬编码到模板中,因为此模板用作嵌套堆栈,所以环境变量将在其中动态传递 到目前为止,我看到的唯一可能的方法是将所有参数作为CommaDelimitedList传递,然后以某种方式使用进行解析和映射。我可以Fn::在key和value中拆分每个实体,但是如何在CloudFormation中动态构建KeyValuePair数组呢Amazon web services Cloudformation KeyValuePair列表作为参数,amazon-web-services,amazon-cloudformation,amazon-ecs,Amazon Web Services,Amazon Cloudformation,Amazon Ecs,在创建ECS基础设施时,我们使用CloudFormation来描述我们的应用程序。我们希望能够动态地将环境变量作为参数传递给模板。根据文档,有一个类型,但CloudFormation参数没有这个类型。 我们不能将环境变量硬编码到模板中,因为此模板用作嵌套堆栈,所以环境变量将在其中动态传递 到目前为止,我看到的唯一可能的方法是将所有参数作为CommaDelimitedList传递,然后以某种方式使用进行解析和映射。我可以Fn::在key和value中拆分每个实体,但是如何在CloudFormati
或者有更简单的方法,我错过了什么?感谢您的任何想法。< P>您可能想考虑使用EC2参数存储来创建安全密钥/值对,这在CyrdFube中得到支持,并且可以与ECS环境集成。 AWS Systems Manager参数存储提供了安全、分层的 用于配置数据管理和机密管理的存储。你 可以存储密码、数据库字符串和许可证代码等数据 作为参数值。可以将值存储为纯文本或加密 数据。然后,您可以使用指定的唯一名称引用值 在创建参数时指定。高度可扩展,可用, 持久的参数存储由AWS云支持。参数 商店免费提供 虽然参数存储具有存储应用程序机密的强大安全功能,但它也可用于存储非敏感应用程序字符串,如公钥、环境设置、许可证代码等 云信息直接支持,可以轻松捕获、存储和管理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"
}
最后,这展示了一种在运行时将权限读入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"]
通过该调用,每个参数都可以作为容器中的环境变量使用。您的应用程序可能需要也可能不需要包装器来读取环境变量中的参数。我也面临同样的问题,我需要使用环境变量创建lambda资源。 我们决定修复环境变量的初始集,并提前确定密钥名称。
因此,我添加了四个参数,并使用Ref作为值,同时保留固定的密钥名称。什么客户端/服务使用环境中的密钥对?需要注入多少个键对作为参数?@RodrigoM,键值对的数量是动态的,但在我们的例子中,最多有20个环境变量。这些环境变量正在传递给Docker容器,如果这是您所要求的。我只是想知道在这个过程中它们在哪里被引用。这些值是在Docker文件中还是在运行时应用程序中引用的?两者?@RodrigoM仅在运行时应用程序中,ECS正在使用已烘焙的DockerFile并将变量传递给容器您可以编写一个脚本,根据所需的环境变量生成CloudFormation模板。该脚本还可以使用AWSAPI部署堆栈。它并不能真正解决在模板中插入参数列表的问题,不是吗?我不仅需要传递env变量值,还需要传递键。是的,您当然可以在模板中包含20个参数。这就是你的意思吗?什么类型的钥匙?它是一个通用的参数存储,所以它可以存储任何东西。我们使用它们来存储ssh密钥,以及其他类型的数据,它们在功能上与您在CloudFormation中提到的TaskDefinition ContainerDefinition KeyValue对相同。SSM参数目前处于云信息中。您还可以使用Fn::GetAtt(参数,'value')引用其他堆栈中的值。似乎它应该符合您给定的要求否?KeyValuePair具有“Key”和“Value”属性。我不仅需要插入“Value”,还需要插入“Key”。当您编写模板时,amount KeyValuePairs是未知的,它们都是动态的。因此,必须插入整个KeyValuePairs数组。这就解释了我的问题吗?也许我在最初的问题中不够清楚。公平地说,我认为@rodrigo-m是正确的,使用外部配置服务(如参数存储)可以根据需要查找所需的配置值。如果您不想将查找构建到您的容器中,您可以使用一个sidecar容器来实现这一点,并链接到您的主容器。