shell 如何在CloudFormation中传入UserData作为参数

cig3rfwq  于 2023-05-29  发布在  Shell
关注(0)|答案(1)|浏览(117)

我有一个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,而不将其硬编码到模板中?

laawzig2

laawzig21#

你可以这样做:

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:
        Fn::Base64: !Sub |
          #!/bin/bash
          export GitSshKey="${GitSSHKey}"
          echo "${LaunchUserData}" | base64 -d | bash

所以解码参数并将其通过管道传输到bash。
但是请注意,http://169.254.169.254/latest/user-data将始终返回模板本身中存在的任何内容。

相关问题