AWS IAM の aws:RequestTag は実行者のタグではない?aws:PrincipalTag との違いを SSM Parameter Store で検証してみた

AWS IAM の aws:RequestTag は実行者のタグではない?aws:PrincipalTag との違いを SSM Parameter Store で検証してみた

AWS IAM の aws:RequestTag と aws:PrincipalTag の違いについて、実際に SSM Parameter Store で検証してみました。名前から勘違いしやすい aws:RequestTag が実際には何を評価しているのか確認します。
2026.06.09

はじめに

クラウド事業本部コンサルティング部の山﨑です。

AWS IAM の条件キーには、タグに関係するものがいくつかあります。

代表的なものとして、以下があります。

条件キー 評価対象
aws:RequestTag/${TagKey} API リクエストで指定されたタグ
aws:PrincipalTag/${TagKey} IAM ロールや IAM ユーザーなど、実行主体に付与されたタグ
aws:ResourceTag/${TagKey} 対象リソースに既に付与されているタグ

今回気になったのは、以下の点です。

aws:RequestTag は「リクエストした人のタグ」を見る条件キーなのか?
それとも「API リクエストで指定したタグ」を見る条件キーなのか?

名前だけ見ると、RequestTag は「リクエストした人に付いているタグ」のようにも見えます。

私自身も、以前は実行主体である IAM ユーザーや IAM ロールに付いているタグを評価する条件キーだと思っていました。

今回は、AWS Systems Manager Parameter Store の aws ssm put-parameter を使って、aws:RequestTagaws:PrincipalTag がそれぞれ何を評価するのか検証しました。

結論

aws:RequestTag は IAM ロールに付与されたタグではなく、API リクエストで渡されたタグを評価する条件キーでした。

今回の検証結果は以下です。

検証 使用ロール 操作 ロールのタグ リクエストタグ Deny 条件 結果
検証1 requesttag-test-request-role aws ssm put-parameter Env=Test なし aws:RequestTag/EnvTest 成功
検証2 requesttag-test-request-role aws ssm put-parameter --tags Key=Env,Value=Test Env=Test Env=Test aws:RequestTag/EnvTest 失敗
検証3 requesttag-test-principal-role aws ssm put-parameter Env=Test なし aws:PrincipalTag/EnvTest 失敗

この結果から、以下が分かりました。

  • aws:RequestTag は、実行主体である IAM ロールのタグを見ない
  • aws:RequestTag は、API リクエストで渡されたタグを評価する
  • IAM ロールなど実行主体のタグを条件にしたい場合は、aws:PrincipalTag を使う

公式ドキュメントの確認

まず、IAM のタグに関する条件キーを確認します。

AWS のドキュメントでは、タグに関する条件キーとして以下が説明されています。

条件キー 用途
aws:RequestTag/tag-key リクエストで渡されるタグキー・値ペアを制御する
aws:PrincipalTag/tag-key リクエストを行うプリンシパルに付与されたタグを評価する
aws:ResourceTag/tag-key リソースに付与されたタグを評価する

また、AWS Systems Manager のサービス認可リファレンスを見ると、ssm:PutParameter は条件キーとして aws:RequestTag/${TagKey}aws:TagKeys をサポートしています。

一方で、aws:PrincipalTag/${TagKey}ssm:PutParameter のアクション行には表示されていません。

aws:PrincipalTag/${TagKey} は IAM のグローバル条件キーであり、IAM ロールにタグが付いている場合など、リクエストコンテキストに含まれる状況で評価されます。

今回は、ssm:PutParameter のアクション行に表示されている aws:RequestTag と、IAM グローバル条件キーである aws:PrincipalTag の違いを検証します。

検証構成

今回の検証では、2 つの IAM ロールを使用しました。

IAM ロール ロールタグ IAM ポリシーの Deny 条件
requesttag-test-request-role Env=Test aws:RequestTag/EnvTest の場合に Deny
requesttag-test-principal-role Env=Test aws:PrincipalTag/EnvTest の場合に Deny

両方のロールに Env=Test タグを付けています。

以降の AWS CLI コマンドは、それぞれ対象の IAM ロールを AssumeRole した状態で実行しています。

検証対象の SSM パラメータは以下です。

パラメータ名 用途
/requesttag-test/no-request-tag タグなしリクエストで作成する
/requesttag-test/with-request-tag --tags Key=Env,Value=Test 付きリクエストで作成する
/requesttag-test/principal-tag aws:PrincipalTag 検証用

事前確認: IAM ロールのタグ

まず、検証用 IAM ロールに Env=Test タグが付いていることを確認します。

aws:RequestTag検証用ロールのタグを確認
aws iam list-role-tags \
  --role-name requesttag-test-request-role

実行結果です。

{
  "Tags": [
    {
      "Key": "Env",
      "Value": "Test"
    }
  ]
}
aws:PrincipalTag検証用ロールのタグを確認
aws iam list-role-tags \
  --role-name requesttag-test-principal-role

実行結果です。

{
  "Tags": [
    {
      "Key": "Env",
      "Value": "Test"
    }
  ]
}

どちらのロールにも Env=Test タグが付いています。

検証1・2: aws:RequestTag は何を評価するのか

まず、aws:RequestTag/EnvTest の場合に ssm:PutParameter を明示的に Deny する IAM ポリシーを使用します。

IAM ポリシー

requesttag-test-request-role には、以下の IAM ポリシーを付与しています。

aws:RequestTag/EnvがTestの場合にDenyするIAMポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPutParameterForRequestTagTest",
      "Effect": "Allow",
      "Action": [
        "ssm:PutParameter",
        "ssm:AddTagsToResource"
      ],
      "Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/*"
    },
    {
      "Sid": "AllowReadForVerification",
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameter",
        "ssm:GetParameters",
        "ssm:DescribeParameters",
        "ssm:ListTagsForResource"
      ],
      "Resource": "*"
    },
    {
      "Sid": "DenyPutParameterIfRequestTagEnvTest",
      "Effect": "Deny",
      "Action": "ssm:PutParameter",
      "Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/Env": "Test"
        }
      }
    }
  ]
}

このポリシーのポイントは以下です。

  • ssm:PutParameter を許可する
  • タグ付け操作も含めて検証できるよう、ssm:AddTagsToResource も許可する
  • aws:RequestTag/EnvTest の場合は ssm:PutParameter を明示的に Deny する

検証1: IAM ロールに Env=Test タグがあっても、タグなし作成は成功するか

requesttag-test-request-role には Env=Test タグが付いています。

しかし、Deny 条件は以下です。

"aws:RequestTag/Env": "Test"

タグなしリクエストでは aws:RequestTag/Env がリクエストコンテキストに含まれないため、Test には一致しない想定です。

タグなしで SSM パラメータを作成します。

検証1 タグなしリクエストでSSMパラメータを作成
aws ssm put-parameter \
  --profile requesttag-test-request \
  --region ap-northeast-1 \
  --name /requesttag-test/no-request-tag \
  --type String \
  --value "v1"

実行結果です。

{
  "Version": 1,
  "Tier": "Standard"
}

作成に成功しました。

この結果から、IAM ロールに Env=Test タグが付いていても、aws:RequestTag/Env はそのタグを評価していないことが分かります。

ついでに、作成した /requesttag-test/no-request-tag のタグも確認しました。

タグなしで作成したパラメータのタグを確認
aws ssm list-tags-for-resource \
  --profile requesttag-test-request \
  --region ap-northeast-1 \
  --resource-type Parameter \
  --resource-id /requesttag-test/no-request-tag

実行結果です。

{
  "TagList": []
}

IAM ロールには Env=Test タグが付いていますが、作成された SSM パラメータにタグは付いていませんでした。

検証2: リクエストに Env=Test タグを指定すると失敗するか

次に、同じ requesttag-test-request-role で、--tags Key=Env,Value=Test を指定して SSM パラメータを作成します。

検証2 Env=Testタグ付きリクエストでSSMパラメータを作成
aws ssm put-parameter \
  --profile requesttag-test-request \
  --region ap-northeast-1 \
  --name /requesttag-test/with-request-tag \
  --type String \
  --value "v1" \
  --tags Key=Env,Value=Test

結果は失敗しました。

An error occurred (AccessDeniedException) when calling the PutParameter operation:
User: arn:aws:sts::123456789012:assumed-role/requesttag-test-request-role/requesttag-test-request-session
is not authorized to perform: ssm:PutParameter
on resource: arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/with-request-tag
with an explicit deny in an identity-based policy

explicit deny と表示されています。

このリクエストでは、以下のタグを指定しています。

--tags Key=Env,Value=Test

そのため、aws:RequestTag/EnvTest として評価され、明示的な Deny に一致しました。

この結果から、aws:RequestTag は IAM ロールのタグではなく、API リクエストで渡されたタグを評価していることが分かります。

検証3: IAM ロールのタグは aws:PrincipalTag で評価されるのか

次に、実行主体のタグを評価する aws:PrincipalTag を検証します。

aws:PrincipalTag/EnvTest の場合に ssm:PutParameter を Deny する IAM ポリシーを使用します。

IAM ポリシー

requesttag-test-principal-role には、以下の IAM ポリシーを付与しています。

aws:PrincipalTag/EnvがTestの場合にDenyするIAMポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPutParameterForPrincipalTagTest",
      "Effect": "Allow",
      "Action": "ssm:PutParameter",
      "Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/*"
    },
    {
      "Sid": "AllowReadForVerification",
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameter",
        "ssm:GetParameters",
        "ssm:DescribeParameters",
        "ssm:ListTagsForResource"
      ],
      "Resource": "*"
    },
    {
      "Sid": "DenyPutParameterIfPrincipalTagEnvTest",
      "Effect": "Deny",
      "Action": "ssm:PutParameter",
      "Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/Env": "Test"
        }
      }
    }
  ]
}

このポリシーのポイントは以下です。

  • ssm:PutParameter を許可する
  • aws:PrincipalTag/EnvTest の場合は ssm:PutParameter を明示的に Deny する

タグなしで SSM パラメータを作成

requesttag-test-principal-role には Env=Test タグが付いています。

Deny 条件は以下です。

"aws:PrincipalTag/Env": "Test"

この状態で、タグなしの SSM パラメータを作成します。

検証3 タグなしリクエストでSSMパラメータを作成
aws ssm put-parameter \
  --profile requesttag-test-principal \
  --region ap-northeast-1 \
  --name /requesttag-test/principal-tag \
  --type String \
  --value "v1"

結果は失敗しました。

An error occurred (AccessDeniedException) when calling the PutParameter operation:
User: arn:aws:sts::123456789012:assumed-role/requesttag-test-principal-role/requesttag-test-principal-session
is not authorized to perform: ssm:PutParameter
on resource: arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/principal-tag
with an explicit deny in an identity-based policy

このリクエストには --tags を指定していません。

それでも失敗したのは、実行主体である IAM ロールに付与された Env=Test タグが aws:PrincipalTag/Env として評価されたためです。

この結果から、IAM ロールなど実行主体のタグを条件にしたい場合は、aws:PrincipalTag を使うことが分かります。

検証結果まとめ

結果を整理します。

検証 使用ロール 操作 ロールのタグ リクエストタグ Deny 条件 結果
検証1 requesttag-test-request-role aws ssm put-parameter Env=Test なし aws:RequestTag/EnvTest 成功
検証2 requesttag-test-request-role aws ssm put-parameter --tags Key=Env,Value=Test Env=Test Env=Test aws:RequestTag/EnvTest 失敗
検証3 requesttag-test-principal-role aws ssm put-parameter Env=Test なし aws:PrincipalTag/EnvTest 失敗

図にすると以下のような関係です。

今回の検証から、以下が分かりました。

  • aws:RequestTag は IAM ロールに付与されたタグを見ない
  • aws:RequestTag は API リクエストで渡されたタグを評価する
  • aws:PrincipalTag は IAM ロールなど実行主体に付与されたタグを見る

おわりに

aws:RequestTag が何を評価する条件キーなのかを検証しました。

今回の検証から、aws:RequestTag は「リクエストした人のタグ」ではなく、API リクエストで指定されたタグを評価する条件キーであることが分かりました。

タグに関する IAM 条件キーは名前が似ていますが、RequestTagPrincipalTagResourceTag で評価対象が異なります。IAM ポリシーを書く際は、どのタグを評価したいのかを意識することが重要です。

参考

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事