我正在使用 Amazon CloudFormation 来描述我在 AWS 云中所需的基础设施。在 Amazon Secrets Manager 中,我创建了几个变量,它们代表 S3 的凭证以及集群中的数据库访问。这些 secret 被注入(inject)到 TaskDefinition 中,如下所示:
Resources: {...}
TaskDefinition: {...}
Properties:
ContainerDefinitions:
- Name: !Ref ServiceName
Image: {...}
Environment:
-
Name: AWS_S3_SECRET_KEY
Value:
Fn::Join:
- ''
- - '{{resolve:secretsmanager:'
- Fn::ImportValue: !Ref S3CredentialsId
- ':SecretString:aws_s3_secret}}'
此方法的问题是,TaskDefinition 不会自动提取对 Amazon Secrets Manager 的任何更改,因此不会更新 TaskDefinition 的修订版 -> 所有最近启动的容器仍引用旧的 key 值。这就是为什么如果我更新例如的值aws_s3_secret
则此更改将不会传播到我的 Fargate 集群中的所有现有容器和新创建的容器。
到目前为止,我已经通过“脏”方法实现了这种传播 - 通过向 TaskDefinition 添加一些不存在的环境变量并将此更改应用于集群(我已经上传了服务的更新的 CloudFormation 模板)。仅在此操作之后,才会创建 TaskDefinition 的新修订版,其中包含更新的 secret 值,正如 Fargate 在 TaskDefinition 描述中提到的差异一样。
因此我的问题是:如何实现将 secret 更改自动传播到任务定义中?
最佳答案
这并不能直接回答您的问题,因为据我所知,不可能通过 CloudFormation 强制传播 secret 更改。
话虽如此,您不应该使用 Secrets Manager 来管理用于访问 S3 的 AWS 凭证。相反,请使用任务的 IAM 角色 ( https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-iam-roles.html )。这会将 IAM 角色附加到您的任务定义中,如果您需要承担具有 S3 存储桶权限的不同角色,则可以使用该角色调用 S3 甚至 STS AssumeRole。
如果您需要访问其他 secret ,请查看以下教程:https://docs.aws.amazon.com/AmazonECS/latest/userguide/specifying-sensitive-data-tutorial.html 。通过遵循它,您应该能够在 CloudFormation 容器定义中指定 Secret。以下是使用 Secrets 容器定义指定 secret 的示例。我还没有时间测试它是否有效,但它应该根据the AWS documentation .
Resources: {...}
TaskDefinition: {...}
Properties:
ContainerDefinitions:
- Name: !Ref ServiceName
Image: {...}
Secrets:
-
Name: AWS_S3_SECRET_KEY
ValueFrom: arn:aws:secretsmanager:region:aws_account_id:secret:username_value-u9bH6K
关于aws-cloudformation - 如何自动将 secret 更改传播到 Fargate 任务定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61185771/