You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:43:19