如何在 ECS/Fargate 容器中找到我的 IAM 主体 ARN 或用户 ID?
How do I find my IAM principal ARN, or userID, inside an ECS/Fargate container?
在 AWS 中处理 S3 存储桶策略和其他 IAM 相关策略时,您有时希望基于委托人允许或拒绝。但是,当您有一个带有任务角色的 ECS 任务时,当任务实际上是 运行.
时,您的 Principal 是什么并不明显
我为此苦苦挣扎了几个小时,AWS 文档和 google/Stack Overflow 都没有提供太多帮助,所以我想写下我的发现,以供将来像我这样的苦苦挣扎者使用。
使用get-caller-identity
当您的 ECS 容器为 运行 时,您可以调用 STS 函数 GetCallerIdentity 来检索有关您当前 IAM 详细信息的信息。
它将 return,除此之外:
- 你的 'arn',类似于
arn:aws:sts::#########:assumed-role/YourRoleName/[uuid representing the ECS container ID]
。请注意,末尾的位是动态 uuid,而不是常量,例如 ecs-tasks.amazonaws.com
- 您的“UserId”,类似于
AROA###############:[uuid representing the ECS container ID]
。
(注意:您需要在容器运行的代码中调用它,并且需要记录输出,以便您可以看到。)
(注意:这将在其他 AWS 地方工作,例如 CLI 等,为您提供您的 arn 和 UserID)
使用主体的策略
ECS 容器的 Principal
是您从 get-caller-identity
获得的 arn
值。
如果您需要在策略中指定主体,您可以尝试这样写:
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:sts::########:assumed-role/YourRoleName/*"
]
}
// statement continues...
(通配符是因为每个容器arn末尾的uuid不一样)
但是,那是行不通的。委托人可以是 "*"
,但它们不能包含通配符。 (对我来说似乎很疯狂......但显然这是真的:link, link)
这意味着您将无法通过其 arn 引用您的角色,因为尾随的 uuid 总是在变化。
但是,如那些链接文章中所述,您可以改用 Condition
、StringLike
和 aws:userid
。
(不幸的是,这些 'Conditions' 不允许您引用 Principal / arn,只能引用 UserID 和一个 few other bits of information。)
UserID 是 returned(用那个名字)来自 get-caller-identity
。
因此,政策声明最终可能如下所示:
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Condition": {
"StringLike": {
"aws:userid": "AROA##############:*"
}
}
// statement continues...
这也适用于相反的情况,您想要 DENY
除了 StringNotLike
.
在 AWS 中处理 S3 存储桶策略和其他 IAM 相关策略时,您有时希望基于委托人允许或拒绝。但是,当您有一个带有任务角色的 ECS 任务时,当任务实际上是 运行.
时,您的 Principal 是什么并不明显我为此苦苦挣扎了几个小时,AWS 文档和 google/Stack Overflow 都没有提供太多帮助,所以我想写下我的发现,以供将来像我这样的苦苦挣扎者使用。
使用get-caller-identity
当您的 ECS 容器为 运行 时,您可以调用 STS 函数 GetCallerIdentity 来检索有关您当前 IAM 详细信息的信息。
它将 return,除此之外:
- 你的 'arn',类似于
arn:aws:sts::#########:assumed-role/YourRoleName/[uuid representing the ECS container ID]
。请注意,末尾的位是动态 uuid,而不是常量,例如ecs-tasks.amazonaws.com
- 您的“UserId”,类似于
AROA###############:[uuid representing the ECS container ID]
。
(注意:您需要在容器运行的代码中调用它,并且需要记录输出,以便您可以看到。)
(注意:这将在其他 AWS 地方工作,例如 CLI 等,为您提供您的 arn 和 UserID)
使用主体的策略
ECS 容器的 Principal
是您从 get-caller-identity
获得的 arn
值。
如果您需要在策略中指定主体,您可以尝试这样写:
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:sts::########:assumed-role/YourRoleName/*"
]
}
// statement continues...
(通配符是因为每个容器arn末尾的uuid不一样)
但是,那是行不通的。委托人可以是 "*"
,但它们不能包含通配符。 (对我来说似乎很疯狂......但显然这是真的:link, link)
这意味着您将无法通过其 arn 引用您的角色,因为尾随的 uuid 总是在变化。
但是,如那些链接文章中所述,您可以改用 Condition
、StringLike
和 aws:userid
。
(不幸的是,这些 'Conditions' 不允许您引用 Principal / arn,只能引用 UserID 和一个 few other bits of information。)
UserID 是 returned(用那个名字)来自 get-caller-identity
。
因此,政策声明最终可能如下所示:
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Condition": {
"StringLike": {
"aws:userid": "AROA##############:*"
}
}
// statement continues...
这也适用于相反的情况,您想要 DENY
除了 StringNotLike
.