最終確認: 2026年5月
CLF-C02 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボの終わりまでに、プレーンなTerraformを使用して、最小限の現実的な最初のAWSワークロード(プライベートな暗号化されたS3バケット、最小権限のIAMロール、無料利用枠のEC2インスタンス、AWSから請求される前にメールで通知する請求アラーム)をプロビジョニングできます。すべてのリソースは、4つのCLF-C02試験ドメインのいずれかに対応しています。
すべてのリソースはプレーンなTerraformであり、OpenTofuでも変更なしで同じコードが動作します。変数、モジュール、リモートステートはありません。以下のスニペットを単一の main.tf にドロップし、一度 terraform init を実行してから、terraform apply をステップバイステップで実行してください。
>= 1.5 または OpenTofu >= 1.6。us-east-1 を使用します。このラボのすべてのリソースは、新規アカウント向けのAWS無料利用枠(サインアップから12ヶ月間)に収まります。
t3.micro インスタンス: 月750時間無料。無料利用枠外では、スタック全体を24時間365日稼働させても月額10ドル未満です。ただし、無料利用枠の期限が切れると、アイドル状態のリソースでも課金されます — 完了したら破棄してください。ステップ4で構築する請求アラームは、もし破棄を忘れても安全ネットとして機能します。
すべてのワークロードは、期待するTerraformのバージョンと使用するAWSプロバイダーをTerraformに伝えることから始まります。AWSプロバイダーは ~> 5.60 に固定し、デフォルトで us-east-1 を使用します — これはAWSで最も古いリージョンであり、請求データが一元化され、ほとんどのサービスが最初にリリースされる場所です。
これを新しい main.tf にドロップして開始してください。このラボのその後のすべての内容も同じファイルに記述します。
プロバイダー内の default_tags ブロックは、作成するすべてのタグ付け可能なリソースに同じタグをアタッチします。AWS Cost Explorer + コスト配分レポートはタグによって支出をグループ化します — 初日からこれを正しく設定することは、これまでで最も安価なコスト管理投資であり、CLF-C02の 請求と料金 ドメインに直接対応します。
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
Project = "certlabpro-clf-c02"
ManagedBy = "terraform"
Environment = "lab"
}
}
}S3は、ほぼすべてのAWSワークロードの背後にあるストレージ層であり、すべてのCLF-C02ドメインがS3を参照しています。ここでは1つのバケットを作成し、パブリックアクセスをロックダウンし(2023年以降の新しいバケットではデフォルトで有効ですが、明示的に設定する方が優れています)、AES256によるサーバーサイド暗号化を有効にします。
これら3つのリソース(バケット、パブリックアクセスブロック、暗号化)は、S3バケットに対する 最低限の責任あるデフォルト です。CLF-C02試験ではこれを 責任共有モデル として捉えています。AWSは安全なプラットフォームを提供しますが、暗号化とアクセスコントロールは我々が設定します。バケットは「顧客の責任」の一部です。
resource "aws_s3_bucket" "app_data" {
bucket_prefix = "certlabpro-clf-c02-"
}
resource "aws_s3_bucket_public_access_block" "app_data" {
bucket = aws_s3_bucket.app_data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_server_side_encryption_configuration" "app_data" {
bucket = aws_s3_bucket.app_data.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}EC2は、すべてのCLF-C02受験者が完全に知っていることが期待されるAWSサービスです。最小の無料利用枠対象インスタンスタイプ(t3.micro)を使用し、ステップ2で作成したバケットから読み取ることができるようにIAMインスタンスプロファイルを与えます — これにより、AWS認証情報をインスタンスに埋め込む必要がなくなります。これは アプリケーションからAWSへの認証 の標準的なAWSパターンであり、複数のCLF-C02問題バリアントで登場します。
data ブロックは最新のAmazon Linux 2023 AMIを動的にフェッチします — 特定のAMI IDに固定すると、AWSがイメージを廃止したときにラボが機能しなくなります。セキュリティグループはすべてのインバウンドトラフィックを拒否します。実際のワークロードではインgressルールを追加しますが、このラボではロックダウンされたインスタンスが適切なデフォルトです。
data "aws_ami" "al2023" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-kernel-6.1-x86_64"]
}
}
resource "aws_iam_role" "ec2_app" {
name = "certlabpro-clf-c02-ec2-app"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "ec2.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy" "ec2_app_s3_read" {
name = "read-app-data-bucket"
role = aws_iam_role.ec2_app.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["s3:GetObject", "s3:ListBucket"]
Resource = [aws_s3_bucket.app_data.arn, "${aws_s3_bucket.app_data.arn}/*"]
}]
})
}
resource "aws_iam_instance_profile" "ec2_app" {
name = "certlabpro-clf-c02-ec2-app"
role = aws_iam_role.ec2_app.name
}
resource "aws_security_group" "ec2_app" {
name = "certlabpro-clf-c02-ec2-app"
description = "Locked down by default; add ingress rules per workload."
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "app" {
ami = data.aws_ami.al2023.id
instance_type = "t3.micro"
iam_instance_profile = aws_iam_instance_profile.ec2_app.name
vpc_security_group_ids = [aws_security_group.ec2_app.id]
metadata_options {
http_endpoint = "enabled"
http_tokens = "required" # IMDSv2 only — required for SCS-C03 best practice
}
}CLF-C02試験は、請求、料金、サポート に試験の16%を割いています。その領域で構築できる最も具体的なものは、CloudWatch請求アラームです。AWSはアカウントレベルの推定料金をメトリクスとして公開しており、それを超えた場合に通知を受けたいしきい値を設定します。このアラームはSNSトピックに発行され、Eメールで通知されます。
請求メトリクスのアラームは、ワークロードがどこで実行されていても us-east-1 で作成する必要があります — これがステップ1でデフォルトを us-east-1 に設定した理由です。また、アカウントコンソールで Billing → Billing preferences → Receive Billing Alerts にて、請求アラート を一度有効にする必要があります。Terraformではこれを切り替えることはできません。これはInfrastructure-as-Codeの範囲外のアカウントレベルの設定です。
terraform apply の後、AWSは email_endpoint に指定されたアドレスに確認メールを送信します — 一度 Confirm subscription をクリックすると、しきい値を超えたときに実際にアラームが届くようになります。
resource "aws_sns_topic" "billing_alerts" {
name = "certlabpro-clf-c02-billing-alerts"
}
resource "aws_sns_topic_subscription" "billing_alerts_email" {
topic_arn = aws_sns_topic.billing_alerts.arn
protocol = "email"
endpoint = "you@example.com" # replace with your real email
}
resource "aws_cloudwatch_metric_alarm" "monthly_bill_over_10" {
alarm_name = "certlabpro-clf-c02-monthly-bill-over-10-usd"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = "EstimatedCharges"
namespace = "AWS/Billing"
period = 21600 # 6 hours — billing metric is slow-moving
statistic = "Maximum"
threshold = 10
alarm_description = "Estimated monthly AWS charges exceeded $10 USD."
alarm_actions = [aws_sns_topic.billing_alerts.arn]
dimensions = {
Currency = "USD"
}
}標準的な terraform destroy コマンドは、このラボのすべてのものを破棄します。2つの注意点があります。
Project = certlabpro-clf-c02 を検索し、何も残っていないことを簡単に確認できます。CLF-C02は、RDS、Lambda、VPCの詳細、CloudFront、Route 53、ECS、EKS、Aurora、Elastic Beanstalk、AppSyncなど、幅広いサービスカタログをカバーしています。この基礎ラボでは、これらを意図的にプロビジョニングしません。
CLF-C02の目標は、詳細なサービスごとのプロビジョニングではなく、幅広い概念的理解力です。上記の4つのステップは、4つの試験ドメインそれぞれから1つのリソースに触れています — クラウドの概念(プラットフォームとストレージのプリミティブとしてのIAM + S3)、セキュリティとコンプライアンス(最小権限のIAM、保存時の暗号化、IMDSv2)、クラウドテクノロジーとサービス(標準的なコンピューティングサービスとしてのEC2)、そして 請求、料金、サポート(CloudWatch請求アラーム)。これらが試験に適切な形です。
サービスごとの詳細については、この認定資格ページの閲覧およびEditorialセクションを参照してください — そこには、CLF-C02の範囲内のすべてのサービスが1行の説明と試験ドメインへの関連付けとともに参照されています。このラボのハンズオン価値は、初日に4つの柱がどのように接続されるかを見ることにあり、200以上のすべてのAWSサービスを見て回ることではありません。