我正在努力启动并运行遗留应用程序。它使用 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 版本以从不同端点加载凭据?
修补 boto2 或添加长期凭据似乎是最简单的选择,尤其是静态凭据。但是,如果您正在寻找另一种解决方法..
与 boto3 类似,旧 boto 在 ~/.aws/credentials 中查找凭证。这就是您的静态凭证所在的位置。导出环境变量不起作用,因为 ecs 容器将根据任务定义在旋转时评估它们。所以现在您需要一个脚本来:
~/.aws/credentials
从 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