Fungsi syarat - AWS CloudFormation

Ini adalah Panduan Referensi AWS CloudFormation Template baru. Harap perbarui bookmark dan tautan Anda. Untuk bantuan memulai CloudFormation, lihat Panduan AWS CloudFormation Pengguna.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Fungsi syarat

Anda dapat menggunakan fungsi intrinsik, seperti Fn::If atauFn::Equals, untuk membuat dan mengkonfigurasi sumber daya tumpukan berdasarkan logika bersyarat. Kondisi ini mengevaluasi selama pembuatan tumpukan atau pembaruan. Setelah Anda menentukan semua kondisi Anda, Anda dapat mengaitkannya dengan sumber daya atau properti sumber daya di Resources dan Outputs bagian template.

Untuk skenario lanjutan, Anda dapat menggabungkan kondisi menggunakan Fn::And atau Fn::Or fungsi, atau gunakan Fn::Not untuk meniadakan nilai kondisi. Anda juga dapat membuat kondisi sarang untuk membuat logika kondisional yang lebih kompleks.

Jika Anda baru menggunakan kondisi di template Anda, kami sarankan Anda terlebih dahulu meninjau topik sintaks Ketentuan CloudFormation template di Panduan AWS CloudFormation Pengguna.

catatan

Anda harus menentukan semua kondisi di Conditions bagian templat, kecuali untuk Fn::If kondisi. Anda dapat menggunakan Fn::If kondisi dalam Metadata atribut, UpdatePolicy atribut, dan nilai properti di Outputs bagian Resources dan.

Fn::And

Menghasilkan true jika semua syarat yang ditentukan bernilai true, atau menghasilkan false jika salah satu syarat bernilai false. Fn::And bertindak sebagai operator AND. Jumlah minimum syarat yang dapat Anda sertakan adalah 2, dan maksimum adalah 10.

Pernyataan

JSON

"Fn::And": [{condition}, {...}]

YAML

Sintaks untuk nama fungsi penuh:

Fn::And: [condition]

Sintaks untuk bentuk pendek:

!And [condition]

Parameter

condition

Suatu syarat yang bernilai true atau false.

Fn::Andcontoh penggunaan

MyAndCondition berikut ini bernilai true jika nama grup keamanan yang direferensikan sama dengan sg-mysggroup dan jika SomeOtherCondition bernilai true:

JSON

"MyAndCondition": { "Fn::And": [ {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]}, {"Condition": "SomeOtherCondition"} ] }

YAML

MyAndCondition: !And - !Equals ["sg-mysggroup", !Ref ASecurityGroup] - !Condition SomeOtherCondition

Fn::Equals

Membandingkan apakah dua nilai sama. Menghasilkan true jika dua nilai tersebut sama atau false jika tidak.

Pernyataan

JSON

"Fn::Equals" : ["value_1", "value_2"]

YAML

Sintaks untuk nama fungsi penuh:

Fn::Equals: [value_1, value_2]

Sintaks untuk bentuk pendek:

!Equals [value_1, value_2]

Parameter

value

Nilai string yang ingin Anda bandingkan.

Fn::Equalscontoh penggunaan

Syarat IsProduction berikut bernilai true jika nilai untuk parameter EnvironmentType adalah sama dengan prod:

JSON

"IsProduction" : { "Fn::Equals": [ {"Ref": "EnvironmentType"}, "prod" ] }

YAML

IsProduction: !Equals [!Ref EnvironmentType, prod]

Fn::If

Mengembalikan satu nilai jika syarat yang ditentukan bernilai true dan nilai lain jika syarat yang ditentukan bernilai false. Saat ini, CloudFormation mendukung fungsi Fn::If intrinsik dalam Metadata atribut, UpdatePolicy atribut, dan nilai properti di Resources bagian dan Outputs bagian template. Anda dapat menggunakan pseudo parameter AWS::NoValue sebagai nilai kembali untuk menghapus properti yang sesuai.

Pernyataan

YAML

Sintaks untuk nama fungsi penuh:

Fn::If: [condition_name, value_if_true, value_if_false]

Sintaks untuk bentuk pendek:

!If [condition_name, value_if_true, value_if_false]

Parameter

condition_name

Sebuah referensi untuk syarat di bagian Syarat. Gunakan nama syarat untuk mereferensikannya.

value_if_true

Nilai yang akan dikembalikan jika syarat yang ditentukan bernilai true.

value_if_false

Nilai yang akan dikembalikan jika syarat yang ditentukan bernilai false.

Fn::Ifcontoh penggunaan

Memilih sumber daya secara kondisional

Contoh berikut menggunakan Fn::If fungsi dalam definisi EC2 sumber daya Amazon untuk menentukan sumber daya grup keamanan mana yang akan dikaitkan dengan instance. Jika CreateNewSecurityGroup kondisi dievaluasi ke true, CloudFormation gunakan nilai referensi NewSecurityGroup (grup keamanan yang dibuat di tempat lain dalam template) untuk menentukan properti. SecurityGroupIds Jika CreateNewSecurityGroup salah, CloudFormation gunakan nilai referensi ExistingSecurityGroupId (parameter yang mereferensikan grup keamanan yang ada).

JSON
"Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0abcdef1234567890", "InstanceType": "t3.micro", "SecurityGroupIds": { "Fn::If": [ "CreateNewSecurityGroup", [{"Ref": "NewSecurityGroup"}], [{"Ref": "ExistingSecurityGroupId"}] ] }] } } }
YAML
Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-0abcdef1234567890 InstanceType: t3.micro SecurityGroupIds: !If - CreateNewSecurityGroup - [!Ref NewSecurityGroup] - [!Ref ExistingSecurityGroupId]

Output bersyarat

Di Output bagian templat, Anda dapat menggunakan Fn::If fungsi untuk mengeluarkan informasi secara kondisional. Dalam cuplikan berikut, jika CreateNewSecurityGroup kondisi dievaluasi ke true, CloudFormation output ID grup keamanan sumber daya. NewSecurityGroup Jika kondisinya salah, CloudFormation output ID grup keamanan ExistingSecurityGroup sumber daya.

JSON
"Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroupId"} ] } } }
YAML
Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]

Nilai array bersyarat

Contoh berikut menggunakan Fn::If untuk memberikan nilai array yang berbeda secara kondisional berdasarkan kondisi. Jika MoreThan2AZs kondisi dievaluasi menjadi benar, ia menggunakan tiga subnet publik. Jika tidak, ia hanya menggunakan dua subnet publik.

JSON
"Subnets": { "Fn::If": [ "MoreThan2AZs", [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"}, {"Fn::ImportValue": "PublicSubnet03"} ], [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"} ] ] }
YAML
Subnets: Fn::If: - MoreThan2AZs - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02 - Fn::ImportValue: PublicSubnet03 - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02

Properti bersyarat dan nilai properti

Contoh berikut menggunakan parameter AWS::NoValue pseudo dalam suatu Fn::If fungsi. Kondisi ini menggunakan snapshot untuk instans Amazon RDS DB hanya jika ID snapshot disediakan. Jika UseDBSnapshot kondisi dievaluasi ke true, CloudFormation menggunakan nilai DBSnapshotName parameter untuk DBSnapshotIdentifier properti. Jika syarat bernilai salah, CloudFormation menghapus properti DBSnapshotIdentifier.

Ini juga menggunakan Fn::If fungsi di AllocatedStorage properti instans Amazon RDS DB. Jika IsProduction kondisi dievaluasi ke true, ukuran penyimpanan diatur ke100. Jika tidak, itu diatur ke20.

JSON
"MyDatabase" : { "Type" : "AWS::RDS::DBInstance", "Properties": { "DBInstanceClass": "db.t3.micro", "AllocatedStorage": { "Fn::If": [ "IsProduction", 100, 20 ] }, "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }
YAML
MyDatabase: Type: AWS::RDS::DBInstance Properties: DBInstanceClass: db.t3.micro AllocatedStorage: !If [IsProduction, 100, 20] Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]

Kebijakan pembaruan bersyarat

Cuplikan berikut menyediakan kebijakan pembaruan Auto Scaling hanya jika kondisi dievaluasi RollingUpdates ke true. Jika kondisi dievaluasi menjadi false, CloudFormation hapus kebijakan AutoScalingRollingUpdate pemutakhiran.

JSON
"UpdatePolicy": { "Fn::If": [ "RollingUpdates", { "AutoScalingRollingUpdate": { "MaxBatchSize": 2, "MinInstancesInService": 2, "PauseTime": "PT0M30S" } }, { "Ref": "AWS::NoValue" } ] }
YAML
UpdatePolicy: !If - RollingUpdates - AutoScalingRollingUpdate: MaxBatchSize: 2 MinInstancesInService: 2 PauseTime: PT0M30S - !Ref "AWS::NoValue"

Fn::Not

Menghasilkan true untuk syarat yang bernilai false atau menghasilkan false untuk syarat yang bernilai true. Fn::Not bertindak sebagai operator NOT.

Pernyataan

JSON

"Fn::Not": [{condition}]

YAML

Sintaks untuk nama fungsi penuh:

Fn::Not: [condition]

Sintaks untuk bentuk pendek:

!Not [condition]

Parameter

condition

Suatu syarat seperti Fn::Equals yang bernilai true atau false.

Fn::Notcontoh penggunaan

Syarat EnvCondition berikut bernilai true jika nilai untuk parameter EnvironmentType tidak sama dengan prod:

JSON

"MyNotCondition" : { "Fn::Not" : [{ "Fn::Equals" : [ {"Ref" : "EnvironmentType"}, "prod" ] }] }

YAML

MyNotCondition: !Not [!Equals [!Ref EnvironmentType, prod]]

Fn::Or

Menghasilkan true jika semua syarat yang ditentukan bernilai true, atau menghasilkan false jika semua syarat bernilai false. Fn::Or bertindak sebagai operator OR. Jumlah minimum syarat yang dapat Anda sertakan adalah 2, dan maksimum adalah 10.

Pernyataan

JSON

"Fn::Or": [{condition}, {...}]

YAML

Sintaks untuk nama fungsi penuh:

Fn::Or: [condition, ...]

Sintaks untuk bentuk pendek:

!Or [condition, ...]

Parameter

condition

Suatu syarat yang bernilai true atau false.

Fn::Orcontoh penggunaan

MyOrCondition berikut ini bernilai true jika nama grup keamanan yang direferensikan sama dengan sg-mysggroup atau jika SomeOtherCondition bernilai true:

JSON

"MyOrCondition" : { "Fn::Or" : [ {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]}, {"Condition" : "SomeOtherCondition"} ] }

YAML

MyOrCondition: !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]

Fungsi yang didukung

Anda dapat menggunakan fungsi berikut di syarat Fn::If:

  • Fn::Base64

  • Fn::FindInMap

  • Fn::GetAtt

  • Fn::GetAZs

  • Fn::If

  • Fn::Join

  • Fn::Select

  • Fn::Sub

  • Ref

Anda dapat menggunakan fungsi-fungsi berikut di semua fungsi syarat lainnya, seperti Fn::Equals dan Fn::Or:

  • Fn::FindInMap

  • Ref

  • Fungsi syarat lainnya

Templat sampel

Membuat sumber daya secara kondisional untuk tumpukan produksi, pengembangan, atau tes

Dalam beberapa kasus, Anda mungkin ingin membuat tumpukan yang mirip tetapi dengan tweak kecil. Misalnya, Anda mungkin memiliki templat yang Anda gunakan untuk aplikasi produksi. Anda ingin membuat tumpukan produksi yang sama agar Anda dapat menggunakannya untuk pengembangan atau pengujian. Namun, untuk pengembangan dan pengujian, Anda mungkin tidak memerlukan semua kapasitas tambahan yang disertakan dalam tumpukan tingkat produksi. Sebaliknya, Anda dapat menggunakan parameter input jenis lingkungan guna membuat sumber daya tumpukan secara kondisional yang khusus untuk produksi, pengembangan, atau pengujian, seperti yang ditunjukkan dalam contoh berikut:

Anda dapat menentukan prod, dev, atau test untuk parameter EnvType. Untuk setiap jenis lingkungan, templat menentukan jenis instans yang berbeda. Jenis instans dapat berkisar dari instans besar yang dioptimalkan dengan komputasi hingga instans kecil untuk tujuan umum. Untuk menentukan jenis instance secara kondisional, template mendefinisikan dua kondisi di Conditions bagian template:CreateProdResources, yang mengevaluasi ke true jika nilai EnvType parameter sama dengan prod danCreateDevResources, yang mengevaluasi ke true jika nilai parameter sama dengan. dev

Di properti InstanceType, templat menyimpan dua fungsi intrinsik Fn::If untuk menentukan jenis instans yang akan digunakan. Jika syarat CreateProdResources true, jenis instans adalah c5.xlarge. Jika syarat salah, syarat CreateDevResources dievaluasi. Jika syarat CreateDevResources true, jenis instans adalah t3.medium atau t3.small.

Selain jenis instans, lingkungan produksi membuat dan melampirkan EC2 volume Amazon ke instance. Sumber daya MountPoint dan NewVolume yang terkait dengan syarat CreateProdResources sehingga sumber daya dibuat hanya jika syarat bernilai true.

contoh JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "EnvType" : { "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : ["prod", "dev", "test"], "ConstraintDescription" : "must specify prod, dev, or test." } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]}, "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]} }, "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "ami-1234567890abcdef0", "InstanceType" : { "Fn::If" : [ "CreateProdResources", "c5.xlarge", {"Fn::If" : [ "CreateDevResources", "t3.medium", "t3.small" ]} ]} } }, "MountPoint" : { "Type" : "AWS::EC2::VolumeAttachment", "Condition" : "CreateProdResources", "Properties" : { "InstanceId" : { "Ref" : "EC2Instance" }, "VolumeId" : { "Ref" : "NewVolume" }, "Device" : "/dev/sdh" } }, "NewVolume" : { "Type" : "AWS::EC2::Volume", "Condition" : "CreateProdResources", "Properties" : { "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} } } } }
contoh YAML
AWSTemplateFormatVersion: "2010-09-09" Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: [prod, dev, test] ConstraintDescription: must specify prod, dev, or test. Conditions: CreateProdResources: !Equals [!Ref EnvType, prod] CreateDevResources: !Equals [!Ref EnvType, "dev"] Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 InstanceType: !If [CreateProdResources, c5.xlarge, !If [CreateDevResources, t3.medium, t3.small]] MountPoint: Type: AWS::EC2::VolumeAttachment Condition: CreateProdResources Properties: InstanceId: !Ref EC2Instance VolumeId: !Ref NewVolume Device: /dev/sdh NewVolume: Type: AWS::EC2::Volume Condition: CreateProdResources Properties: Size: 100 AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
catatan

Untuk contoh penggunaan kondisi yang lebih kompleks untuk membuat sumber daya, lihat Conditionatribut topiknya.