Dernière révision : mai 2026
Configurez les services AWS figurant à l'examen AIF-C01 avec Terraform simple — un bloc à la fois, chacun étant lié à un domaine de l'examen. Le même code fonctionne sur OpenTofu.
À la fin de cet atelier, vous aurez provisionné, avec Terraform simple, une configuration Amazon Bedrock fonctionnelle qui illustre quatre des cinq domaines de l'examen AIF-C01 : un espace de stockage Amazon S3 pour les entrées et sorties d'IA, un rôle AWS IAM de moindre privilège que Amazon Bedrock peut assumer pour invoquer des modèles de fondation, un garde-fou qui filtre les invites et les réponses pour la sécurité et les informations personnelles identifiables (PII), et une journalisation des invocations au niveau du compte et de la région.
Chaque ressource est configurée en Terraform simple — le même code fonctionne sans modification sur OpenTofu. Il n'y a pas de variables, pas de modules, pas d'état distant. Déposez les extraits de code qui suivent dans un seul fichier main.tf, exécutez terraform init une fois, puis terraform apply étape par étape.
>= 1.5 ou OpenTofu >= 1.6.us-east-1 car Amazon Bedrock et ses modèles de fondation les plus récents y sont déployés en premier.La plupart des ressources de cet atelier ne coûtent rien lorsqu'elles sont inactives : les rôles AWS IAM, la configuration du garde-fou, la configuration de journalisation, un bucket Amazon S3 vide et un groupe de journaux Amazon CloudWatch Logs sans événements sont tous gratuits.
Éléments de facturation que vous pourriez voir sur votre facture si vous utilisez réellement l'atelier :
Ce que nous avons volontairement omis : cet atelier ne crée pas de base de connaissances Amazon Bedrock (Knowledge Base). Les bases de connaissances nécessitent une collection OpenSearch Serverless qui facture un minimum d'environ 350 $/mois lorsqu'elle est inactive. C'est délibérément hors de portée ici — reportez-vous à la page de préparation AIF-C01 si vous souhaitez étudier les bases de connaissances de manière conceptuelle sans en provisionner une.
Avant de créer des ressources, nous devons indiquer à Terraform la version attendue et le fournisseur AWS que nous allons utiliser. Nous fixons le fournisseur AWS à ~> 5.60 car chaque ressource liée à Amazon Bedrock utilisée dans cet atelier a été introduite dans cette version, et nous déployons tout dans us-east-1 — AWS y déploie ses modèles de fondation en premier, et la plupart des questions de l'examen AIF-C01 supposent la disponibilité dans us-east-1 lorsqu'elles font référence au service le « plus récent ».
Déposez cet extrait de code dans un nouveau fichier main.tf pour commencer. Tout ce qui suit dans cet atelier se placera dans ce même fichier.
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
}Chaque service d'IA AWS que nous utiliserons dans cet atelier — Amazon Bedrock aujourd'hui, et la journalisation d'audit que nous configurerons à l'Étape 5 — lit les entrées et écrit les sorties via Amazon S3, le premier élément d'infrastructure réel est donc un bucket S3. Nous y reviendrons dans presque toutes les étapes suivantes.
Nous activons le versionnement afin qu'un chargement corrompu puisse être annulé, nous verrouillons l'accès public (il s'agit d'entrées d'entraînement et de journaux d'invocation de modèles, pas de ressources de site web), et nous activons le chiffrement AES256 au repos. Ce dernier point est important pour l'examen AIF-C01 — le domaine Security, Compliance, and Governance for AI Solutions (Sécurité, conformité et gouvernance des solutions d'IA) teste explicitement votre réflexe d'utiliser le chiffrement au repos par défaut pour tout stockage de données d'IA.
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"
}
}
}Amazon Bedrock ne peut pas invoquer un modèle de lui-même — il a besoin d'un rôle AWS IAM qu'il peut assumer. Nous en créons un avec une politique de confiance qui désigne bedrock.amazonaws.com comme seul principal autorisé, puis nous y attachons une politique de permissions minimales : appeler n'importe quel modèle de fondation, et lire/écrire uniquement dans le bucket que nous avons créé à l'Étape 2.
Les modèles de moindre privilège comme celui-ci sont un thème récurrent de l'examen AIF-C01. Notez que nous n'accordons pas l'autorisation s3:* — uniquement les deux actions sur les objets dont nous avons réellement besoin, limitées aux objets de notre bucket. L'examen valorise l'identification de cette même structure dans les scénarios à choix multiples : lorsque deux choix de réponses « fonctionnent », le plus restrictif est presque toujours le bon.
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}/*"
},
]
})
}Un modèle Amazon Bedrock répondra volontiers à tout ce que ses données d'entraînement lui permettent de répondre. Les garde-fous (Guardrails) se placent devant chaque appel de modèle et appliquent des politiques de contenu et de PII indépendamment du modèle de fondation que vous utilisez — ce qui signifie qu'un seul garde-fou couvre Claude, Llama, Titan et tout modèle futur.
Ici, nous configurons deux couches. Un filtre de contenu bloque les contenus haineux, violents ou sexuels à haute sévérité dans les invites (prompts) comme dans les réponses, et une politique d'informations sensibles bloque la fuite d'e-mails, de numéros de téléphone et de numéros de sécurité sociale américains. Ceux-ci correspondent directement au domaine de l'examen AIF-C01 Guidelines for Responsible AI (Lignes directrices pour une IA responsable) — le filtrage de contenu et la gestion des PII en étant les deux piliers désignés.
Une fois le garde-fou en place, le rôle que nous avons créé à l'Étape 3 peut invoquer un modèle et le résultat est filtré avant d'atteindre l'appelant.
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"
}
}
}La journalisation des invocations Amazon Bedrock capture l'intégralité de l'invite (prompt), de la réponse et de la charge utile d'intégration (embeddings) de chaque appel de modèle dans le compte et la région. Elle écrit dans Amazon CloudWatch Logs (pratique pour des recherches ponctuelles avec grep) et dans Amazon S3 (idéal pour la conservation à long terme) — nous configurons les deux. Le rôle que nous attachons accorde exactement les actions requises par le service Amazon Bedrock, et rien de plus.
Un piège important à connaître pour l'examen AIF-C01 : la journalisation des invocations est un singleton — une seule configuration par compte et par région. Si vous lancez cet atelier une deuxième fois dans us-east-1, Terraform signalera aucun changement mais la configuration existante sera réassociée. Détruisez les ressources avant de relancer si vous modifiez les destinations des journaux.
Une fois la journalisation configurée, chaque appel de modèle effectué avec le rôle de l'Étape 3, via le garde-fou de l'Étape 4, se retrouve archivé dans le bucket de l'Étape 2. C'est la chaîne d'audit complète — exactement le genre de scénario « apportez-moi des preuves » que l'examen s'attend à ce que vous sachiez décrire.
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/"
}
}
}Un terraform destroy standard supprime tout ce qui a été créé dans cet atelier. Deux remarques :
aws_bedrock_model_invocation_logging_configuration a une portée au niveau du compte et de la région — le détruire désactive la journalisation globalement dans us-east-1. Si une autre charge de travail repose également sur cette configuration, vous devez ignorer cette étape ou coordonner les actions.force_destroy = false) signifie que la commande destroy échouera si des objets (y compris des marqueurs de suppression) subsistent. Visez à vider le bucket via la console AWS avant de détruire les ressources, ou définissez force_destroy = true sur la ressource du bucket et appliquez de nouveau les modifications avant de tout supprimer.L'examen AIF-C01 couvre un large portefeuille d'IA AWS — Rekognition, Comprehend, Textract, Polly, Translate, Transcribe, Lex, SageMaker, Kendra, Personalize et Q. Nous ne les provisionnons délibérément pas dans ce lab.
La raison n'est pas qu'ils sont secondaires — c'est qu'une mise en pratique concrète de ces services soit ne nécessite aucune infrastructure (Textract, Comprehend, Rekognition sont de simples appels d'API sur des données S3 existantes), soit se heurte à des ressources qui n'existent pas dans le fournisseur AWS Terraform (lexiques Polly, terminologies Translate, Amazon Q), soit coûte cher lorsqu'ils sont inactifs (Bedrock Knowledge Bases, Kendra, domaines SageMaker).
Pour ces services, les sections Parcourir, Guide et Editorial de cette page de certification contiennent la couverture conceptuelle dont vous aurez besoin pour l'examen. La valeur de la pratique se trouve là où l'examen lui-même est le plus difficile à assimiler sans manipuler : le plan de contrôle Bedrock (IAM + guardrail + journalisation).