目次
はじめに
こんにちは、ディーネットの牛山です。
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 とサードパーティーのサービスにアクセスするための統一された API である AWS クラウドコントロール API | Amazon Web Services ブログ
2021 年 9 月 30 日、AWS クラウドコントロール API のリリースをお知らせします。AWS クラウドコントロール API は、デベロッパーが AWS およびサードパーティーのサービスを簡単に管理できるようにするために設計された、一般的なアプリケーションプログラムインターフェイス (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が呼び出し元として記録されるので注意です。

プロフィール
AWSの設計・構築をメインにおこなっています。
運用・保守をおこなう部署におりましたが、最近、アーキテクト課に異動しました。
日々精進しております。
LINK
クラウドベリージャム:プロフィールページ