Aller au contenu principal

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 condition
  • Condition: sur une ressource : Création conditionnelle
  • AWS::NoValue : Supprime une propriété

← Paramètres | Outputs et Exports →