最終確認: 2026年5月
AIF-C01 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボの最後には、プレーンな Terraform を使用して、AIF-C01 試験の 5 つのドメインのうち 4 つを実証する、実際に動作する Amazon Bedrock セットアップをプロビジョニングできます。これには、AI の入力および出力用の S3 ストア、Bedrock が基盤モデルを呼び出すために引き受けることができる最小権限の IAM ロール、安全性と PII のためにプロンプトと応答をフィルタリングするガードレール、およびアカウントとリージョンレベルの呼び出しログ記録が含まれます。
すべてのリソースはプレーンな Terraform であり、同じコードが修正なしで OpenTofu でも動作します。変数、モジュール、リモート状態はありません。以降のスニペットを単一の main.tf にドロップし、terraform init を 1 回実行してから、terraform apply をステップごとに実行してください。
>= 1.5 または OpenTofu >= 1.6。us-east-1 としています。このラボのほとんどのリソースは、アイドル状態の間はコストがかかりません。IAM ロール、ガードレール設定、ログ記録設定、空の S3 バケット、およびイベントのない CloudWatch ロググループはすべて無料です。
ラボを実際に使用した場合に請求書に表示される可能性のある項目:
意図的にスキップした内容: このラボでは Bedrock のナレッジベース(Knowledge Base)を作成しません。ナレッジベースには、アイドル状態でも最低で月額約 350 ドルが請求される OpenSearch Serverless コレクションが必要です。これは意図的に本ラボの範囲外としています。プロビジョニングを行わずにナレッジベースを概念的に学習したい場合は、AIF-C01 の認定資格ページを参照してください。
リソースを作成する前に、Terraform に対して期待するバージョンと、使用する AWS プロバイダーを伝える必要があります。このラボで扱うすべての Bedrock 関連リソースがそのバージョンに導入されたため、AWS プロバイダーを ~> 5.60 に固定します。また、すべてを us-east-1 にデプロイします。AWS はまずそこに基盤モデルをロールアウトするためであり、ほとんどの AIF-C01 の問題は「最新の」サービスに言及する際に us-east-1 での利用可能性を想定しているからです。
まずはこれを新しい main.tf にドロップしてください。このラボで以降に記述する内容はすべて同じファイルに配置されます。
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
}このラボで使用するすべての AWS AI サービス(本日の Bedrock、およびステップ 5 で連携する監査ログ)は、Amazon S3 を通じて入力を読み取り、出力を書き込みます。したがって、最初の実際的なインフラストラクチャはバケットになります。これ以降のほぼすべてのステップで、このバケットを再び使用することになります。
破損したアップロードをロールバックできるようにバージョニングを有効にし、パブリックアクセスをブロックして(これらはトレーニングの入力やモデルの呼び出しログであり、ウェブサイトのアセットではありません)、保管時の AES256 暗号化を有効にします。最後の点は AIF-C01 にとって重要です。「AI ソリューションのセキュリティ、コンプライアンス、およびガバナンス」ドメインでは、AI データストアにおいてデフォルトで保管時暗号化を選択することが明示的にテストされます。
resource "aws_s3_bucket" "ai_data" {
bucket_prefix = "certlabpro-aif-c01-"
}
resource "aws_s3_bucket_public_access_block" "ai_data" {
bucket = aws_s3_bucket.ai_data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_versioning" "ai_data" {
bucket = aws_s3_bucket.ai_data.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "ai_data" {
bucket = aws_s3_bucket.ai_data.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}Bedrock は単独でモデルを呼び出すことはできません。引き受けることができる IAM ロールが必要です。bedrock.amazonaws.com を唯一の許可されたプリンシパルとして指定する信頼ポリシーを持つロールを作成し、最小限の権限ポリシーをアタッチします。任意の基盤モデルを呼び出し、ステップ 2 で作成したバケットのみの読み取り/書き込みを許可します。
このような最小特権パターンは、AIF-C01 試験で繰り返し出題されるテーマです。s3:* は付与せず、実際に必要な 2 つのオブジェクトアクションのみをバケット内のオブジェクトに限定して付与していることに注目してください。試験では、選択肢のなかで同じパターンを見つけることが重視されます。2 つの選択肢のどちらでも「機能する」場合、より権限の狭い選択肢がほぼ常に正解となります。
resource "aws_iam_role" "bedrock_caller" {
name = "certlabpro-aif-c01-bedrock-caller"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "bedrock.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy" "bedrock_caller" {
name = "bedrock-invoke"
role = aws_iam_role.bedrock_caller.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
]
Resource = "arn:aws:bedrock:*::foundation-model/*"
},
{
Effect = "Allow"
Action = [
"s3:GetObject",
"s3:PutObject",
]
Resource = "${aws_s3_bucket.ai_data.arn}/*"
},
]
})
}Bedrock モデルは、単独ではトレーニングデータが許す限り、どんな質問にも答えてしまいます。ガードレールはすべてのモデル呼び出しの前に配置され、使用する基盤モデルに関係なくコンテンツと PII ポリシーを適用します。つまり、1 つのガードレールで Claude、Llama、Titan、および将来のすべてのモデルをカバーできます。
ここでは 2 つのレイヤーを設定します。コンテンツフィルターは、プロンプトと応答の両方で高深刻度のヘイト、暴力、性的コンテンツをブロックし、機密情報ポリシーは、E メール、電話番号、米国の社会保障番号の漏洩をブロックします。これらは、AIF-C01 の「責任ある AI のガイドライン」ドメインに直接マッピングされます。コンテンツフィルタリングと PII の処理は、このドメインの 2 つの柱です。
ガードレールが設定されると、ステップ 3 で構築したロールがモデルを呼び出し、その結果は呼び出し元に届く前にフィルタリングされます。
resource "aws_bedrock_guardrail" "safety" {
name = "certlabpro-aif-c01-safety"
description = "Default safety rails for the lab."
blocked_input_messaging = "I can't help with that."
blocked_outputs_messaging = "I can't share that response."
content_policy_config {
filters_config {
input_strength = "HIGH"
output_strength = "HIGH"
type = "HATE"
}
filters_config {
input_strength = "HIGH"
output_strength = "HIGH"
type = "VIOLENCE"
}
filters_config {
input_strength = "HIGH"
output_strength = "HIGH"
type = "SEXUAL"
}
}
sensitive_information_policy_config {
pii_entities_config {
action = "BLOCK"
type = "EMAIL"
}
pii_entities_config {
action = "BLOCK"
type = "PHONE"
}
pii_entities_config {
action = "BLOCK"
type = "US_SOCIAL_SECURITY_NUMBER"
}
}
}Bedrock の呼び出しログ記録は、アカウントおよびリージョン内で行われたすべてのモデル呼び出しについて、プロンプト、応答、および埋め込みペイロードのすべてをキャプチャします。アドホックな検索に便利な CloudWatch Logs と、長期保存に適した S3 の両方に書き込むように設定します。アタッチするロールは、Bedrock サービスが必要とするアクションのみを正確に許可し、それ以外は許可しません。
AIF-C01 に関連する注意点として知っておくべきこと:呼び出しログ記録はシングルトンであり、アカウントごと、リージョンごとに 1 つの設定しか存在できません。このラボを us-east-1 で 2 回目に実行した場合、Terraform は変更なしと報告しますが、既存の設定が再バインドされます。ログの出力先を変更する場合は、再実行する前に削除してください。
ログ記録を有効にすると、ステップ 3 のロールに対して行い、ステップ 4 のガードレールを通過したすべてのモデル呼び出しが、ステップ 2 のバケットにアーカイブされます。これが完全な監査チェーンであり、まさに試験で説明が求められる「証拠の提示」に関するシナリオそのものです。
resource "aws_iam_role" "bedrock_logging" {
name = "certlabpro-aif-c01-bedrock-logging"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "bedrock.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_cloudwatch_log_group" "bedrock_invocations" {
name = "/aws/bedrock/invocations"
retention_in_days = 30
}
resource "aws_iam_role_policy" "bedrock_logging" {
name = "write-logs-and-s3"
role = aws_iam_role.bedrock_logging.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"logs:CreateLogStream",
"logs:PutLogEvents",
]
Resource = aws_cloudwatch_log_group.bedrock_invocations.arn
},
{
Effect = "Allow"
Action = "s3:PutObject"
Resource = "${aws_s3_bucket.ai_data.arn}/bedrock-invocations/*"
},
]
})
}
resource "aws_bedrock_model_invocation_logging_configuration" "this" {
logging_config {
embedding_data_delivery_enabled = true
image_data_delivery_enabled = true
text_data_delivery_enabled = true
cloudwatch_config {
log_group_name = aws_cloudwatch_log_group.bedrock_invocations.name
role_arn = aws_iam_role.bedrock_logging.arn
}
s3_config {
bucket_name = aws_s3_bucket.ai_data.bucket
key_prefix = "bedrock-invocations/"
}
}
}標準的な terraform destroy を実行すると、このラボのすべてが削除されます。2 点の注意事項があります。
aws_bedrock_model_invocation_logging_configuration はアカウントおよびリージョン単位で適用されます。これを削除すると、us-east-1 内でグローバルにログ記録が無効化されます。他のワークロードもこの設定に依存している場合は、このステップをスキップするか、調整を行ってください。force_destroy = false では、オブジェクト(削除マーカーを含む)が残っていると destroy が失敗します。削除する前にコンソールからバケットを空にするか、バケットリソースに force_destroy = true を設定して再適用してから削除を行ってください。AIF-C01試験は、Rekognition、Comprehend、Textract、Polly、Translate、Transcribe、Lex、SageMaker、Kendra、Personalize、およびQを含む幅広いAWS AIポートフォリオをカバーしています。このラボでは、これらを意図的にプロビジョニングしていません。
その理由は、これらが重要ではないからではなく、これらのサービスに対する有意義な実機演習には、インフラがまったく不要であるか(Textract、Comprehend、Rekognitionは既存のS3データに対する純粋なAPI呼び出しです)、Terraform AWSプロバイダーに存在しないリソースに遭遇するか(Pollyレキシコン、Translate用語集、Amazon Q)、またはアイドル状態のときに費用がかかる(Bedrockナレッジベース、Kendra、SageMakerドメイン)ためです。
これらのサービスについては、この認証ページの閲覧、プレイブック、およびEditorialセクションに、試験に必要な概念のカバー範囲が記載されています。実機の価値は、実際に手を動かさなければ理解するのが最も難しい部分、すなわちBedrockのIAM + ガードレール + ログ記録のコントロールプレーンにあります。