Fonctions Intrinsèques
Introduction
Les fonctions intrinsèques permettent d'effectuer des opérations dynamiques dans vos templates CloudFormation.
Ref
Retourne la valeur d'un paramètre ou l'ID physique d'une ressource.
Parameters:
InstanceType:
Type: String
Default: t3.micro
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
MySubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC # Référence à une ressource
CidrBlock: 10.0.1.0/24
MyInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType # Référence à un paramètre
SubnetId: !Ref MySubnet
Outputs:
VPCId:
Value: !Ref MyVPC # Retourne vpc-xxxxxxxx
StackName:
Value: !Ref AWS::StackName # Pseudo-paramètre
AccountId:
Value: !Ref AWS::AccountId # Pseudo-paramètre
Retours de !Ref par type
| Type de ressource | Retour de !Ref |
|---|---|
| AWS::EC2::VPC | ID du VPC |
| AWS::EC2::Subnet | ID du subnet |
| AWS::EC2::Instance | ID de l'instance |
| AWS::S3::Bucket | Nom du bucket |
| AWS::IAM::Role | Nom du rôle |
| AWS::Lambda::Function | Nom de la fonction |
GetAtt
Retourne un attribut spécifique d'une ressource.
Resources:
MyBucket:
Type: AWS::S3::Bucket
MyInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: ami-12345678
MyLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Type: application
Subnets:
- !Ref Subnet1
- !Ref Subnet2
Outputs:
# Bucket
BucketArn:
Value: !GetAtt MyBucket.Arn
BucketDomainName:
Value: !GetAtt MyBucket.DomainName
BucketWebsiteURL:
Value: !GetAtt MyBucket.WebsiteURL
# Instance EC2
InstancePublicIP:
Value: !GetAtt MyInstance.PublicIp
InstancePrivateIP:
Value: !GetAtt MyInstance.PrivateIp
InstanceDNS:
Value: !GetAtt MyInstance.PublicDnsName
InstanceAZ:
Value: !GetAtt MyInstance.AvailabilityZone
# Load Balancer
ALBDnsName:
Value: !GetAtt MyLoadBalancer.DNSName
ALBHostedZone:
Value: !GetAtt MyLoadBalancer.CanonicalHostedZoneID
Syntaxe
# Forme longue
Value: !GetAtt
- ResourceName
- AttributeName
# Forme courte (recommandée)
Value: !GetAtt ResourceName.AttributeName
Sub (Substitution)
Substitue des variables dans une chaîne.
Substitution simple
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub 'myapp-${AWS::Region}-${AWS::AccountId}'
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-bucket'
Substitution avec variables personnalisées
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
UserData:
Fn::Base64: !Sub
- |
#!/bin/bash
echo "Stack: ${StackName}"
echo "Region: ${Region}"
echo "Bucket: ${BucketName}"
aws s3 cp s3://${BucketName}/config.json /etc/myapp/
- StackName: !Ref AWS::StackName
Region: !Ref AWS::Region
BucketName: !Ref ConfigBucket
Variables disponibles dans Sub
# Pseudo-paramètres
${AWS::StackName} # Nom de la stack
${AWS::StackId} # ARN de la stack
${AWS::Region} # Région
${AWS::AccountId} # ID du compte
${AWS::URLSuffix} # amazonaws.com
${AWS::Partition} # aws, aws-cn, aws-us-gov
# Références à des ressources
${ResourceName} # Équivalent à !Ref ResourceName
# Attributs de ressources
${ResourceName.Attribute} # Équivalent à !GetAtt ResourceName.Attribute
Join
Concatène des valeurs avec un délimiteur.
Outputs:
# Joindre des références
SubnetList:
Value: !Join
- ','
- - !Ref Subnet1
- !Ref Subnet2
- !Ref Subnet3
# Résultat: "subnet-111,subnet-222,subnet-333"
# Joindre avec des chaînes
ConnectionString:
Value: !Join
- ''
- - 'postgresql://'
- !Ref DBUsername
- ':'
- !Ref DBPassword
- '@'
- !GetAtt Database.Endpoint.Address
- ':'
- !GetAtt Database.Endpoint.Port
- '/'
- !Ref DBName
# ARN construit
S3ObjectArn:
Value: !Join
- ''
- - 'arn:aws:s3:::'
- !Ref MyBucket
- '/*'
Split
Divise une chaîne en liste.
Parameters:
SubnetIds:
Type: String
Default: 'subnet-111,subnet-222,subnet-333'
Resources:
AutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
VPCZoneIdentifier: !Split [',', !Ref SubnetIds]
# Résultat: ['subnet-111', 'subnet-222', 'subnet-333']
# Avec ImportValue
AppInstances:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
VPCZoneIdentifier: !Split
- ','
- !ImportValue network-stack-PrivateSubnets
Select
Sélectionne un élément d'une liste par index (0-based).
Resources:
# Sélectionner la première AZ
MySubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select
- 0
- !GetAZs '' # Liste des AZs de la région
CidrBlock: 10.0.1.0/24
# Sélectionner un subnet d'une liste
MyInstance:
Type: AWS::EC2::Instance
Properties:
SubnetId: !Select
- 0
- !Split [',', !ImportValue network-stack-PrivateSubnets]
Combiner Select avec Split
Parameters:
Subnets:
Type: String
Default: 'subnet-1,subnet-2,subnet-3'
Resources:
Instance1:
Type: AWS::EC2::Instance
Properties:
SubnetId: !Select [0, !Split [',', !Ref Subnets]]
Instance2:
Type: AWS::EC2::Instance
Properties:
SubnetId: !Select [1, !Split [',', !Ref Subnets]]
GetAZs
Retourne la liste des zones de disponibilité d'une région.
Resources:
# Utiliser toutes les AZs
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [0, !GetAZs '']
CidrBlock: 10.0.1.0/24
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [1, !GetAZs '']
CidrBlock: 10.0.2.0/24
PublicSubnet3:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [2, !GetAZs '']
CidrBlock: 10.0.3.0/24
Outputs:
AvailabilityZones:
Value: !Join [',', !GetAZs '']
Cidr
Génère des blocs CIDR à partir d'un CIDR parent.
Parameters:
VPCCidr:
Type: String
Default: '10.0.0.0/16'
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VPCCidr
# Générer 4 subnets /24 à partir du VPC /16
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Select
- 0
- !Cidr [!Ref VPCCidr, 4, 8] # 10.0.0.0/24
AvailabilityZone: !Select [0, !GetAZs '']
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Select
- 1
- !Cidr [!Ref VPCCidr, 4, 8] # 10.0.1.0/24
AvailabilityZone: !Select [1, !GetAZs '']
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Select
- 2
- !Cidr [!Ref VPCCidr, 4, 8] # 10.0.2.0/24
AvailabilityZone: !Select [0, !GetAZs '']
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Select
- 3
- !Cidr [!Ref VPCCidr, 4, 8] # 10.0.3.0/24
AvailabilityZone: !Select [1, !GetAZs '']
Syntaxe Cidr
!Cidr [ipBlock, count, cidrBits]
# ipBlock: CIDR source (ex: 10.0.0.0/16)
# count: Nombre de CIDRs à générer
# cidrBits: Bits pour la partie réseau des sous-CIDRs
# Exemples:
!Cidr ['10.0.0.0/16', 4, 8] # Génère 4 x /24
!Cidr ['10.0.0.0/16', 16, 12] # Génère 16 x /28
Base64
Encode une chaîne en Base64 (utile pour UserData).
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: ami-12345678
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello from ${AWS::StackName}</h1>" > /var/www/html/index.html
# Combiner avec Sub et Join
WebServer:
Type: AWS::EC2::Instance
Properties:
UserData:
Fn::Base64: !Join
- ''
- - "#!/bin/bash\n"
- "echo 'Stack: "
- !Ref AWS::StackName
- "' > /tmp/stack-info.txt\n"
- "echo 'Region: "
- !Ref AWS::Region
- "' >> /tmp/stack-info.txt\n"
FindInMap
Récupère une valeur dans un mapping.
Mappings:
RegionConfig:
us-east-1:
AMI: ami-0ff8a91507f77f867
InstanceType: t3.micro
eu-west-1:
AMI: ami-0c55b159cbfafe1f0
InstanceType: t3.small
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: !FindInMap
- RegionConfig
- !Ref AWS::Region
- AMI
InstanceType: !FindInMap
- RegionConfig
- !Ref AWS::Region
- InstanceType
Fonctions conditionnelles
Conditions:
IsProduction: !Equals [!Ref Environment, production]
HasKeyPair: !Not [!Equals [!Ref KeyPair, '']]
IsLargeAndProd: !And
- !Condition IsProduction
- !Equals [!Ref Size, large]
NeedsBackup: !Or
- !Condition IsProduction
- !Equals [!Ref EnableBackup, 'true']
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !If
- IsProduction
- t3.large
- t3.micro
KeyName: !If
- HasKeyPair
- !Ref KeyPair
- !Ref AWS::NoValue
Tableau récapitulatif
| Fonction | Usage | Exemple |
|---|---|---|
!Ref | ID ressource/valeur param | !Ref MyVPC |
!GetAtt | Attribut d'une ressource | !GetAtt Bucket.Arn |
!Sub | Substitution de variables | !Sub '${AWS::Region}' |
!Join | Concaténer avec délimiteur | !Join [',', [a, b]] |
!Split | Diviser en liste | !Split [',', 'a,b'] |
!Select | Sélectionner par index | !Select [0, !GetAZs ''] |
!GetAZs | Liste des AZs | !GetAZs '' |
!Cidr | Générer des CIDRs | !Cidr [cidr, 4, 8] |
!Base64 | Encoder en Base64 | !Base64 script |
!FindInMap | Valeur d'un mapping | !FindInMap [Map, K1, K2] |
!If | Condition ternaire | !If [Cond, a, b] |
!ImportValue | Import cross-stack | !ImportValue name |