Mappings et Conditions
Mappings
Les mappings sont des tables de correspondance clé-valeur statiques.
Syntaxe
Mappings:
MapName:
TopLevelKey1:
SecondLevelKey1: Value1
SecondLevelKey2: Value2
TopLevelKey2:
SecondLevelKey1: Value3
SecondLevelKey2: Value4
Cas d'usage : AMIs par région
Mappings:
RegionAMI:
us-east-1:
HVM64: ami-0ff8a91507f77f867
HVM32: ami-0a584ac55a7631c0c
us-west-1:
HVM64: ami-0bdb828fd58c52235
HVM32: ami-066ee5fd4a9ef77f1
eu-west-1:
HVM64: ami-047bb4163c506cd98
HVM32: ami-0a7c483d527806435
eu-west-2:
HVM64: ami-0c55b159cbfafe1f0
HVM32: ami-0b0d4b4f0b7f5f5e7
ap-northeast-1:
HVM64: ami-0ce107ae7af2e92b5
HVM32: ami-0f9ae750e8274075b
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !FindInMap
- RegionAMI
- !Ref AWS::Region
- HVM64
InstanceType: t3.micro
Cas d'usage : Configuration par environnement
Mappings:
EnvironmentConfig:
development:
InstanceType: t3.micro
MinSize: 1
MaxSize: 2
MultiAZ: 'false'
BackupRetention: 1
staging:
InstanceType: t3.small
MinSize: 2
MaxSize: 4
MultiAZ: 'false'
BackupRetention: 7
production:
InstanceType: t3.medium
MinSize: 2
MaxSize: 10
MultiAZ: 'true'
BackupRetention: 30
Parameters:
Environment:
Type: String
AllowedValues:
- development
- staging
- production
Default: development
Resources:
WebServerGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
MinSize: !FindInMap [EnvironmentConfig, !Ref Environment, MinSize]
MaxSize: !FindInMap [EnvironmentConfig, !Ref Environment, MaxSize]
LaunchTemplate:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateData:
InstanceType: !FindInMap [EnvironmentConfig, !Ref Environment, InstanceType]
FindInMap
# Syntaxe complète
!FindInMap
- MapName
- TopLevelKey
- SecondLevelKey
# Syntaxe courte
!FindInMap [MapName, TopLevelKey, SecondLevelKey]
# Avec références
!FindInMap [RegionAMI, !Ref 'AWS::Region', HVM64]
!FindInMap [EnvironmentConfig, !Ref Environment, InstanceType]
Conditions
Les conditions permettent de créer des ressources conditionnellement.
Définir des conditions
Conditions:
ConditionName: !Equals [value1, value2]
Fonctions de condition
Conditions:
# Equals - Égalité
IsProduction: !Equals
- !Ref Environment
- production
# Not - Négation
IsNotProduction: !Not
- !Equals [!Ref Environment, production]
# And - ET logique
IsProductionAndMultiAZ: !And
- !Equals [!Ref Environment, production]
- !Equals [!Ref EnableMultiAZ, 'true']
# Or - OU logique
IsDevOrStaging: !Or
- !Equals [!Ref Environment, development]
- !Equals [!Ref Environment, staging]
# If - Conditionnel
UseCustomAMI: !If
- HasCustomAMI
- true
- false
# Condition sur un paramètre vide
HasKeyPair: !Not
- !Equals [!Ref KeyPairName, '']
Conditions imbriquées
Conditions:
IsProduction: !Equals [!Ref Environment, production]
EnableHA: !Equals [!Ref EnableHighAvailability, 'true']
# Combiner des conditions
IsProductionWithHA: !And
- !Condition IsProduction
- !Condition EnableHA
Utiliser les conditions
Sur les ressources
Conditions:
CreateProdResources: !Equals [!Ref Environment, production]
Resources:
# Cette ressource n'est créée qu'en production
ProductionDatabase:
Type: AWS::RDS::DBInstance
Condition: CreateProdResources
Properties:
DBInstanceClass: db.r5.large
MultiAZ: true
# ...
# Version dev/staging
NonProdDatabase:
Type: AWS::RDS::DBInstance
Condition: IsNotProduction
Properties:
DBInstanceClass: db.t3.micro
MultiAZ: false
# ...
Dans les propriétés avec !If
Conditions:
IsProduction: !Equals [!Ref Environment, production]
Resources:
Database:
Type: AWS::RDS::DBInstance
Properties:
DBInstanceClass: !If
- IsProduction
- db.r5.large
- db.t3.micro
MultiAZ: !If [IsProduction, true, false]
AllocatedStorage: !If [IsProduction, 100, 20]
BackupRetentionPeriod: !If [IsProduction, 30, 1]
DeletionProtection: !If [IsProduction, true, false]
AWS::NoValue pour supprimer des propriétés
Conditions:
HasKeyPair: !Not [!Equals [!Ref KeyPairName, '']]
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: !Ref AMIId
# KeyName n'est défini que si un KeyPair est fourni
KeyName: !If
- HasKeyPair
- !Ref KeyPairName
- !Ref AWS::NoValue
Sur les outputs
Conditions:
IsProduction: !Equals [!Ref Environment, production]
Outputs:
ProductionEndpoint:
Condition: IsProduction
Description: Endpoint de production
Value: !GetAtt ProductionLoadBalancer.DNSName
Export:
Name: !Sub '${AWS::StackName}-ProdEndpoint'
Exemple complet
AWSTemplateFormatVersion: '2010-09-09'
Description: Infrastructure avec conditions et mappings
Parameters:
Environment:
Type: String
AllowedValues:
- development
- staging
- production
Default: development
EnableMonitoring:
Type: String
AllowedValues:
- 'true'
- 'false'
Default: 'true'
Mappings:
EnvironmentConfig:
development:
InstanceType: t3.micro
VolumeSize: 20
MultiAZ: false
staging:
InstanceType: t3.small
VolumeSize: 50
MultiAZ: false
production:
InstanceType: t3.large
VolumeSize: 100
MultiAZ: true
RegionAMI:
eu-west-1:
AMI: ami-0c55b159cbfafe1f0
eu-west-2:
AMI: ami-0a669382ea0feb73a
us-east-1:
AMI: ami-0ff8a91507f77f867
Conditions:
IsProduction: !Equals [!Ref Environment, production]
IsNotProduction: !Not [!Condition IsProduction]
EnableDetailedMonitoring: !And
- !Condition IsProduction
- !Equals [!Ref EnableMonitoring, 'true']
CreateAlarms: !Or
- !Condition IsProduction
- !Equals [!Ref EnableMonitoring, 'true']
Resources:
# Instance EC2
WebServer:
Type: AWS::EC2::Instance
Properties:
InstanceType: !FindInMap [EnvironmentConfig, !Ref Environment, InstanceType]
ImageId: !FindInMap [RegionAMI, !Ref 'AWS::Region', AMI]
Monitoring: !If [EnableDetailedMonitoring, true, false]
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeSize: !FindInMap [EnvironmentConfig, !Ref Environment, VolumeSize]
VolumeType: gp3
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-webserver'
- Key: Environment
Value: !Ref Environment
# Base de données production uniquement
ProductionDB:
Type: AWS::RDS::DBInstance
Condition: IsProduction
DeletionPolicy: Snapshot
Properties:
DBInstanceClass: db.r5.large
Engine: postgres
MultiAZ: true
StorageEncrypted: true
AllocatedStorage: 100
BackupRetentionPeriod: 30
DeletionProtection: true
# Base de données dev/staging
NonProductionDB:
Type: AWS::RDS::DBInstance
Condition: IsNotProduction
Properties:
DBInstanceClass: db.t3.micro
Engine: postgres
MultiAZ: false
AllocatedStorage: 20
BackupRetentionPeriod: 1
# Alarme CloudWatch conditionnelle
CPUAlarm:
Type: AWS::CloudWatch::Alarm
Condition: CreateAlarms
Properties:
AlarmName: !Sub '${AWS::StackName}-HighCPU'
MetricName: CPUUtilization
Namespace: AWS/EC2
Statistic: Average
Period: 300
EvaluationPeriods: 2
Threshold: !If [IsProduction, 70, 90]
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: InstanceId
Value: !Ref WebServer
Outputs:
InstanceId:
Description: ID de l'instance
Value: !Ref WebServer
DatabaseEndpoint:
Description: Endpoint de la base de données
Value: !If
- IsProduction
- !GetAtt ProductionDB.Endpoint.Address
- !GetAtt NonProductionDB.Endpoint.Address
MonitoringStatus:
Description: État du monitoring détaillé
Value: !If [EnableDetailedMonitoring, 'Enabled', 'Disabled']
ProductionDBArn:
Condition: IsProduction
Description: ARN de la DB production
Value: !GetAtt ProductionDB.DBInstanceArn
Bonnes pratiques
1. Nommer les conditions clairement
# ✅ Bon - Nom descriptif
Conditions:
IsProductionEnvironment: !Equals [!Ref Environment, production]
ShouldCreateBackups: !Or [!Condition IsProductionEnvironment, ...]
# ❌ Mauvais - Nom cryptique
Conditions:
C1: !Equals [!Ref Environment, production]
2. Éviter les conditions trop complexes
# ❌ Trop complexe
Conditions:
ComplexCondition: !And
- !Or
- !Equals [!Ref A, '1']
- !And
- !Equals [!Ref B, '2']
- !Not [!Equals [!Ref C, '3']]
- !Equals [!Ref D, '4']
# ✅ Décomposer
Conditions:
IsA: !Equals [!Ref A, '1']
IsBNotC: !And
- !Equals [!Ref B, '2']
- !Not [!Equals [!Ref C, '3']]
IsAOrBNotC: !Or [!Condition IsA, !Condition IsBNotC]
FinalCondition: !And [!Condition IsAOrBNotC, !Equals [!Ref D, '4']]
3. Utiliser les mappings pour les valeurs fixes
# ✅ Mappings pour données statiques
Mappings:
InstanceSizes:
small:
Type: t3.small
Memory: 2048
medium:
Type: t3.medium
Memory: 4096
# ❌ Éviter les !If imbriqués
InstanceType: !If
- IsSmall
- t3.small
- !If [IsMedium, t3.medium, t3.large]
Résumé
- Mappings : Tables statiques pour les correspondances région/config
- Conditions : Logique booléenne pour le contrôle de flux
!FindInMap: Récupère une valeur dans un mapping!If: Choisit une valeur selon une conditionCondition:sur une ressource : Création conditionnelleAWS::NoValue: Supprime une propriété