CDK:如何使用仅在部署时已知的值配置“userData”?

Sho*_*orn 1 amazon-ec2 aws-cdk

我正在使用 CDK v2 和 Typescript。

我希望我的堡垒机将内容记录到 Cloudwatch。我想要写入的特定 LogGroup 也是通过 CDK 创建的(以便我可以自定义保留)。

如何利用有关其他 AWS 资源(这些资源也是由 CDK 创建)的知识来自定义 userData 脚本 - 所以我不知道它们的名称?

我的 CDK 内容是通过 CDK 管道部署的。

这是我的 CDK 脚本:

export class StoBastion extends cdk.Stack {

  constructor(scope: Construct, id: string, props: cdk.StackProps){
    super(scope, id, props);

    // actual name: DemoStage-StoBastion-StoBastionLogGroup5EEB3DE8-AdkaWy0ELoeF
    const logGroup = new LogGroup(this, "StoBastionLogGroup", {
      retention: RetentionDays.TWO_WEEKS,
    });

    let initScriptPath = 'lib/script/bastion-linux2-asg-provision.sh';
    const userDataText = readFileSync(initScriptPath, 'utf8');

    const autoScalingGroup = new AutoScalingGroup(this, 'StoAsg', {
      ...   
      userData: UserData.custom(userDataText),
    })    
    
  }
}
Run Code Online (Sandbox Code Playgroud)

userData我想用作实例的shell 脚本:

#!/bin/sh

### cloudwatch ###
# This goes as early as possible in the script, so we can see what's going
# on from Cloudwatch ASAP.
echo " >>bastion>> installing cloudwatch package $(date)"
yum install -y awslogs

echo " >>bastion>> configuring cloudwatch - ${TF_APP_LOG_GROUP} $(date)"

## overwrite awscli.conf ##
cat > /etc/awslogs/awscli.conf <<EOL
[plugins]
cwlogs = cwlogs
[default]
region = ${TF_APP_REGION}
EOL
## end of overwrite awscli.conf ##

## overwrite awslogs.conf ##
cat > /etc/awslogs/awslogs.conf <<EOL
[general]
state_file = /var/lib/awslogs/agent-state

[cloudinit]
datetime_format = %b %d %H:%M:%S
file = /var/log/cloud-init-output.log
buffer_duration = 5000
log_group_name = ${TF_APP_LOG_GROUP}
log_stream_name = linux2-cloud-init-output-{instance_id}
initial_position = start_of_file

EOL
## of overwrite awslogs.conf ##

echo " >>bastion>> start awslogs daemon  $(date)"
systemctl start awslogsd

echo " >>bastion>> make sure awslogs starts up on boot"
systemctl enable awslogsd.service

### end cloudwatch ###

Run Code Online (Sandbox Code Playgroud)

我想以某种方式替换脚本中的变量引用,userData例如${TF_APP_LOG_GROUP}使用 CDK 部署时填充的值,以便它们具有正确的值。

我目前正在做cloudwatch的事情,但是我还需要做其他事情,所以这个问题不是关于cloudwatch的 - 它是关于“如何使用仅在CDK部署时已知的值来配置我的userData” ?

gsh*_*hka 5

您可以使用传统的字符串格式化工具来执行此操作,就像日志组是常规字符串一样:

const userDataText = readFileSync(
    initScriptPath,
    'utf8'
).replaceAll(
    '${TF_APP_LOG_GROUP}',
    logGroup.logGroupName
);
Run Code Online (Sandbox Code Playgroud)

这将在幕后执行的操作是将${TF_APP_LOG_GROUP}文本字符串中所有出现的 替换为令牌(一个类似于 的特殊字符串${TOKEN[LogGroup.Name.1234]}),而 CloudFormation 将在部署期间将其替换为实际值。

供参考:https ://docs.aws.amazon.com/cdk/v2/guide/tokens.html