我有一个CloudFormation模板,它使用UserData脚本创建了一个EC2示例,该脚本应该分配LaunchUserData
参数:
AWSTemplateFormatVersion: '2010-09-09'
Description: Create an AMI from an EC2 instance.
Parameters:
LaunchUserData:
Description: Base64-encoded user data to launch EC2 instances.
Type: String
GitSSHKey:
Description: Git SSH key
Type: String
Resources:
LaunchEc2:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
UserData: ...
LaunchUserData
是一个bash脚本,它将引用堆栈的一些参数和资源:
#!/bin/bash
GIT_SSH_KEY=${GitSshKey};
echo "$GIT_SSH_KEY" | base64 -d > $HOME/.ssh/id_rsa;
echo ${AWS:Region};
我想通过CLI创建堆栈,如下所示:
GIT_SSH_KEY="somesshkey"
LAUNCH_USERDATA=$(jq -Rs . < $PWD/templates/launch)
STACK_ID=$(aws cloudformation create-stack \
--stack-name test \
--template-body file://$CLOUD_FORMATION_FILE \
--parameters \
ParameterKey=GitSSHKey,ParameterValue="$GIT_SSH_KEY" \
ParameterKey=LaunchUserData,ParameterValue="$LAUNCH_USERDATA" \
--output text \
--query 'StackId');
LaunchUserData
脚本一旦被解释,就必须用当前堆栈的参数和资源引用和替换它的${}
变量,因此,当在EC2示例中检索(并执行)用户数据脚本时,它应该看起来像这样:
$ curl http://169.254.169.254/latest/user-data
#!/bin/bash
GIT_SSH_KEY=somesshkey;
echo "$GIT_SSH_KEY" | base64 -d > $HOME/.ssh/id_rsa;
echo us-east-1;
请注意脚本还可能引用其他CloudFormation资源。
如何正确地将LaunchUserData
参数传递给UserData,而不将其硬编码到模板中?
1条答案
按热度按时间laawzig21#
你可以这样做:
所以解码参数并将其通过管道传输到bash。
但是请注意,
http://169.254.169.254/latest/user-data
将始终返回模板本身中存在的任何内容。