【小ネタ】 AWS グローバル条件コンテキストキー「aws:ResourceTag」はタグ値の大文字小文字を区別するという話

【小ネタ】 AWS グローバル条件コンテキストキー「aws:ResourceTag」はタグ値の大文字小文字を区別するという話

aws:ResourceTag はタグキーでは大文字小文字を区別せず、タグ値では区別する。
2026.01.09

はじめに

猫とアポロチョコとSystems Managerが好きな m.hayakawa です。

AWSのIAMポリシーでaws:ResourceTagに関する検証を行う機会がありました。

その際に、大文字小文字の扱いについて、とある仕様を発見したので、ブログ記事にします。

結論

{
  "Condition": {
    "StringEquals": {
      "aws:ResourceTag/Environment": "production"
    }
  }
}

上記の Condition 句の場合、下記の挙動になります。

  • タグキー部分(Environment): 大文字小文字を区別しない
  • タグ値部分(production): 大文字小文字を区別する

タグキーは大文字小文字を区別しない

このポリシーは以下のリソースタグすべてにマッチするという結果になります。

  • Environment=production
  • environment=production
  • ENVIRONMENT=production

タグ値は大文字小文字を区別する

このポリシーは以下のリソースタグのタグ値について、大文字小文字を区別します。

  • Environment=production → マッチ
  • Environment=Production → マッチしない
  • Environment=PRODUCTION → マッチしない

どうして?

AWS ドキュメントの記載によると、タグキーでは大文字と小文字は区別されないが、タグ値は大文字と小文字が区別されるとのことです。

aws:ResourceTag/tag-key - AWS グローバル条件コンテキストキー - AWS Identity and Access Management

このコンテキストキーは "aws:ResourceTag/tag-key":"tag-value" という形式です。ここで tag-key および tag-value はタグキーバリューのペアです。タグキーでは、大文字と小文字は区別されません。つまり、ポリシーの条件要素で "aws:ResourceTag/TagKey1": "Value1" で指定した場合、その条件は TagKey1 または tagkey1 という名前のリソースタグキーに一致しますが、その両方には一致しません。これらのタグキーと値のペアの値では、大文字と小文字が区別されます。したがって、ポリシーの条件要素で "aws:ResourceTag/TagKey1": "Production" を指定した場合、その条件は Production という名前のリソースタグ値に一致しますが、production や PRODUCTION には一致しません。

なお、StringEqualsは条件値の大文字・小文字を区別する条件演算子であるため、タグキーでの大文字小文字の区別はしません。

IAM JSON ポリシー要素: 条件演算子 - AWS Identity and Access Management

StringEquals 完全一致、大文字と小文字の区別あり。

注意すべきポイント(重複タグキーの問題)

AWSリソース(EC2等)では大文字小文字が異なる同名タグキーを付与することができます。

Environment=prod
environment=test
ENVIRONMENT=dev

IAMポリシーではこれらが同じキーとして扱われるため、予期しない動作の原因となります。

実際に検証してみる

検証環境の準備

AWS Systems Manager Parameter Store を使って検証します。

1. パラメータの作成

# 異なる大文字小文字のタグキーでパラメータを作成
aws ssm put-parameter \
  --name "/test/param1" \
  --value "test-value" \
  --type "String" \
  --tags "Key=Environment,Value=production"
{
    "Version": 1,
    "Tier": "Standard"
}

aws ssm put-parameter \
  --name "/test/param2" \
  --value "test-value" \
  --type "String" \
  --tags "Key=environment,Value=production"
{
    "Version": 1,
    "Tier": "Standard"
}

aws ssm put-parameter \
  --name "/test/param3" \
  --value "test-value" \
  --type "String" \
  --tags "Key=Environment,Value=Production"
{
    "Version": 1,
    "Tier": "Standard"
}

2. 検証用IAMポリシーの作成

IAM ロールに管理ポリシー:AWSCloudShellFullAccess と、下記ポリシーを付与し、スイッチロールできるようにします。(スイッチロールの仕方については省略)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ssm:GetParameter",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Environment": "production"
        }
      }
    }
  ]
}

3. 検証結果

検証用ロールにスイッチして、CloudShell 上で検証します。

# 成功パターン1 Key=Environment,Value=production
$ aws ssm get-parameter --name "/test/param1"
{
    "Parameter": {
        "Name": "/test/param1",
        "Type": "String",
        "Value": "test-value",
        "Version": 1,
        "LastModifiedDate": "2025-12-31T06:34:38.864000+00:00",
        "ARN": "arn:aws:ssm:ap-northeast-1:<AccoutID>:parameter/test/param1",
        "DataType": "text"
    }
}

# 成功パターン2 Key=environment,Value=production
$ aws ssm get-parameter --name "/test/param2"
{
    "Parameter": {
        "Name": "/test/param2",
        "Type": "String",
        "Value": "test-value",
        "Version": 1,
        "LastModifiedDate": "2025-12-31T06:34:52.187000+00:00",
        "ARN": "arn:aws:ssm:ap-northeast-1:<AccoutID>:parameter/test/param2",
        "DataType": "text"
    }
}

# 失敗パターン Key=Environment,Value=Production
$ aws ssm get-parameter --name "/test/param3"

An error occurred (AccessDeniedException) when calling the GetParameter operation: User: arn:aws:sts::<AccoutID>:assumed-role/<roleName>/<sessionName> is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:ap-northeast-1:<AccoutID>:parameter/test/param3 because no identity-based policy allows the ssm:GetParameter action

検証結果の解釈

  • param1 (Environment=production): アクセス成功
  • param2 (environment=production): アクセス成功(タグキーの大文字小文字は無視)
  • param3 (Environment=Production): アクセス失敗(タグ値の大文字小文字は区別)

この結果から、タグキーは大文字と小文字は区別されず、タグ値は大文字小文字が区別されることが分かりました。

対策

大文字小文字のみが異なるタグキーの重複を回避したい場合、下記のような Condition 句 aws:TagKeys を付与することで、タグを付与する際のタグキーを制限することができます。StringEquals はタグ値の大文字小文字を区別するため、environmentownerといったタグの付与を防ぐことができます。

{
  "Condition": {
    "ForAllValues:StringEquals": {
      "aws:TagKeys": ["Environment", "Owner"]
    }
  }
}

まとめ

  • タグキー:大文字小文字を区別しない
  • タグ値:大文字小文字を区別する
  • タグ命名規則を統一することで、予期しない問題を事前に回避することが重要

大文字小文字による制御の違いを理解して、適切なタグベースアクセス制御を実装していけたらと思います。

この記事がどなたかのお役に立ちますように。

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。

運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。

当社は様々な職種でメンバーを募集しています。

「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

FacebookHatena blogX

関連記事