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” ?
您可以使用传统的字符串格式化工具来执行此操作,就像日志组是常规字符串一样:
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
| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |