Amazon Simple Storage Service

Terraform AWS プロバイダーとAWSCCプロバイダーの比較

はじめに

こんにちは、ディーネットの牛山です。

TerraformでAWSリソースをデプロイする場合、従来型AWSプロバイダー(hashicorp/aws)とAWSCCプロバイダー(hashicorp/awscc)がありますが、これらの差異と実際にawsccプロバイダーでデプロイした場合の挙動を確認してみます。

awsccはTerraform AWS クラウドコントロールプロバイダーと呼ばれ、AWS Cloud Control APIを利用してAWSリソースのライフサイクル全体を管理できるTerraformプラグインとなっています。

それでは、実際に差異をみていきましょう。

AWSクラウドコントロールAPIとは

Terraform AWS クラウドコントロールプロバイダーは、AWSから提供されるAWSクラウドコントロールAPIを使用して、デプロイを行うことができます。

APIに関する概要は次のリンクに記載がございますのでご参考ください。

従来型AWSプロバイダーとの違い

  • 2024年5月30日に一般提供を開始した新しいプロバイダー。
  • 従来型AWSプロバイダーよりも早く新しいAWSサービスをサポートします。
  • 従来型AWSプロバイダーと共存して利用可能。
  • 利用可能なCloudFormationリソース定義(スキーマ)をもとに操作するため、リソース定義の構造がCloudFormationと類似しています。

動作挙動の確認

Terraformコード例とデプロイ後のCloudTrailログを見てどこから実行されているか確認します。

Terraformコード

従来型AWSプロバイダー(hashicorp/aws)とAWSCCプロバイダー(hashicorp/awscc)を利用したS3バケット作成Terraformコードを例にして確認していきます。

コードが長いですが、着目点としてS3バケットのバージョニングやライフサイクルルールの設定等が、AWSCCプロバイダーでは、1つのリソース内で定義可能な点です。

バージョニングやライフサイクルルールは、従来型AWSプロバイダーで別々のリソースとして定義する必要がありましたが、1つのリソースで記載が可能になったことでまとまりがよくなりました。

# プロバイダー定義
terraform {
  required_version = "1.11.4"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.96.0"
    }
    awscc = {
      source  = "hashicorp/awscc"
      version = "~> 1.38.0"
    }
  }
}

variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "region" {
  default = "ap-northeast-1"
}

variable "aws_account_id" {}

provider "aws" {
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region     = var.region
}

provider "awscc" {
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region     = var.region
}

# AWSプロバイダー(複数リソース)
# メインのバケットリソース
resource "aws_s3_bucket" "example" {
  bucket = "my-aws-bucket-example-2025042703"
}

# バージョニング設定
resource "aws_s3_bucket_versioning" "example" {
  bucket = aws_s3_bucket.example.id
  versioning_configuration {
    status = "Enabled"
  }
}

# 暗号化設定
resource "aws_s3_bucket_server_side_encryption_configuration" "example" {
  bucket = aws_s3_bucket.example.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

# パブリックアクセスブロック
resource "aws_s3_bucket_public_access_block" "example" {
  bucket                  = aws_s3_bucket.example.id
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

# ライフサイクルルール
resource "aws_s3_bucket_lifecycle_configuration" "example" {
  bucket = aws_s3_bucket.example.id
  rule {
    id     = "archive-rule"
    status = "Enabled"
    filter {
      prefix = ""
    }
    transition {
      days          = 30
      storage_class = "STANDARD_IA"
    }
  }
}

# AWSCCプロバイダー(単一リソース)
# すべての設定を含む単一リソース
resource "awscc_s3_bucket" "example" {
  bucket_name = "my-awscc-bucket-example-2025042703"

  # バージョニング設定
  versioning_configuration = {
    status = "Enabled"
  }

  # 暗号化設定
  bucket_encryption = {
    server_side_encryption_configuration = [
      {
        server_side_encryption_by_default = {
          sse_algorithm = "AES256"
        }
      }
    ]
  }

  # パブリックアクセスブロック
  public_access_block_configuration = {
    block_public_acls       = true
    block_public_policy     = true
    ignore_public_acls      = true
    restrict_public_buckets = true
  }

  # ライフサイクルルール
  lifecycle_configuration = {
    rules = [
      {
        id     = "archive-rule"
        status = "Enabled"

        filter = {
          prefix = ""
        }

        transitions = [
          {
            transition_in_days = 30
            storage_class      = "STANDARD_IA"
          }
        ]
      }
    ]
  }
}

Cloudtrailログの確認

従来型AWSプロバイダー(hashicorp/aws)では、直接、CreateBucketが走りますが、AWSCCプロバイダー(hashicorp/awscc)では、cloudformationからCreateBucketが走っていることが分かります。

正確には、AWSCC → CreateResource(cloudcontrolapi.amazonaws.com) → cloudformation(CreateBucket)となり、cloudcontrolapiに対してCloudFormationテンプレートを実行してデプロイする挙動となるようです。

  • 従来型AWSプロバイダー(hashicorp/aws)
{
    "eventVersion": "1.11",
    "userIdentity": {
        "type": "IAMUser",
・・・
        "accessKeyId": "***",
        "userName": "***"
    },
・・・
    "eventName": "CreateBucket",
・・・
    "userAgent": "[APN/1.0 HashiCorp/1.0 Terraform/1.11.4 (+https://www.terraform.io) terraform-provider-aws/5.96.0 (+https://registry.terraform.io/providers/hashicorp/aws) aws-sdk-go-v2/1.36.3 ua/2.1 os/windows lang/go#1.23.8 md/GOOS#windows md/GOARCH#amd64 api/s3#1.79.2 m/e]",
・・・
}
  • AWSCCプロバイダー(hashicorp/awscc)
{
    "eventVersion": "1.11",
    "userIdentity": {
        "type": "IAMUser",
・・・
        "accessKeyId": "***",
        "userName": "***",
・・・
        "invokedBy": "cloudformation.amazonaws.com"
    },
・・・
    "eventSource": "s3.amazonaws.com",
    "eventName": "CreateBucket",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "cloudformation.amazonaws.com",
    "userAgent": "cloudformation.amazonaws.com",
・・・
}

まとめ

AWSCCプロバイダー(hashicorp/awscc)からCreateResource呼び出し時に、Terraformからの呼び出しが記録され、CloudFormationの実行が要求されるため、それ以降のCreateBucketなどはCloudFormationが呼び出し元として記録されるので注意です。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA