Paramètres CloudFormation
Introduction
Les paramètres permettent de personnaliser les templates à chaque déploiement sans modifier le code.
Syntaxe de base
Parameters:
ParameterName:
Type: String
Default: default-value
Description: Description du paramètre
ConstraintDescription: Message d'erreur personnalisé
AllowedValues:
- value1
- value2
AllowedPattern: pattern-regex
MinLength: 1
MaxLength: 100
MinValue: 0
MaxValue: 100
NoEcho: true
Types de paramètres
Types simples
Parameters:
# String
EnvironmentName:
Type: String
Default: development
Description: Nom de l'environnement
# Number
InstanceCount:
Type: Number
Default: 2
MinValue: 1
MaxValue: 10
Description: Nombre d'instances
# List<Number>
PortNumbers:
Type: List<Number>
Default: "80,443,8080"
Description: Liste de ports
# CommaDelimitedList
SubnetIds:
Type: CommaDelimitedList
Description: IDs des subnets séparés par virgules
Types AWS spécifiques
Parameters:
# Référence à une clé SSH existante
KeyPairName:
Type: AWS::EC2::KeyPair::KeyName
Description: Nom de la key pair EC2
# ID de VPC existant
VPCId:
Type: AWS::EC2::VPC::Id
Description: ID du VPC
# ID de subnet existant
SubnetId:
Type: AWS::EC2::Subnet::Id
Description: ID du subnet
# Liste de subnets
SubnetIds:
Type: List<AWS::EC2::Subnet::Id>
Description: Liste des subnets
# ID de Security Group
SecurityGroupId:
Type: AWS::EC2::SecurityGroup::Id
Description: ID du security group
# ID d'AMI
AMIId:
Type: AWS::EC2::Image::Id
Description: ID de l'AMI
# Zone de disponibilité
AvailabilityZone:
Type: AWS::EC2::AvailabilityZone::Name
Description: Zone de disponibilité
# Paramètre SSM
LatestAMI:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Description: AMI depuis SSM Parameter Store
Contraintes et validation
AllowedValues
Parameters:
Environment:
Type: String
AllowedValues:
- development
- staging
- production
Default: development
Description: Environnement de déploiement
InstanceType:
Type: String
AllowedValues:
- t3.micro
- t3.small
- t3.medium
- t3.large
Default: t3.micro
Description: Type d'instance EC2
AllowedPattern
Parameters:
# CIDR valide
VPCCidr:
Type: String
AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$'
ConstraintDescription: Doit être un CIDR valide (ex: 10.0.0.0/16)
Default: '10.0.0.0/16'
# Nom de bucket S3
BucketName:
Type: String
AllowedPattern: '^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$'
ConstraintDescription: 3-63 caractères, minuscules, chiffres, points et tirets
# Email
AdminEmail:
Type: String
AllowedPattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
ConstraintDescription: Doit être une adresse email valide
# Nom de domaine
DomainName:
Type: String
AllowedPattern: '^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$'
ConstraintDescription: Doit être un nom de domaine valide
Min/Max Length et Value
Parameters:
# Longueur de chaîne
DatabaseName:
Type: String
MinLength: 1
MaxLength: 64
AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
Description: Nom de la base de données
# Valeur numérique
StorageSize:
Type: Number
MinValue: 20
MaxValue: 16384
Default: 100
Description: Taille du stockage en GB
Paramètres sensibles
Parameters:
# Mot de passe masqué
DatabasePassword:
Type: String
NoEcho: true
MinLength: 8
MaxLength: 41
AllowedPattern: '[a-zA-Z0-9!@#$%^&*()_+-=]*'
Description: Mot de passe de la base de données
# Clé API
APIKey:
Type: String
NoEcho: true
Description: Clé API secrète
NoEcho
NoEcho: true masque la valeur dans la console et les logs, mais elle reste visible dans le state. Pour des secrets vraiment sensibles, utilisez AWS Secrets Manager.
Utiliser les paramètres
Référencer avec !Ref
Parameters:
InstanceType:
Type: String
Default: t3.micro
Resources:
WebServer:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType
Dans les fonctions intrinsèques
Parameters:
Environment:
Type: String
Default: dev
Resources:
Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub 'myapp-${Environment}-${AWS::AccountId}'
Tags:
- Key: Environment
Value: !Ref Environment
Interface des paramètres
Organiser l'affichage dans la console AWS :
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: "Configuration Réseau"
Parameters:
- VPCCidr
- PublicSubnetCidr
- PrivateSubnetCidr
- Label:
default: "Configuration Compute"
Parameters:
- InstanceType
- KeyPairName
- AMIId
- Label:
default: "Configuration Base de Données"
Parameters:
- DBInstanceClass
- DBName
- DBUsername
- DBPassword
- Label:
default: "Tags"
Parameters:
- Environment
- Project
- Owner
ParameterLabels:
VPCCidr:
default: "CIDR du VPC"
InstanceType:
default: "Type d'instance EC2"
DBPassword:
default: "Mot de passe DB (min 8 caractères)"
Parameters:
VPCCidr:
Type: String
Default: '10.0.0.0/16'
PublicSubnetCidr:
Type: String
Default: '10.0.1.0/24'
PrivateSubnetCidr:
Type: String
Default: '10.0.2.0/24'
InstanceType:
Type: String
Default: t3.micro
AllowedValues:
- t3.micro
- t3.small
- t3.medium
KeyPairName:
Type: AWS::EC2::KeyPair::KeyName
AMIId:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
DBInstanceClass:
Type: String
Default: db.t3.micro
DBName:
Type: String
Default: mydb
DBUsername:
Type: String
Default: admin
DBPassword:
Type: String
NoEcho: true
Environment:
Type: String
Default: development
Project:
Type: String
Owner:
Type: String
Passer les paramètres
Via CLI
# Paramètres inline
aws cloudformation create-stack \
--stack-name my-stack \
--template-body file://template.yaml \
--parameters \
ParameterKey=Environment,ParameterValue=production \
ParameterKey=InstanceType,ParameterValue=t3.medium
# Fichier de paramètres
aws cloudformation create-stack \
--stack-name my-stack \
--template-body file://template.yaml \
--parameters file://parameters.json
Fichier parameters.json
[
{
"ParameterKey": "Environment",
"ParameterValue": "production"
},
{
"ParameterKey": "InstanceType",
"ParameterValue": "t3.medium"
},
{
"ParameterKey": "DBPassword",
"ParameterValue": "MySecurePassword123!"
}
]
Utiliser les valeurs précédentes
# Garder les valeurs existantes lors d'un update
aws cloudformation update-stack \
--stack-name my-stack \
--template-body file://template.yaml \
--parameters \
ParameterKey=Environment,UsePreviousValue=true \
ParameterKey=InstanceType,ParameterValue=t3.large
Paramètres SSM
Référencer des paramètres stockés dans SSM Parameter Store :
Parameters:
# Valeur depuis SSM
DatabaseHost:
Type: AWS::SSM::Parameter::Value<String>
Default: /myapp/database/host
# Liste depuis SSM
SubnetIds:
Type: AWS::SSM::Parameter::Value<List<AWS::EC2::Subnet::Id>>
Default: /myapp/network/subnets
# AMI dynamique
LatestAMI:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAMI
# ...
Exemple complet
AWSTemplateFormatVersion: '2010-09-09'
Description: Template avec paramètres complets
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: "Environnement"
Parameters:
- Environment
- Project
- Label:
default: "Compute"
Parameters:
- InstanceType
- KeyPairName
- Label:
default: "Stockage"
Parameters:
- VolumeSize
Parameters:
Environment:
Type: String
AllowedValues:
- dev
- staging
- prod
Default: dev
Description: Environnement de déploiement
Project:
Type: String
MinLength: 1
MaxLength: 20
AllowedPattern: '[a-z0-9-]+'
Description: Nom du projet
InstanceType:
Type: String
AllowedValues:
- t3.micro
- t3.small
- t3.medium
Default: t3.micro
KeyPairName:
Type: AWS::EC2::KeyPair::KeyName
Description: Clé SSH existante
VolumeSize:
Type: Number
MinValue: 8
MaxValue: 500
Default: 20
Description: Taille du volume en GB
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType
KeyName: !Ref KeyPairName
ImageId: !Sub '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeSize: !Ref VolumeSize
VolumeType: gp3
Tags:
- Key: Name
Value: !Sub '${Project}-${Environment}'
- Key: Environment
Value: !Ref Environment
- Key: Project
Value: !Ref Project
Outputs:
InstanceId:
Value: !Ref Instance
Environment:
Value: !Ref Environment
Résumé
- Les paramètres rendent les templates réutilisables
- Utilisez les types AWS pour la validation automatique
AllowedValuesetAllowedPatterncontraignent les entréesNoEchomasque les valeurs sensiblesMetadata::Interfaceaméliore l'UX dans la console- Les paramètres SSM permettent des valeurs dynamiques