【问题标题】:How to automatically propagate changes of a secret to the Fargate TaskDefinitions?如何将密钥的更改自动传播到 Fargate 任务定义?
【发布时间】:2020-07-25 21:17:20
【问题描述】:

我正在使用 Amazon CloudFormation 来描述我在 AWS 云中所需的基础设施。在 Amazon Secrets Manager 中,我创建了几个变量,它们代表 S3 的凭证以及集群中的数据库访问。这些秘密被注入到 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 的修订版 -> 所有最近启动的容器仍在引用密钥的旧值。这就是为什么如果我更新例如的值aws_s3_secret 那么此更改将不会传播到我的 Fargate 集群中所有现有的和新创建的容器。

到目前为止,我已经通过“脏”方法实现了这种传播 - 通过向 TaskDefinition 添加一些不存在的环境变量并将此更改应用到集群(我已经上传了服务的更新 CloudFormation 模板)。只有在此操作之后,才会创建 TaskDefinition 的新修订版,其中包含更新的机密值,正如 Fargate 在 TaskDefinition 描述中提到的差异。

因此我的问题是:如何实现将秘密更改自动传播到 TaskDefinition 中?

【问题讨论】:

    标签: amazon-cloudformation aws-fargate aws-secrets-manager


    【解决方案1】:

    这并不能直接回答您的问题,因为据我所知,不可能通过 CloudFormation 强制传播秘密更改。

    话虽如此,您不应该使用 Secrets Manager 来管理用于访问 S3 的 AWS 凭证。相反,请使用 IAM 角色执行任务 (https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-iam-roles.html)。这会将 IAM 角色附加到您的任务定义中,如果您需要代入具有 S3 存储桶权限的不同角色,则可以使用该角色调用 S3 甚至 STS AssumeRole。

    如果您需要访问其他机密,请查看以下教程:https://docs.aws.amazon.com/AmazonECS/latest/userguide/specifying-sensitive-data-tutorial.html。通过遵循它,您应该能够在 CloudFormation 容器定义中指定 Secret。下面是使用 Secrets 容器定义指定密钥的示例。我还没来得及测试它是否有效,但它应该根据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
    

    【讨论】:

    • 如果您必须从您的任务中访问 Secrets Manager,请参阅 docs.aws.amazon.com/AmazonECS/latest/userguide/…
    • 感谢您的提示!我将重新考虑将 S3 凭证保存到 Secrets Manager 的方法。但是,除了我的 S3 凭证之外,我还有更多的秘密要存储 - 例如数据库 URL 和凭据。所以主要问题仍然与我有关。我稍后会更新问题以指出这个细节。
    • 我在上面的后续评论中链接了一个教程。本教程允许您在任务定义中指定 Secrets Manager ARN 和环境变量名称。 ECS 将从 Secrets Manager 中提取并在执行任务时为您填充环境变量。您应该可以在 CloudFormation 容器定义中使用这种方法。
    • 编辑了我的答案以包含示例 CloudFormation 模板
    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多