如何在 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 总是在变化。

但是,如那些链接文章中所述,您可以改用 ConditionStringLikeaws: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.