【问题标题】:AWS - ECS load S3 files in entrypoint scriptAWS - ECS 在入口点脚本中加载 S3 文件
【发布时间】:2019-10-21 20:35:16
【问题描述】:

大家好!

代码:(entrypoint.sh)

printenv
CREDENTIALS=$(curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI")

ACCESS_KEY_ID=$(echo "$CREDENTIALS" | jq .AccessKeyId)
SECRET_ACCESS_KEY=$(echo "$CREDENTIALS" | jq .SecretAccessKey)
TOKEN=$(echo "$CREDENTIALS" | jq .Token)

export AWS_ACCESS_KEY_ID=$ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$SECRET_ACCESS_KEY
export AWS_SESSION_TOKEN=$TOKEN

aws s3 cp s3://BUCKET/file.txt /PATH/file.txt

问题:

我正在尝试将 AWS S3 文件提取到 ECS,灵感来自: AWS Documentation (但我直接从 S3 获取,而不是通过 VPC 端点)
我已配置存储桶策略和角色策略(在 taskDefinition 中作为 taskRoleArn 和 executionRoleArn 传递)
在本地,当我使用 aws cli 获取并传递临时凭据(我在入口点脚本中使用 printenv 命令登录 ECS)时,一切正常。我可以在我的电脑上保存文件。
在 ECS 上出现错误:

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

我在哪里可以找到解决方案?有人遇到过类似问题吗?

【问题讨论】:

  • 如果您在创建 ECS 集群时已将存储桶策略附加到 instanceRole,则无需设置临时凭证。

标签: amazon-web-services docker amazon-s3 amazon-ecs


【解决方案1】:

首先,如果您在 AWS 内部工作,强烈建议使用 AWS ECS service role 或 ECS task role 或 EC2 角色。您确实需要从元数据中获取凭据。

但似乎当前角色确实有权访问 s3 或入口点未正确导出环境变量。

如果您的容器实例已经拥有 assing 角色,则无需导出 Accesskey,只需调用 aws s3 cp s3://BUCKET/file.txt /PATH/file.txt 即可。

任务的 IAM 角色

使用 Amazon ECS 任务的 IAM 角色,您可以指定一个 IAM 角色 可以被任务中的容器使用。申请必须签署他们的 AWS API 请求使用 AWS 凭证,此功能提供了一个 管理您的应用程序使用的凭据的策略, 类似于 Amazon EC2 实例配置文件提供的方式 EC2 实例的凭据。而不是创建和分发 您的 AWS 凭证到容器或使用 EC2 实例的 角色,您可以将 IAM 角色与 ECS 任务定义相关联,或者 RunTask API 操作。

因此,当您将角色分配给 ECS 任务或 ECS 服务时,您的入口点将如此简单。

printenv
aws s3 cp s3://BUCKET/file.txt /PATH/file.txt

此外,您的导出将无法按预期工作,在这种情况下,将 ENV 传递到容器表单 task definition、export 的最佳方法不会。

我建议为 ECS 任务分配角色,它应该可以按您的预期工作。

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 2023-04-01
    • 2022-10-09
    • 2015-10-15
    • 2019-06-07
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多