boto 2.49.0 无法从实例元数据加载 ECS Fargate 任务角色凭证

问题描述 投票:0回答:1

我正在努力启动并运行遗留应用程序。它使用 Python 2.7,我已成功将其 Docker 化并使用 Fargate 部署到 ECS。

但是,旧代码使用的是 boto 2.49.0(不是 boto3),并且无法获取凭据,因为它似乎正在访问 ECS 上不存在的实例元数据端点(Fargate?)。

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
curl: (7) Couldn't connect to server

堆栈跟踪:

import boto
boto.connect_s3(debug=2)
DEBUG:boto:http://169.254.169.254/latest/meta-data/iam/security-credentials/
2024-06-17 20:51:37,294 boto [ERROR]:Caught exception reading instance data
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/boto/utils.py", line 218, in retry_url
    r = opener.open(req, timeout=timeout)
  File "/usr/lib/python2.7/urllib2.py", line 429, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 447, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1235, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1205, in do_open
    raise URLError(err)
URLError: <urlopen error [Errno 22] Invalid argument>
ERROR:boto:Caught exception reading instance data
2024-06-17 20:51:37,295 boto [ERROR]:Unable to read instance data, giving up

我确实知道 ECS 任务角色凭证可在环境变量中的 URI 处获得:

curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
{"RoleArn": ..., "AccessKeyId":...

我是否可以以某种方式将旧的 boto 库“指向”这个端点?我找不到它的任何配置。我尝试让它与

一起工作
output=$(curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | head -n 1| cut -d $' ' -f2)
export AWS_ACCESS_KEY_ID=$(jq -r .AccessKeyId <<< "$output")
export AWS_SECRET_ACCESS_KEY=$(jq -r .SecretAccessKey <<< "$output")
export AWS_SECURITY_TOKEN=$(jq -r .Token <<< "$output")

但是我正在努力思考如何刷新凭证,并且我不想将长期有效的凭证附加到我的 ECS,但可能不得不这样做,或者使用 Monkeypatch boto2。

有没有办法配置此 boto 版本以从不同端点加载凭据?

amazon-web-services python-2.7 boto
1个回答
0
投票

修补 boto2 或添加长期凭据似乎是最简单的选择,尤其是静态凭据。但是,如果您正在寻找另一种解决方法..

与 boto3 类似,旧 boto 在 ~/.aws/credentials 中查找凭证。这就是您的静态凭证所在的位置。导出环境变量不起作用,因为 ecs 容器将根据任务定义旋转时评估它们。所以现在您需要一个脚本来:

  1. 获取凭证
  2. 将它们放入
    ~/.aws/credentials
  3. 由于这些是临时凭证,因此设置一个 cron 作业来定期更新这些凭证

moto 如何创建虚假凭证中汲取灵感:

mkdir ~/.aws && touch ~/.aws/credentials && echo -e "[default]\naws_access_key_id = $AWS_ACCESS_KEY_ID\naws_secret_access_key = AWS_SECRET_ACCESS_KEY\naws_session_token = $AWS_SECURITY_TOKEN" > ~/.aws/credentials
© www.soinside.com 2019 - 2024. All rights reserved.