[アップデート]CloudFormation、Terraform、PulumiでAWS Organizationsのタグポリシーに適合しているか事前チェックできるようになりました

[アップデート]CloudFormation、Terraform、PulumiでAWS Organizationsのタグポリシーに適合しているか事前チェックできるようになりました

2025.12.05

CloudFormation、Terraform、PulumiでAWS Organizationsのタグポリシーに適合しているかをチェックする機能がリリースされました。

この機能を利用することで、タグポリシーをIaCデプロイ前のガードレールとして利用できるようになります。

https://aws.amazon.com/jp/about-aws/whats-new/2025/11/validate-enforce-required-tags-cloudformation-terraform-pulumi/

タグポリシーとは

リソースへのタグ付けを標準化するのに役立つ機能です。

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_tag-policies.html

https://dev.classmethod.jp/articles/update-tag-policies/

具体的には、特定のタグの値に事前定義した値のみを使用するように制限できます。

例えば、タグキーEnvには値としてTestProdのみ許可するという形です。

ポリシーを編集___AWS_Organizations___Global.png

# リソース作成成功
$ aws sqs create-queue --queue-name my-queue --tags Env=Test
{
    "QueueUrl": "https://sqs.us-east-1.amazonaws.com/12345678901/my-queue"
}
# タグキーEnvにTestかProd以外の値を設定するとエラーが出て作成できない
$ aws sqs create-queue --queue-name my-queue --tags Env=hoge

An error occurred (InvalidParameterValue) when calling the CreateQueue operation: The tag policy does not allow the specified value for the following tag key: 'Env'.
~ $

この機能は特定のタグ付けを強制する機能ではないということに注意が必要です。

上記では、SQSキューに対してタグキーEnvのタグポリシーを定義していますが、タグキーEnvなしでもSQSキューを作成することができます。

# SQSキューにタグを設定しなくても作成は可能
$ aws sqs create-queue --queue-name my-queue
{
    "QueueUrl": "https://sqs.us-east-1.amazonaws.com/12345678901/my-queue"
}

IaCデプロイ前にタグポリシーに適合しているかチェックできるようになった

これまでは、IaCデプロイ前にタグポリシーに適合しているかを確認することができませんでした。

Terraformでいうとterraform planは成功(※)するけど、terraform applyでタグポリシーに不適合で失敗するといった形です。

今回のアップデートによって、terraform plan 時にタグポリシーへの適合が確認できるようになりました。

※リソース作成時にタグポリシーチェックが行われるため、実リソース作成が伴わない操作ではタグポリシーチェックが行われない

やってみた

以下を参考に、今回はTerraformで試してみます。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/tag-policy-compliance

CloudFormationやPulumiの手順は冒頭の公式ブログ内にリンクがあります。

タグポリシーの作成

Organizations管理アカウントで、以下のTerraformを実行してタグポリシーを作成します。

main.tf
data "aws_caller_identity" "current" {}

resource "aws_organizations_policy" "example" {
  name    = "tag-policy-example"
  content = <<EOF
{
  "tags": {
    "Owner": {
      "tag_key": {
        "@@assign": "Owner"
      },
      "report_required_tag_for": {
        "@@assign": [
          "logs:log-group"
        ]
      }
    }
  }
}
EOF
  type    = "TAG_POLICY"
}

resource "aws_organizations_policy_attachment" "example" {
  policy_id = aws_organizations_policy.example.id
  target_id = data.aws_caller_identity.current.account_id
}

以下のタグポリシーが作成されます。

Cursor_と_tag-policy-example___AWS_Organizations___Global.png

このタグポリシーは、CloudWatch Logs のロググループに対して「Owner」タグの設定を必須にするポリシーです。

このタグポリシーは管理アカウントに適用されます。

タグポリシーの適用

以下の記述を追加します。

provider "aws" {
  tag_policy_compliance = "error"
}

resource "aws_cloudwatch_log_group" "example" {
  name = "required-tags-demo"
}

aws providerに引数tag_policy_compliance = errorを設定することで、タグポリシーのチェックが行われます。

今回はerrorをセットしました。デフォルト値はdisableです。disableの状態では、タグポリシーのチェックは行われません。

terraform planを実行して、チェックが行われるか確認します。

terraform plan

以下のようにエラーがでて、Plan が失敗します。

Planning failed. Terraform encountered an error while generating this plan.

╷
│ Error: Missing Required Tags - An organizational tag policy requires the following tags for aws_cloudwatch_log_group: [Owner]
│
│   with aws_cloudwatch_log_group.example,
│   on main.tf line 33, in resource "aws_cloudwatch_log_group" "example":33: resource "aws_cloudwatch_log_group" "example" {

タグポリシーに適合するタグを追加します。

main.tf
resource "aws_cloudwatch_log_group" "example" {
  name = "required-tags-demo"
+  tags = {
+    Owner = "foo"
+  }
}

再度Planを実行すると、Plan が成功することを確認できました。

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_cloudwatch_log_group.example will be created
  + resource "aws_cloudwatch_log_group" "example" {
      + arn               = (known after apply)
      + id                = (known after apply)
      + log_group_class   = (known after apply)
      + name              = "required-tags-demo"
      + name_prefix       = (known after apply)
      + region            = "ap-northeast-1"
      + retention_in_days = 0
      + skip_destroy      = false
      + tags              = {
          + "Owner" = "foo"
        }
      + tags_all          = {
          + "Owner" = "foo"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

おわりに

IaCデプロイ前にタグポリシーのチェックができるようになりました。

タグポリシー単体では、特定のタグ付けを強制はできません。

これまでは、特定のタグ付けを強制したい場合は、SCPと併用する等の方法を取る必要がありました。

IaCと本機能を利用することで、テンプレート/コード解析時に統一的にタグポリシーチェックが実行されるため特定のタグ付けも強制可能です。

この記事をシェアする

FacebookHatena blogX

関連記事