在启动模板用户数据脚本中使用CDK部署时间令牌值



我最近开始将部分基础设施移植到AWS CDK。之前,我直接用Cloudformation模板做了一些实验。

我目前面临的问题是,我想在EC2启动模板的用户数据脚本中编码一些值(即产品版本),这些值应该只在部署时加载。使用Cloudformation,这很简单,我只是从Fn::Base64Fn::Join等函数构建我的JSON文件。例如:它看起来像这样(简化)

"MyLaunchTemplate": {
"Type": "AWS::EC2::LaunchTemplate",
"Properties": {
"LaunchTemplateData": {
"ImageId": "ami-xxx",
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"#!/bin/bash -xe",
{"Fn::Sub": "echo "${SomeParameter}""},
]
}
}
}
}
}
}

这样我就可以在启动cloudformation模板时定义参数SomeParameter

使用CDK,我们可以在部署时或合成时访问AWS参数存储中的值。如果我们在部署时使用它们,我们只会得到一个令牌,否则我们会得到实际值。

到目前为止,我已经实现了读取合成时间的值,并直接将用户数据脚本编码为base64,如下所示:
product_version = ssm.StringParameter.value_from_lookup(
self, f'/Prod/MyProduct/Deploy/Version')
launch_template = ec2.CfnLaunchTemplate(self, 'My-LT', launch_template_data={
'imageId': my_ami,
'userData': base64.b64encode(
f'echo {product_version}'.encode('utf-8')).decode('utf-8'),
})

然而,使用此代码,版本将在合成时读取,并将硬编码到用户数据脚本中。

为了能够使用仅在部署时解决的动态值(value_for_string_parameter),我将以某种方式需要告诉CDK编写类似于我之前手动完成的Cloudformation模板(仅在Cloudformation中使用Fn::Base64,而不是在Python中)。然而,我没有找到一个方法来做到这一点。

如果我读取一个值,只在部署时解析如下,我怎么能在启动模板的UserData字段中使用它?

latest_string_token = ssm.StringParameter.value_for_string_parameter(
self, "my-plain-parameter-name", 1)

可以使用Cloudformation内部函数,这些函数在Python的aws_cdk.core.Fn类中可用。

可以在EC2中创建启动模板时使用,以组合字符串和令牌,例如:

import aws_cdk.core as cdk
# loads a value to be resolved at deployment time
product_version = ssm.StringParameter.value_for_string_parameter(
self, '/Prod/MyProduct/Deploy/Version')
launch_template = ec2.CfnLaunchTemplate(self, 'My-LT', launch_template_data={
'imageId': my_ami,
'userData': cdk.Fn.base64(cdk.Fn.join('n', [
'#!/usr/bin/env bash',
cdk.Fn.join('=', ['MY_PRODUCT_VERSION', product_version]),
'git checkout $MY_PRODUCT_VERSION',
])),
})

如果参数store包含版本1.2.3,则此示例可能会在启动模板中产生以下用户数据脚本:

#!/usr/bin/env bash
MY_PRODUCT_VERSION=1.2.3
git checkout $MY_PRODUCT_VERSION

相关内容

  • 没有找到相关文章

最新更新