尝试在 AWS ECS Fargate 上运行的 Docker 容器内运行 AWS Logs Agent。
这在 EC2 下已经运行良好好几年了。在 Fargate 上下文下,它似乎无法解析传递给它的任务角色。
任务角色的权限应该很好...我什至尝试授予它完整的 CloudWatch 权限以消除这一原因。
我已经成功破解了基于Python的启动器脚本,添加了一个
--debug
标志,这在日志中给了我这个:
Caught retryable HTTP exception while making metadata service request to
http://169.254.169.254/latest/meta-data/iam/security-credentials
它似乎无法正确解析作为“任务角色”传递到任务中的凭据
我设法找到了一种黑客解决方法,这可能说明了我认为代理中的错误或不足之处。我必须使用 sed 破解启动器脚本,如下所示:
sed -i "s|HTTPS_PROXY|AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI HTTPS_PROXY|"
/var/awslogs/bin/awslogs-agent-launcher.sh
这本质上取消了对保存用于检索任务角色的 URI 的 ENV 变量的引用,并将其传递给代理的启动器。
结果是这样的:
/usr/bin/env -i AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/f4ca7e30-b73f-4919-ae14-567b1262b27b (etc...)
完成此操作后,我重新启动日志代理,它会按预期工作。
请注意,您可以执行类似的操作来向启动器添加
--debug
标志,这对于尝试找出它误入歧途的位置非常有帮助。
当您使用 FARGATE 配置执行 ECS 容器时,它会查找存储在容器内的凭证。但如果是 AWS ECS FARGATE 或 AWS EKS,它会从环境变量“AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”获取凭证,该变量基本上是 HTTP 端点。
请参阅下面的 AWS DOC 容器凭证提供者