S3 汎用バケット ABAC の有効化前後でタグ操作コマンドが変わることを確認してみた

S3 汎用バケット ABAC の有効化前後でタグ操作コマンドが変わることを確認してみた

S3汎用バケットでABACを有効化すると、バケットタグ操作に使うコマンドが変わることを検証しました。 ABAC有効化前後でのコマンド変更と、必要な権限について確認した内容をまとめています。
2026.06.04

はじめに

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

S3 汎用バケットで ABAC を有効化すると、バケットタグをアクセス制御の条件として利用できます。

一方で、AWS 公式ドキュメントには、S3 汎用バケットで ABAC を有効化した場合、バケットタグの追加・削除に使用する API が変わることが記載されています。

ABAC を有効にすると、以前にバケットへのタグの追加やバケットからのタグの削除に使用したアクセス許可、PutBucketTagging または DeleteBucketTagging は機能しなくなります。代わりに、TagResource および UntagResource API を使用してこれらのタスクを実行します。

参考: https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html

今回は、S3 汎用バケットの ABAC について、以下を確認しました。

  • ABAC の有効化・無効化には s3:PutBucketAbac 権限が必要であること
  • ABAC 有効化前は aws s3api put-bucket-tagging / aws s3api delete-bucket-tagging が使えること
  • ABAC 有効化後は aws s3api put-bucket-tagging / aws s3api delete-bucket-tagging が使えなくなること
  • ABAC 有効化後は aws s3control tag-resource / aws s3control untag-resource を使うこと

結論

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

ABAC 状態 操作 コマンド 結果
無効 タグ追加 aws s3api put-bucket-tagging 成功
無効 タグ削除 aws s3api delete-bucket-tagging 成功
無効 ABAC 有効化 aws s3api put-bucket-abac s3:PutBucketAbac 権限なしでは失敗
無効 ABAC 有効化 aws s3api put-bucket-abac s3:PutBucketAbac 権限ありでは成功
有効 タグ追加 aws s3api put-bucket-tagging 失敗
有効 タグ削除 aws s3api delete-bucket-tagging 失敗
有効 タグ追加 aws s3control tag-resource 成功
有効 タグ削除 aws s3control untag-resource 成功
有効 ABAC 無効化 aws s3api put-bucket-abac s3:PutBucketAbac 権限なしでは失敗
有効 ABAC 無効化 aws s3api put-bucket-abac s3:PutBucketAbac 権限ありでは成功

ポイントは、ABAC 有効化後はタグ操作に使うコマンドが変わることです。

ABAC 無効時:
  aws s3api put-bucket-tagging
  aws s3api delete-bucket-tagging

ABAC 有効時:
  aws s3control tag-resource
  aws s3control untag-resource

検証環境

ロール 用途
example-s3-abac-command-no-put-role s3:PutBucketAbac 権限なし
example-s3-abac-command-full-role s3:PutBucketAbac 権限あり

example-s3-abac-command-no-put-role のポリシー

s3:PutBucketAbac は付与していません。

example-s3-abac-command-no-put-role
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowS3BucketTagTestWithoutPutBucketAbac",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketAbac",
        "s3:GetBucketTagging",
        "s3:PutBucketTagging",
        "s3:TagResource",
        "s3:UntagResource",
        "s3:ListTagsForResource"
      ],
      "Resource": "arn:aws:s3:::example-s3-abac-command-bucket"
    }
  ]
}

example-s3-abac-command-full-role のポリシー

s3:PutBucketAbac を追加しました。

example-s3-abac-command-full-role
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowS3BucketAbacAndTagTest",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketAbac",
        "s3:PutBucketAbac",
        "s3:GetBucketTagging",
        "s3:PutBucketTagging",
        "s3:TagResource",
        "s3:UntagResource",
        "s3:ListTagsForResource"
      ],
      "Resource": "arn:aws:s3:::example-s3-abac-command-bucket"
    }
  ]
}

初期状態確認

まず、example-s3-abac-command-full-role に AssumeRole して、ABAC の状態を確認します。

full-role で ABAC 状態確認
aws s3api get-bucket-abac \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

{
  "AbacStatus": {
    "Status": "Disabled"
  }
}

初期状態では ABAC が無効です。

バケットタグも確認します。

full-role でバケットタグ確認
aws s3api get-bucket-tagging \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

aws: [ERROR]: An error occurred (NoSuchTagSet) when calling the GetBucketTagging operation: The TagSet does not exist

初期状態ではタグは存在しませんでした。

検証 1: ABAC 無効時のタグ操作

ABAC 無効状態で、aws s3api put-bucket-tagging を使ってタグを付与します。

ABAC 無効状態でのタグ付与
aws s3api put-bucket-tagging \
  --bucket example-s3-abac-command-bucket \
  --tagging 'TagSet=[{Key=Environment,Value=dev}]' \
  --region ap-northeast-1

タグを確認します。

タグ確認
aws s3api get-bucket-tagging \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

{
  "TagSet": [
    {
      "Key": "Environment",
      "Value": "dev"
    }
  ]
}

Environment=dev タグを付与できました。

次に、aws s3api delete-bucket-tagging でタグを削除します。

ABAC 無効状態でのタグ削除
aws s3api delete-bucket-tagging \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

削除後にタグを確認します。

タグ確認
aws s3api get-bucket-tagging \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

aws: [ERROR]: An error occurred (NoSuchTagSet) when calling the GetBucketTagging operation: The TagSet does not exist

タグが削除されました。

この結果から、ABAC 無効状態では以下のコマンドでタグ操作できることを確認できました。

aws s3api put-bucket-tagging
aws s3api delete-bucket-tagging

検証 2: ABAC 有効化の権限確認

s3:PutBucketAbac 権限なしの場合

次に、s3:PutBucketAbac 権限を持たない example-s3-abac-command-no-put-role で ABAC を有効化してみます。

ABAC 有効化(s3:PutBucketAbac権限なし)
aws s3api put-bucket-abac \
  --bucket example-s3-abac-command-bucket \
  --abac-status Status=Enabled \
  --region ap-northeast-1

実行結果です。

aws: [ERROR]: An error occurred (AccessDenied) when calling the PutBucketAbac operation: User: arn:aws:sts::123456789012:assumed-role/example-s3-abac-command-no-put-role/example-s3-abac-command-no-put-session is not authorized to perform: s3:PutBucketAbac on resource: "arn:aws:s3:::example-s3-abac-command-bucket" because no identity-based policy allows the s3:PutBucketAbac action

s3:PutBucketAbac 権限がないため、AccessDenied になりました。

ABAC 状態を確認します。

ABAC 状態確認
aws s3api get-bucket-abac \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

{
  "AbacStatus": {
    "Status": "Disabled"
  }
}

ABAC は無効のままでした。

s3:PutBucketAbac 権限ありの場合

次に、s3:PutBucketAbac 権限を持つ example-s3-abac-command-full-role で ABAC を有効化します。

ABAC 有効化(s3:PutBucketAbac権限あり)
aws s3api put-bucket-abac \
  --bucket example-s3-abac-command-bucket \
  --abac-status Status=Enabled \
  --region ap-northeast-1

ABAC 状態を確認します。

ABAC 状態確認
aws s3api get-bucket-abac \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

{
  "AbacStatus": {
    "Status": "Enabled"
  }
}

ABAC を有効化できました。

この結果から、ABAC の有効化には s3:PutBucketAbac 権限が必要であることを確認できました。

検証 3: ABAC 有効時の従来タグ操作

ABAC 有効化後に、従来の aws s3api put-bucket-tagging を実行します。

ABAC 有効状態で s3api によるタグ付与
aws s3api put-bucket-tagging \
  --bucket example-s3-abac-command-bucket \
  --tagging 'TagSet=[{Key=Environment,Value=prod}]' \
  --region ap-northeast-1

実行結果です。

aws: [ERROR]: An error occurred (BadRequest) when calling the PutBucketTagging operation: This S3 general purpose bucket has attribute-based access control (ABAC) enabled. To add tags to this bucket, initiate a TagResource request. To delete tags from this bucket, initiate an UntagResource request.

ABAC 有効化後は、aws s3api put-bucket-tagging によるタグ追加は失敗しました。

続いて、aws s3api delete-bucket-tagging も実行します。

ABAC 有効状態で s3api によるタグ削除
aws s3api delete-bucket-tagging \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

aws: [ERROR]: An error occurred (BadRequest) when calling the DeleteBucketTagging operation: This S3 general purpose bucket has attribute-based access control (ABAC) enabled. To delete tags from this bucket, initiate an UntagResource request.

ABAC 有効化後は、aws s3api delete-bucket-tagging によるタグ削除も失敗しました。

検証 4: ABAC 有効時の s3control によるタグ操作

ABAC 有効化後は、aws s3control tag-resource でタグを付与します。

ABAC 有効状態で s3control によるタグ付与
aws s3control tag-resource \
  --account-id 123456789012 \
  --resource-arn arn:aws:s3:::example-s3-abac-command-bucket \
  --tags '[{"Key":"Environment","Value":"prod"},{"Key":"ManagedBy","Value":"iac"}]' \
  --region ap-northeast-1

タグを確認します。

タグ確認
aws s3control list-tags-for-resource \
  --account-id 123456789012 \
  --resource-arn arn:aws:s3:::example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

{
  "Tags": [
    {
      "Key": "Environment",
      "Value": "prod"
    },
    {
      "Key": "ManagedBy",
      "Value": "iac"
    }
  ]
}

Environment=prodManagedBy=iac を付与できました。

次に、aws s3control untag-resourceEnvironment タグだけを削除します。

ABAC 有効状態で s3control によるタグ削除
aws s3control untag-resource \
  --account-id 123456789012 \
  --resource-arn arn:aws:s3:::example-s3-abac-command-bucket \
  --tag-keys '["Environment"]' \
  --region ap-northeast-1

削除後のタグを確認します。

タグ確認
aws s3control list-tags-for-resource \
  --account-id 123456789012 \
  --resource-arn arn:aws:s3:::example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

{
  "Tags": [
    {
      "Key": "ManagedBy",
      "Value": "iac"
    }
  ]
}

Environment タグだけが削除され、ManagedBy=iac は残りました。

この結果から、ABAC 有効化後は以下のコマンドでタグ操作できることを確認できました。

aws s3control tag-resource
aws s3control untag-resource

検証 5: ABAC 無効化の権限確認

s3:PutBucketAbac 権限なしの場合

次に、s3:PutBucketAbac 権限を持たない example-s3-abac-command-no-put-role で ABAC を無効化してみます。

ABAC 無効化(s3:PutBucketAbac権限なし)
aws s3api put-bucket-abac \
  --bucket example-s3-abac-command-bucket \
  --abac-status Status=Disabled \
  --region ap-northeast-1

実行結果です。

aws: [ERROR]: An error occurred (AccessDenied) when calling the PutBucketAbac operation: User: arn:aws:sts::123456789012:assumed-role/example-s3-abac-command-no-put-role/example-s3-abac-command-no-put-session is not authorized to perform: s3:PutBucketAbac on resource: "arn:aws:s3:::example-s3-abac-command-bucket" because no identity-based policy allows the s3:PutBucketAbac action

ABAC 有効化時と同様に、AccessDenied になりました。

ABAC 状態を確認します。

ABAC 状態確認
aws s3api get-bucket-abac \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

{
  "AbacStatus": {
    "Status": "Enabled"
  }
}

ABAC は有効のままでした。

この結果から、ABAC の無効化にも s3:PutBucketAbac 権限が必要であることを確認できました。

s3:PutBucketAbac 権限ありの場合

最後に、s3:PutBucketAbac 権限を持つ example-s3-abac-command-full-role で ABAC を無効化します。

ABAC 無効化(s3:PutBucketAbac権限あり)
aws s3api put-bucket-abac \
  --bucket example-s3-abac-command-bucket \
  --abac-status Status=Disabled \
  --region ap-northeast-1

ABAC 状態を確認します。

ABAC 状態確認
aws s3api get-bucket-abac \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

{
  "AbacStatus": {
    "Status": "Disabled"
  }
}

ABAC を無効化できました。

最後にタグ状態を確認します。

タグ確認
aws s3api get-bucket-tagging \
  --bucket example-s3-abac-command-bucket \
  --region ap-northeast-1

実行結果です。

{
  "TagSet": [
    {
      "Key": "ManagedBy",
      "Value": "iac"
    }
  ]
}

ABAC を無効化しても、既存のバケットタグ自体は残っていました。

検証結果まとめ

今回の検証結果をまとめます。

ABAC 設定変更権限

実行ロール s3:PutBucketAbac ABAC 有効化 ABAC 無効化
example-s3-abac-command-no-put-role なし 失敗 失敗
example-s3-abac-command-full-role あり 成功 成功

ABAC の有効化・無効化には、どちらも s3:PutBucketAbac 権限が必要でした。

タグ操作コマンド

ABAC 状態 タグ追加 タグ削除 結果
無効 aws s3api put-bucket-tagging aws s3api delete-bucket-tagging 成功
有効 aws s3api put-bucket-tagging aws s3api delete-bucket-tagging 失敗
有効 aws s3control tag-resource aws s3control untag-resource 成功

ABAC 有効化後は、従来の aws s3api put-bucket-tagging / aws s3api delete-bucket-tagging ではタグ操作できず、aws s3control tag-resource / aws s3control untag-resource を使う必要がありました。

おわりに

S3 汎用バケットの ABAC を有効化すると、バケットタグを認可条件として利用できるようになります。

一方で、ABAC 有効化後はタグ操作に使うコマンドが変わるため、既存の運用手順やスクリプトには注意が必要です。

今回の検証では、ABAC 有効化前後で以下のようにコマンドを使い分ける必要があること、ABAC の有効化・無効化には s3:PutBucketAbac 権限が必要であり、権限がないロールではどちらも AccessDenied になることを確認できました。

ABAC 無効時:
  aws s3api put-bucket-tagging
  aws s3api delete-bucket-tagging

ABAC 有効時:
  aws s3control tag-resource
  aws s3control untag-resource

S3 汎用バケットで ABAC を使う場合は、タグを認可条件として利用する点だけでなく、タグ操作コマンドと ABAC 設定変更権限もあわせて確認しておくのがよさそうです。

参考

この記事をシェアする

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

関連記事