如何使用AssumeRole和MFA将容器推送到Lightsail

0

【以下的问题经过翻译处理】 我们正在使用角色作为访问不同环境的最佳实践。我在我的~/.aws/config中设置了角色:

[profile dev]
source_profile=default
role_arn=arn:aws:iam::987654321:role/MyRole
mfa_serial = arn:aws:iam::123456789:mfa/MyUser

这个方法很有效,当执行CLI命令时,会像预期一样提示我输入MFA代码,一切都正常。

然而,当我用Lightsail Control(lightsailctl)插件运行aws lightsail push-container-image时,出现了错误:

AssumeRoleTokenProviderNotSetError: assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.
Command '['lightsailctl', '--plugin', '--input-stdin']' returned non-zero exit status 1.

我尝试了使用另一个方法:调用“aws lightsail register-container-image”。这需要--digest标志,因此我将我的镜像构建并推送到我们的GitLab镜像注册表中:

docker build -t registry.gitlab.com/myorg/myimage:latest .
docker push registry.gitlab.com/myorg/myimage:latest

然后我使用docker images --digests获取摘要。但是当我运行aws lightsail register-container-image时,出现如下错误:

An error occurred (NotFoundException) when calling the RegisterContainerImage operation: Image with digest "sha256:7494ec375bd1948670750289069cfbb0caa7c08eaae821674ee5a54b0ee422d5" not found.

如果我尝试将其推送到AWS ECR,则会得到相同的NotFoundException

如果我尝试在登录后推送到Lightsail ECR引用,我无法连接,层会一直重新尝试连接:

PS > cat pwd.txt | docker login 585224773020.dkr.ecr.ap-southeast-2.amazonaws.com -u AWS --password-stdin
Login Succeeded
PS > docker build -t 585224773020.dkr.ecr.ap-southeast-2.amazonaws.com/myorg/myimage:latest .
[+] Building 3.3s (17/17) FINISHED
PS > docker push 585224773020.dkr.ecr.ap-southeast-2.amazonaws.com/myorg/myimage:latest      
The push refers to repository [585224773020.dkr.ecr.ap-southeast-2.amazonaws.com/myorg/myimage]
a7cb1ff97502: Retrying in 10 seconds
762b147902c0: Retrying in 10 seconds
235e04e3592a: Retrying in 10 seconds
6173b6fa63db: Retrying in 10 seconds
9a94c4a55fe4: Retrying in 10 seconds
9a3a6af98e18: Waiting
7d0ebbe3f5d2: Waiting
EOF

profile picture
专家
已提问 5 个月前32 查看次数
1 回答
0

【以下的回答经过翻译处理】 在这种情况下 mfa_serial 似乎没用。

以下是我推送镜像所采取的步骤:

  1. ~/.aws/credentials 中设置默认配置文件,以便调用 get-session-token:
[default]
aws_access_key_id=example-access-Key-for-an-IAM-user
aws_secret_access_key=example-secret-access-key-for-IAM-user

  1. ~/.aws/credentials 中设置一个配置文件以供 Lightsail 使用:
[mfa]
aws_access_key_id=<not available yet>
aws_secret_access_key=<not available yet>
aws_session_token=<not available yet>

  1. ~/.aws/config 中创建一个条目,为要使用 [mfa] 配置文件的角色设置:
[profile mfa-dev]
source_profile=mfa
role_arn=arn:aws:iam::<account_id>:role/<role>

  1. 调用 get-session-token,传入来自 MFA 设备的令牌代码:
$ aws --profile default sts get-session-token --serial-number arn:aws:iam::<account_id>:mfa/<user>  --token-code xxxxxx

  1. 这将以 JSON 格式返回凭证。将这些 JSON 值复制到**~/.aws/credentials** 中的 [mfa] 配置文件中:
[mfa]
aws_access_key_id=<value from JSON>
aws_secret_access_key=<value from JSON>
aws_session_token=<value from JSON>

  1. 将您的环境设置为使用 [mfa-dev] 配置文件(在 Powershell 中):
 $env:AWS_PROFILE = "mfa-dev"

  1. 推送镜像:
$ aws lightsail push-container-image --service-name <service> --label <label> --image <image>

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则