Cloudformation:从文件和命令行传递参数

时间:2017-07-13 09:58:21

标签: amazon-web-services amazon-cloudformation

我有一个关于在Cloudformation中使用参数的问题,以及更常见的关于在Clouformation中使用秘密的最佳实践。

我有一个模板,用于在自动缩放组中定义CI服务器。理论上我们可以站出很多这些堆栈。模板与parameters.json文件一起存储在源控件中,用于指定堆栈的细节(例如实例类型,自动缩放条件等)。其中一个参数是允许CI服务器与我们的CI提供程序交互的令牌,我不想将令牌存储在源代码管理中。我希望有人被提示,或者在创建或更新堆栈时被迫传递它。

理想情况下,我想象的是这样的,但显然这是无效的

aws cloudformation create-stack --stack-name <name> --template-body file://<template> --parameters file://<parameters-file.json> TokenParameter=xxxyyyzzz

有人有任何建议吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

希望这可以在2年后帮助某人...

我解决了这个问题,jq会有所帮助。我在Mac上,所以这很简单brew install jq

我的目标是使用默认的参数文件,但想将此一次传递给我的github oauth作为秘密。到上面在其他/更好的地方存储秘密的程度,这是理想的选择,但我认为在所有情况下都可能会过分杀人。例如,我的只是基于实验室的工作。

aws cloudformation create-stack --stack-name "codepipeline-test" 
--template-body file://codepipeline-test.yml 
--parameters $(cat codepipeline-test-params.json | jq -r '.[] 
| "ParameterKey=" + .ParameterKey + ",ParameterValue=" + .ParameterValue') 
ParameterKey="GitHubOAuthToken",
ParameterValue="1234567890826xxxxxxxxxx753dde68858ac2169" 
--tags '[{"Key": "Name","Value": "codedepipeline-test"},
{"Key": "Owner","Value": "username"}]' --capabilities CAPABILITY_NAMED_IAM

在CF模板中仅供参考,我将github誓言参数定义为秘密(隐藏在GUI中),如下所示:

 GitHubOAuthToken:
    Description: A valid access token for GitHub that has admin access to the GitHub Repo you specify
    Type: String
    NoEcho: true
    MinLength: 40
    MaxLength: 40
    AllowedPattern: '[a-z0-9]*'

答案 1 :(得分:0)

对于任何类型的令牌/秘密类型交互,我实际上会建议使用Systems Manager Parameter Store。优点是它集中了您的凭证存储,因此如果您因任何原因需要轮换凭据,那么它只需要更改一个地方。您还可以加密信用卡以获得额外的安全性。

由于这是AWS服务,您可以使用SDK / CLI来提取值。这可以是具有IAM角色的用户数据脚本,该角色允许系统管理员访问(以及所有其他访问)以拉取参数并将其放置在相应的文件中。另一种选择是利用SDK按需下载凭证,但这需要CI代码中的支持来实现。

有一点需要注意的是,在启动自动缩放组之前,您需要提前设置参数,这会使参数作为CF模板的一部分包含起来有点困难。