CDK配置ECS Fargate容器:从Parameter Store取密钥且不生成CloudFormation参数
问题
尝试将现有ECS集群迁移至CDK时遇到密钥配置问题。原CloudFormation JSON定义中通过valueFrom配置SecureString类型的SSM参数如下:
"secrets": [ { "name": "SECRET_ENV_VARIABLE", "valueFrom": "arn:aws:ssm:us-east-2:XXXXXXXX:parameter/path/to/parameter" } ]
使用C# CDK代码复刻时:
var definition = new FargateTaskDefinition(this, "TaskDefinition", new FargateTaskDefinitionProps { Cpu = 256, MemoryLimitMiB = 512, Family = "definition-family", }); definition.AddContainer("ServiceTask", new ContainerDefinitionOptions { // 其他配置... Secrets = new Dictionary<string, Secret> { { "SECRET_ENV_VARIABLE", Secret.FromSsmParameter(StringParameter.FromStringParameterName(this, "SecretEnvVariable", "/path/to/parameter")) } } });
出现错误:Parameters [/path/to/parameter] referenced by template have types not supported by CloudFormation.
查看生成的模板,虽然valueFrom内容与原JSON一致,但多了一个未被引用的CloudFormation参数:
"SecretEnvVariable2A88BA98": { "Type": "AWS::SSM::Parameter::Value<String>", "Default": "/path/to/parameter" }
需要实现与原JSON相同的valueFrom输出,且不生成这个有问题的CloudFormation参数。
解决方案
问题出在StringParameter.FromStringParameterName方法会自动创建一个CloudFormation参数来引用SSM参数,而我们需要直接指定SSM参数的ARN,避免生成额外的CFN参数。
方法一:直接指定SSM参数ARN
使用Secret.FromSecretAttributes方法直接传入ARN,代码如下:
var definition = new FargateTaskDefinition(this, "TaskDefinition", new FargateTaskDefinitionProps { Cpu = 256, MemoryLimitMiB = 512, Family = "definition-family", }); definition.AddContainer("ServiceTask", new ContainerDefinitionOptions { // 其他配置... Secrets = new Dictionary<string, Secret> { { "SECRET_ENV_VARIABLE", Secret.FromSecretAttributes(this, "SecretEnvVariable", new SecretAttributes { SecretArn = "arn:aws:ssm:us-east-2:XXXXXXXX:parameter/path/to/parameter" }) } } });
方法二:通过ARN获取参数对象再引用
如果不想硬编码ARN,可通过Aws.SSM.Parameter.FromParameterArn获取参数对象后传入Secret.FromSsmParameter:
var ssmParam = Aws.SSM.Parameter.FromParameterArn(this, "SecretEnvVariable", "arn:aws:ssm:us-east-2:XXXXXXXX:parameter/path/to/parameter"); definition.AddContainer("ServiceTask", new ContainerDefinitionOptions { // 其他配置... Secrets = new Dictionary<string, Secret> { { "SECRET_ENV_VARIABLE", Secret.FromSsmParameter(ssmParam) } } });
以上两种方式都会直接生成与原JSON一致的valueFrom值,且不会额外创建CloudFormation参数,解决报错问题。
内容的提问来源于stack exchange,提问作者tanGee
相关产品推荐
相关产品推荐

