【问题标题】:aws ecs fargate can't fetch secret manageraws ecs fargate 无法获取秘密管理器
【发布时间】:2021-10-19 05:48:48
【问题描述】:

我正在使用 AWS ECS 服务来编排我的 docker 容器。

还使用 Secret Manager 来存储和检索个人信息。

我将SecretsManagerReadWrite 政策应用于我的ecsTaskExecutionRole 和ecsServiceRole。

在使用Fargate之前,我只是将ECS与EC2一起使用。

而且效果很好。

但是在fargate,它抛出NoCredentialsError

我通过使用 boto3 制作的 python 脚本获取到秘密管理器。 (https://docs.aws.amazon.com/ko_kr/code-samples/latest/catalog/python-secretsmanager-secrets_manager.py.html)

这里有什么解决办法吗?

谢谢。


自定义权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "secretsmanager:GetSecretValue",
                "ssm:GetParameters"
            ],
            "Resource": "*"
        }
    ]
}

【问题讨论】:

    标签: amazon-web-services amazon-ecs aws-fargate secret-manager


    【解决方案1】:

    确保您应用的 IAM 策略具有以下权限:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ssm:GetParameters",
            "secretsmanager:GetSecretValue",
            "kms:Decrypt"
          ],
          "Resource": [
            "arn:aws:ssm:<region>:<aws_account_id>:parameter/parameter_name",
            "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:secret_name",
            "arn:aws:kms:<region>:<aws_account_id>:key/key_id"
          ]
        }
      ]
    }
    

    另外,请确保您使用的是 Fargate 1.3.0 (https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html)

    但我会尝试其他方法来减少代码量。自 2018 年 11 月起,无需编写自己的代码即可从 Secret Manager 中获取机密。 ECS/Fargate 可以为您完成。只需授予 ECS 访问您的密钥的权限并在任务定义中提供密钥 ARN。 ECS/Fargate 会将密钥分配给环境变量。您的代码只需要照常读取环境变量即可。

    例如:

    "containerDefinitions": [
        {
            "secrets": [
                {
                    "name": "environment_variable_name",
                    "valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
                }
            ]
        }
    ]
    

    文档在这里:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html

    【讨论】:

    • 您的意思是我只是将 arn 分配给我的任务定义,它会自动存储到环境变量中?或者我必须为此采取额外的行为?我想将我所有的秘密管理器变量存储到我系统的环境变量中。因为在我的应用程序中解析了它。
    • 正确,您可以将秘密 ARN 分配给任务定义中的环境变量。在代码级别,您只需要阅读环境。变量,像往常一样。在该场景下,ECS/Fargate 将从 Secret Manager 获取密钥。这减少了要写入应用程序的 AWS 特定代码量。
    • 我在iam - policy 中创建了自定义策略(您的第一个代码)并将其附加到ecsTaskExecutionRole 和ecsServiceRole,但它也不起作用。是不是走错路了?
    • 还将我的自定义权限 json 添加到我的帖子中。
    • ecsTaskExecutionRole 应该足够了。这些是容器在运行时可以访问的权限。刚刚在此处的集群上进行了测试并且可以正常工作
    【解决方案2】:

    我在解决同样的问题时偶然发现了这个线程。在我的情况下,权限已正确配置。但是,Secrets Manager 的 ARN 不完整。

    我已通过 ARN:

    arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:nonprod-testapp-rds-password"

    代替:

    arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:nonprod-testapp-rds-password-wdxsae

    将秘密的完整 ARN 作为容器定义中的秘密传递后问题得到解决

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 2019-12-03
      • 1970-01-01
      • 2020-12-04
      • 2021-03-15
      • 2020-07-30
      • 2022-08-19
      • 2019-10-23
      • 2022-08-16
      相关资源
      最近更新 更多