

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

# Bekerja dengan CloudFormation template
<a name="template-guide"></a>

 AWS CloudFormation Template mendefinisikan AWS sumber daya yang ingin Anda buat, perbarui, atau hapus sebagai bagian dari tumpukan. Ini terdiri dari beberapa bagian, tetapi satu-satunya bagian yang diperlukan adalah [Resources](resources-section-structure.md) bagian, yang harus menyatakan setidaknya satu sumber daya. 

Anda dapat membuat template menggunakan metode berikut:
+ **AWS Infrastructure Composer**- Antarmuka visual untuk merancang template.
+ **Editor Teks** - Tulis template langsung dalam sintaks JSON atau YAMAL.
+ **Generator IAC** — Hasilkan templat dari sumber daya yang disediakan di akun Anda yang saat ini tidak dikelola oleh. CloudFormation Generator IAC bekerja dengan berbagai jenis sumber daya yang didukung oleh Cloud Control API di Wilayah Anda.

Bagian ini memberikan panduan komprehensif tentang cara menggunakan bagian yang berbeda dari CloudFormation template dan cara mulai membuat template tumpukan. Ini mencakup topik-topik berikut:

**Topics**
+ [Tempat template disimpan](#where-they-get-stored)
+ [Memvalidasi template](#template-validation)
+ [Memulai dengan template](#getting-started)
+ [Sampel template](#sample-templates)
+ [Format templat](template-formats.md)
+ [Bagian templat](template-anatomy.md)
+ [Komposer Infrastruktur](infrastructure-composer-for-cloudformation.md)
+ [AWS CloudFormation Server Bahasa](ide-extension.md)
+ [Generator IAc](generate-IaC.md)
+ [Dapatkan nilai yang disimpan di layanan lain](dynamic-references.md)
+ [Dapatkan AWS nilai](pseudo-parameter-reference.md)
+ [Dapatkan output tumpukan](using-cfn-stack-exports.md)
+ [Tentukan sumber daya yang ada saat runtime](cloudformation-supplied-parameter-types.md)
+ [Panduan](walkthroughs.md)
+ [Cuplikan templat](template-snippets.md)
+ [Windowstumpukan berbasis](cfn-windows-stacks.md)
+ [Gunakan jenis sumber daya yang CloudFormation disediakan](cloudformation-supplied-resource-types.md)
+ [Buat konfigurasi sumber daya yang dapat digunakan kembali dengan modul](modules.md)

## Tempat template disimpan
<a name="where-they-get-stored"></a>

**Buket Amazon S3**  
Anda dapat menyimpan CloudFormation template di ember Amazon S3. Saat membuat atau memperbarui tumpukan, Anda dapat menentukan URL S3 template alih-alih mengunggahnya secara langsung.

Jika Anda mengunggah template langsung melalui Konsol Manajemen AWS or AWS CLI, bucket S3 secara otomatis dibuat untuk Anda. Untuk informasi selengkapnya, lihat [Buat tumpukan dari CloudFormation konsol](cfn-console-create-stack.md).

**Repositori Git**  
Dengan [sinkronisasi Git](git-sync.md), Anda dapat menyimpan template dalam repositori Git. Saat membuat atau memperbarui tumpukan, Anda dapat menentukan lokasi repositori Git dan cabang yang berisi templat alih-alih mengunggahnya secara langsung atau mereferensikan URL S3. CloudFormation secara otomatis memonitor repositori dan cabang yang ditentukan untuk perubahan template. Untuk informasi selengkapnya, lihat [Buat tumpukan dari kode sumber repositori dengan sinkronisasi Git](git-sync-create-stack-from-repository-source-code.md).

## Memvalidasi template
<a name="template-validation"></a>

**Validasi sintaks**  
Anda dapat memverifikasi sintaks JSON atau YAMAL template Anda dengan menggunakan perintah [validate-template](service_code_examples.md#validate-template-sdk)CLI atau dengan menentukan template Anda di konsol. Konsol melakukan validasi secara otomatis. Untuk informasi selengkapnya, lihat [Buat tumpukan dari CloudFormation konsol](cfn-console-create-stack.md). 

Namun, metode ini hanya memverifikasi sintaks template Anda dan tidak memvalidasi nilai properti yang Anda tentukan untuk sumber daya.

**Alat validasi tambahan**  
Untuk validasi yang lebih kompleks dan pemeriksaan praktik terbaik, Anda dapat menggunakan alat tambahan seperti:
+ [CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint) [— Validasi template terhadap skema penyedia sumber daya. CloudFormation ](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html) Termasuk memeriksa nilai yang valid untuk properti sumber daya dan praktik terbaik.
+ [CloudFormation Rain (rain fmt)](https://github.com/aws-cloudformation/rain) - Format CloudFormation template Anda ke standar yang konsisten atau format ulang template dari JSON ke YAMAL (atau YAMAL ke JSON). Ini mempertahankan komentar saat menggunakan YAMAL dan mengalihkan penggunaan fungsi intrinsik ke sintaks pendek jika memungkinkan.

## Memulai dengan template
<a name="getting-started"></a>

Untuk memulai membuat CloudFormation template, ikuti langkah-langkah berikut:

1. **Pilih sumber daya** — Identifikasi AWS sumber daya yang ingin Anda sertakan dalam tumpukan Anda, seperti EC2 instans VPCs, grup keamanan, dan lainnya.

1. **Tulis template** - Tulis template dalam format JSON atau YAMAL, tentukan sumber daya dan propertinya.

1. **Simpan template** - Simpan template secara lokal dengan ekstensi file seperti:`.json`,`.yaml`, atau`.txt`.

1. **Validasi template** - Validasi template menggunakan metode yang dijelaskan di bagian. [Memvalidasi template](#template-validation)

1. **Buat tumpukan** — Buat tumpukan menggunakan template yang divalidasi. 

### Rencanakan untuk menggunakan referensi CloudFormation template
<a name="additional-resources"></a>

Saat Anda menulis templat, Anda dapat menemukan dokumentasi untuk sintaks terperinci untuk berbagai jenis sumber daya dalam [referensi jenis AWS sumber daya dan properti](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

Seringkali, templat tumpukan Anda akan memerlukan fungsi intrinsik untuk menetapkan nilai properti yang tidak tersedia hingga runtime dan atribut khusus untuk mengontrol perilaku sumber daya. Saat Anda menulis templat Anda, lihat sumber daya berikut untuk panduan:
+ [Referensi fungsi intrinsik](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html) — Beberapa fungsi intrinsik yang umum digunakan meliputi:
  + `Ref`— Mengambil nilai parameter atau ID fisik sumber daya.
  + `Sub`— Mengganti placeholder dalam string dengan nilai aktual.
  + `GetAtt`— Mengembalikan nilai atribut dari sumber daya dalam template.
  + `Join`— Bergabung dengan satu set nilai ke dalam satu string.
+ [Referensi atribut sumber daya](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html) - Beberapa atribut khusus yang umum digunakan meliputi:
  + `DependsOn`— Gunakan atribut ini untuk menentukan bahwa satu sumber daya harus dibuat setelah yang lain.
  + `DeletionPolicy`— Gunakan atribut ini untuk menentukan bagaimana CloudFormation seharusnya menangani penghapusan sumber daya.

## Sampel template
<a name="sample-templates"></a>

CloudFormation menyediakan template tumpukan sumber terbuka yang dapat Anda gunakan untuk memulai. Untuk informasi selengkapnya, lihat [CloudFormation Contoh Template](https://github.com/aws-cloudformation/aws-cloudformation-templates) di GitHub situs web.

Perlu diingat bahwa template ini tidak dimaksudkan untuk siap produksi. Anda harus meluangkan waktu untuk mempelajari cara kerjanya, menyesuaikannya dengan kebutuhan Anda, dan memastikan bahwa mereka memenuhi standar kepatuhan perusahaan Anda.

Setiap template dalam repositori ini melewati pemeriksaan [CloudFormation Linter](https://github.com/aws-cloudformation/cfn-lint) (cfn-lint), dan juga seperangkat AWS CloudFormation Guard aturan dasar berdasarkan 20 Center for Internet Security (CIS) Teratas, dengan pengecualian untuk beberapa aturan yang masuk akal untuk menjaga sampel tetap fokus pada satu kasus penggunaan.

# CloudFormation format templat
<a name="template-formats"></a>

Anda dapat membuat CloudFormation template dalam format JSON atau YAMAL. Kedua format melayani tujuan yang sama tetapi menawarkan keuntungan yang berbeda dalam hal keterbacaan dan kompleksitas.
+ **JSON** - JSON adalah format pertukaran data ringan yang mudah diurai dan dihasilkan oleh mesin. Namun, dapat menjadi rumit bagi manusia untuk membaca dan menulis, terutama untuk konfigurasi yang kompleks. Di JSON, template disusun menggunakan tanda kurung `{}` dan tanda kurung bersarang `[]` untuk menentukan sumber daya, parameter, dan komponen lainnya. Sintaksnya membutuhkan deklarasi eksplisit dari setiap elemen, yang dapat membuat template bertele-tele tetapi memastikan kepatuhan yang ketat terhadap format terstruktur. 
+ **YAMAL —** YAMAL dirancang agar lebih mudah dibaca manusia dan kurang bertele-tele daripada JSON. Ini menggunakan lekukan daripada kawat gigi dan tanda kurung untuk menunjukkan bersarang, yang dapat membuatnya lebih mudah untuk memvisualisasikan hierarki sumber daya dan parameter. YAMAL sering disukai karena kejelasan dan kemudahan penggunaannya, terutama ketika berhadapan dengan template yang lebih kompleks. Namun, ketergantungan YAMAL pada lekukan dapat menyebabkan kesalahan jika jarak tidak konsisten, yang memerlukan perhatian yang cermat untuk menjaga akurasi.

## Struktur templat
<a name="template-structure"></a>

CloudFormation template dibagi menjadi beberapa bagian yang berbeda, dan setiap bagian dirancang untuk menyimpan jenis informasi tertentu. Beberapa bagian harus dinyatakan dalam urutan tertentu, dan untuk yang lain, urutannya tidak masalah. Namun, saat Anda membangun template Anda, akan sangat membantu untuk menggunakan urutan logis yang ditunjukkan dalam contoh berikut karena nilai dalam satu bagian mungkin merujuk ke nilai dari bagian sebelumnya. 

Saat membuat template, jangan gunakan duplikat bagian utama, seperti bagian. `Resources` Meskipun CloudFormation mungkin menerima template, itu akan memiliki perilaku yang tidak terdefinisi saat memproses template, dan mungkin salah menyediakan sumber daya, atau mengembalikan kesalahan yang tidak dapat dijelaskan.

### JSON
<a name="template-structure.json"></a>

Contoh berikut menunjukkan struktur template berformat JSON dengan semua bagian yang tersedia.

```
{
  "AWSTemplateFormatVersion" : "version date",

  "Description" : "JSON string",

  "Metadata" : {
    template metadata
  },

  "Parameters" : {
    set of parameters
  },
  
  "Rules" : {
    set of rules
  },

  "Mappings" : {
    set of mappings
  },

  "Conditions" : {
    set of conditions
  },

  "Transform" : {
    set of transforms
  },

  "Resources" : {
    set of resources
  },
  
  "Outputs" : {
    set of outputs
  }
}
```

### YAML
<a name="template-structure.yaml"></a>

Contoh berikut menunjukkan struktur template yang diformat YAML dengan semua bagian yang tersedia.

```
---
AWSTemplateFormatVersion: version date

Description:
  String

Metadata:
  template metadata

Parameters:
  set of parameters

Rules:
  set of rules

Mappings:
  set of mappings

Conditions:
  set of conditions

Transform:
  set of transforms

Resources:
  set of resources

Outputs:
  set of outputs
```

## Komentar
<a name="template-comments"></a>

Dalam template berformat JSON, komentar tidak didukung. JSON, menurut desain, tidak menyertakan sintaks untuk komentar, yang berarti Anda tidak dapat menambahkan komentar secara langsung dalam struktur JSON. Namun, jika Anda perlu menyertakan catatan penjelasan atau dokumentasi, Anda dapat mempertimbangkan untuk menambahkan metadata. Untuk informasi lebih lanjut, lihat [Atribut Metadata](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).

Dalam template berformat YAML, Anda dapat menyertakan komentar sebaris dengan menggunakan simbol. `#`

Contoh berikut menunjukkan templat YAML dengan komentar sejajar.

```
AWSTemplateFormatVersion: 2010-09-09
Description: A sample CloudFormation template with YAML comments.
# Resources section
Resources:
  MyEC2Instance: 
    Type: AWS::EC2::Instance
    Properties: 
      # Linux AMI
      ImageId: ami-1234567890abcdef0 
      InstanceType: t2.micro
      KeyName: MyKey
      BlockDeviceMappings:
        - DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20
```

## Spesifikasi
<a name="template-formats.supported-specifications"></a>

CloudFormation mendukung spesifikasi JSON dan YAMAL berikut:

JSON  
CloudFormation mengikuti standar ECMA-404 JSON. Untuk informasi tentang format JSON, lihat [http://www.json.org](http://www.json.org).

YAML  
CloudFormation mendukung spesifikasi YAMAL Versi 1.1 dengan beberapa pengecualian. CloudFormation tidak mendukung fitur berikut:  
+ Tanda `binary`, `omap`, `pairs`, `set`, dan `timestamp`
+ Alias
+ Penggabungan hash
Untuk informasi lebih lanjut tentang YAML, lihat [https://yaml.org](https://yaml.org/).

## Pelajari selengkapnya
<a name="template-formats.learnmore"></a>

Untuk setiap sumber daya yang Anda tentukan dalam template, Anda menentukan properti dan nilainya menggunakan aturan sintaks tertentu dari JSON atau YAMAL. Untuk informasi lebih lanjut tentang sintaksis templat untuk setiap format, lihat [CloudFormation bagian template](template-anatomy.md).

# Menggunakan ekspresi reguler dalam CloudFormation template
<a name="cfn-regexes"></a>

[Anda dapat menggunakan ekspresi reguler (umumnya dikenal sebagai regex) di sejumlah tempat dalam CloudFormation template Anda, seperti untuk `AllowedPattern` properti saat membuat parameter template.](parameters-section-structure.md)

Semua ekspresi reguler CloudFormation sesuai dengan sintaks regex Java. [Untuk deskripsi komprehensif tentang sintaks regex Java dan konstruksinya, lihat java.util.Regex.Pattern.](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Pattern.html)

Jika Anda menulis CloudFormation template Anda dalam sintaks JSON, Anda harus menghindari karakter garis miring terbalik (\$1) dalam ekspresi reguler Anda dengan menambahkan garis miring terbalik tambahan. Ini karena JSON menafsirkan garis miring terbalik sebagai karakter pelarian, dan Anda harus menghindarinya untuk memastikan mereka diperlakukan sebagai garis miring terbalik literal dalam ekspresi reguler.

Misalnya, jika Anda menyertakan `\d` dalam ekspresi reguler Anda untuk mencocokkan karakter digit, Anda perlu menulisnya sebagai `\\d` dalam templat JSON Anda.

Dalam contoh berikut, `AllowedPattern` properti menentukan ekspresi reguler yang cocok dengan empat karakter digit berturut-turut (). `\d{4}` Namun, karena ekspresi reguler didefinisikan dalam template JSON, karakter garis miring terbalik perlu diloloskan dengan garis miring terbalik tambahan (). `\\d`

```
{
  "Parameters": {
    "MyParameter": {
      "Type": "String",
      "AllowedPattern": "\\d{4}"
    }
  }
}
```

Jika Anda menulis CloudFormation template Anda dalam sintaks YAMAL, Anda harus mengelilingi ekspresi reguler dengan tanda kutip tunggal (“). Tidak diperlukan pelarian tambahan.

```
Parameters:
  MyParameter:
    Type: String
    AllowedPattern: '\d{4}'
```

**catatan**  
Ekspresi reguler di hanya CloudFormation didukung untuk tujuan validasi dalam konteks tertentu seperti. `AllowedPattern` Mereka tidak didukung sebagai operasi pencocokan pola dalam fungsi CloudFormation intrinsik, seperti`Fn::Equals`, yang melakukan perbandingan string yang tepat saja, bukan pencocokan pola.

# CloudFormation bagian template
<a name="template-anatomy"></a>

Setiap CloudFormation template terdiri dari satu atau lebih bagian, masing-masing melayani tujuan tertentu. 

Bagian **Sumber Daya** diperlukan di setiap CloudFormation template dan membentuk inti dari template. Bagian ini menentukan sumber daya tumpukan dan propertinya, seperti EC2 instans Amazon atau bucket Amazon S3. Setiap sumber daya didefinisikan dengan ID logis, tipe, dan detail konfigurasi spesifik yang unik. 

Bagian **Parameter**, meskipun opsional, memainkan peran penting dalam membuat template lebih fleksibel. Ini memungkinkan pengguna untuk meneruskan nilai saat runtime saat membuat atau memperbarui tumpukan. Parameter ini dapat direferensikan di `Outputs` bagian `Resources` dan, memungkinkan kustomisasi tanpa mengubah template itu sendiri. Misalnya, Anda dapat menggunakan parameter untuk menentukan jenis instans atau pengaturan lingkungan yang bervariasi di antara penerapan.

Bagian **Output**, juga opsional, mendefinisikan nilai yang dikembalikan saat melihat properti tumpukan. Output memberikan informasi yang berguna seperti pengidentifikasi sumber daya atau URLs, yang dapat dimanfaatkan untuk tujuan operasional atau untuk integrasi dengan tumpukan lain. Bagian ini membantu pengguna mengambil dan menggunakan detail penting tentang sumber daya yang dibuat oleh template.

Bagian opsional lainnya termasuk **Pemetaan**, yang berfungsi seperti tabel pencarian untuk mengelola nilai bersyarat. Dengan pemetaan, Anda menentukan pasangan kunci-nilai dan menggunakannya dengan fungsi `Fn::FindInMap` intrinsik di bagian dan. `Resources` `Outputs` Ini berguna untuk skenario di mana Anda perlu menyesuaikan konfigurasi berdasarkan kondisi seperti Wilayah AWS atau lingkungan.

Bagian **Metadata** dan **Aturan**, meskipun kurang umum digunakan, menyediakan fungsionalitas tambahan. `Metadata`dapat menyertakan informasi tambahan tentang template, sementara `Rules` memvalidasi parameter atau kombinasi parameter selama pembuatan tumpukan atau pembaruan, memastikan mereka memenuhi kriteria tertentu. Bagian **Kondisi** lebih lanjut meningkatkan fleksibilitas dengan mengontrol apakah sumber daya tertentu dibuat atau properti diberi nilai berdasarkan kondisi seperti tipe lingkungan.

Terakhir, bagian **Transform** digunakan untuk menerapkan makro selama pemrosesan template. Untuk aplikasi tanpa server (juga disebut sebagai aplikasi Lambda), ini menentukan versi Model [Aplikasi AWS Tanpa Server](https://github.com/awslabs/serverless-application-specification) (SAM) yang akan digunakan.AWS Ketika Anda menentukan transformasi, Anda dapat menggunakan AWS SAM sintaks untuk mendeklarasikan sumber daya dalam template Anda. Model mendefinisikan sintaks yang dapat Anda gunakan dan bagaimana itu diproses. Anda juga dapat menggunakan `AWS::Include` transformasi untuk menyertakan cuplikan template yang disimpan secara terpisah dari template utama CloudFormation . 

Topik berikut memberikan lebih banyak informasi dan contoh untuk menggunakan setiap bagian.

**Topics**
+ [Resources](resources-section-structure.md)
+ [Parameters](parameters-section-structure.md)
+ [Outputs](outputs-section-structure.md)
+ [Mappings](mappings-section-structure.md)
+ [Metadata](metadata-section-structure.md)
+ [Rules](rules-section-structure.md)
+ [Conditions](conditions-section-structure.md)
+ [Transform](transform-section-structure.md)
+ [Versi format](format-version-structure.md)
+ [Description](template-description-structure.md)

# CloudFormation Resourcessintaks template
<a name="resources-section-structure"></a>

`Resources`Bagian ini adalah bagian tingkat atas yang diperlukan dalam CloudFormation templat. Ini mendeklarasikan AWS sumber daya yang CloudFormation ingin Anda sediakan dan konfigurasikan sebagai bagian dari tumpukan Anda.

## Sintaksis
<a name="resources-section-structure-syntax"></a>

`Resources`Bagian ini menggunakan sintaks berikut:

### JSON
<a name="resources-section-structure-syntax.json"></a>

```
"Resources" : {
    "LogicalResourceName1" : {
        "Type" : "AWS::ServiceName::ResourceType",
        "Properties" : {
            "PropertyName1" : "PropertyValue1",
            ...
        }
    },

    "LogicalResourceName2" : {
        "Type" : "AWS::ServiceName::ResourceType",
        "Properties" : {
            "PropertyName1" : "PropertyValue1",
            ...
        }
    }
}
```

### YAML
<a name="resources-section-structure-syntax.yaml"></a>

```
Resources:
  LogicalResourceName1:
    Type: AWS::ServiceName::ResourceType
    Properties:
      PropertyName1: PropertyValue1
      ...

  LogicalResourceName2:
    Type: AWS::ServiceName::ResourceType
    Properties:
      PropertyName1: PropertyValue1
      ...
```

## Logical ID (juga disebut *nama logis*)
<a name="resources-section-logical-id"></a>

Dalam CloudFormation template, sumber daya diidentifikasi dengan nama sumber daya logisnya. Nama-nama ini harus alfanumerik (A-za-Z0-9) dan unik dalam template. Nama logis digunakan untuk referensi sumber daya dari bagian lain dari template. 

## Tipe sumber daya
<a name="resources-section-resource-type"></a>

Setiap sumber daya harus memiliki `Type` atribut, yang mendefinisikan jenis AWS sumber daya itu. `Type`Atribut memiliki format`AWS::ServiceName::ResourceType`. Misalnya, `Type` atribut untuk bucket Amazon S3 adalah. `AWS::S3::Bucket` 

Untuk daftar lengkap jenis sumber daya yang didukung, lihat [referensi jenis AWS sumber daya dan properti](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

## Properti sumber daya
<a name="resources-section-resource-properties"></a>

Properti sumber daya adalah opsi tambahan yang dapat Anda tentukan untuk menentukan detail konfigurasi untuk jenis sumber daya tertentu. Beberapa properti diperlukan, sementara yang lain opsional. Beberapa properti memiliki nilai default, sehingga menentukan properti tersebut adalah opsional.

Untuk detail tentang properti yang didukung untuk setiap jenis sumber daya, lihat topik dalam [referensi tipe AWS sumber daya dan properti](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

Nilai properti dapat berupa string literal, daftar string, Boolean, referensi dinamis, referensi parameter, referensi semu, atau nilai yang dikembalikan oleh fungsi. Contoh berikut menunjukkan cara mendeklarasikan jenis nilai properti yang berbeda:

### JSON
<a name="resource-properties-example.json"></a>

```
"Properties" : {
    "String" : "A string value",
    "Number" : 123,
    "LiteralList" : [ "first-value", "second-value" ],
    "Boolean" : true
}
```

### YAML
<a name="resource-properties-example.yaml"></a>

```
Properties:
  String: A string value 
  Number: 123
  LiteralList:
    - first-value
    - second-value
  Boolean: true
```

## ID Fisik
<a name="resources-section-physical-id"></a>

Selain ID logis, sumber daya tertentu juga memiliki ID fisik, yang merupakan nama yang ditetapkan sebenarnya untuk sumber daya tersebut, seperti ID instans EC2 atau nama bucket S3. Gunakan ID fisik untuk mengidentifikasi sumber daya di luar CloudFormation templat, tetapi hanya setelah sumber daya dibuat. Misalnya, anggaplah Anda memberikan sumber daya instans EC2 ID logis `MyEC2Instance`. Saat CloudFormation membuat instance, CloudFormation secara otomatis menghasilkan dan menetapkan ID fisik (seperti`i-1234567890abcdef0`) ke instance. Anda dapat menggunakan ID fisik ini untuk mengidentifikasi instance dan melihat propertinya (seperti nama DNS) dengan menggunakan konsol Amazon EC2. 

Untuk bucket Amazon S3 dan banyak sumber daya lainnya, CloudFormation secara otomatis menghasilkan nama fisik unik untuk sumber daya jika Anda tidak menentukannya secara eksplisit. Nama fisik ini didasarkan pada kombinasi nama CloudFormation tumpukan, nama logis sumber daya yang ditentukan dalam CloudFormation template, dan ID unik. Misalnya, jika Anda memiliki bucket Amazon S3 dengan nama logis `MyBucket` dalam tumpukan bernama`MyStack`, CloudFormation beri nama bucket dengan nama fisik berikut. `MyStack-MyBucket-abcdefghijk1`

Untuk sumber daya yang mendukung nama kustom, Anda dapat menetapkan nama fisik Anda sendiri untuk membantu Anda mengidentifikasi sumber daya dengan cepat. Misalnya, Anda dapat menamakan bucket S3 yang menyimpan log sebagai `MyPerformanceLogs`. Untuk informasi lebih lanjut, lihat [Jenis nama](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-name.html).

## Referensi sumber daya
<a name="using-cross-resource-references"></a>

Seringkali, Anda perlu mengatur properti pada satu sumber daya berdasarkan nama atau properti sumber daya lain. Misalnya, Anda dapat membuat instans EC2 yang menggunakan grup keamanan EC2, atau CloudFront distribusi yang didukung oleh bucket S3. Semua sumber daya ini dapat dibuat dalam CloudFormation template yang sama. 

CloudFormation menyediakan fungsi intrinsik yang dapat Anda gunakan untuk merujuk ke sumber daya lain dan propertinya. Fungsi-fungsi ini memungkinkan Anda untuk membuat dependensi antara sumber daya dan meneruskan nilai dari satu sumber daya ke sumber daya lainnya.

### Fungsi `Ref`
<a name="resource-properties-ref"></a>

`Ref`Fungsi ini biasanya digunakan untuk mengambil properti identifikasi sumber daya yang didefinisikan dalam CloudFormation template yang sama. Apa yang dikembalikan tergantung pada jenis sumber daya. Untuk sebagian besar sumber daya, ia mengembalikan nama fisik sumber daya. Namun, untuk beberapa jenis sumber daya, mungkin mengembalikan nilai yang berbeda, seperti alamat IP untuk `AWS::EC2::EIP` sumber daya atau Nama Sumber Daya Amazon (ARN) untuk topik Amazon SNS. 

Contoh berikut menunjukkan bagaimana menggunakan `Ref` fungsi dalam properti. Dalam setiap contoh ini, `Ref` fungsi akan mengembalikan nama sebenarnya dari `LogicalResourceName` sumber daya yang dideklarasikan di tempat lain dalam template. Contoh `!Ref` sintaks dalam contoh YAMAL hanyalah cara yang lebih pendek untuk menulis fungsi. `Ref`

#### JSON
<a name="resource-properties-ref-example.json"></a>

```
"Properties" : {
    "PropertyName" : { "Ref" : "LogicalResourceName" }
}
```

#### YAML
<a name="resource-properties-ref-example.yaml"></a>

```
Properties:
  PropertyName1:
    Ref: LogicalResourceName
  PropertyName2: !Ref LogicalResourceName
```

Untuk informasi lebih rinci tentang `Ref` fungsi, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html). 

### Fungsi `Fn::GetAtt`
<a name="resource-properties-getatt"></a>

`Ref`Fungsi ini membantu jika parameter atau nilai yang dikembalikan untuk sumber daya persis seperti yang Anda inginkan. Namun, Anda mungkin memerlukan atribut lain dari sumber daya. Misalnya, jika Anda ingin membuat CloudFront distribusi dengan asal S3, Anda perlu menentukan lokasi bucket dengan menggunakan alamat gaya DNS. Sejumlah sumber daya memiliki atribut tambahan yang nilainya dapat Anda gunakan di templat Anda. Untuk mendapatkan atribut ini, Anda menggunakan `Fn::GetAtt` fungsi.

Contoh berikut menunjukkan bagaimana menggunakan `GetAtt` fungsi dalam properti. `Fn::GetAtt`Fungsi ini mengambil dua parameter, nama logis sumber daya dan nama atribut yang akan diambil. Contoh `!GetAtt` sintaks dalam contoh YAMAL hanyalah cara yang lebih pendek untuk menulis fungsi. `GetAtt`

#### JSON
<a name="resource-properties-getatt-example.json"></a>

```
"Properties" : {
    "PropertyName" : {
        "Fn::GetAtt" : [ "LogicalResourceName", "AttributeName" ]
    }
}
```

#### YAML
<a name="resource-properties-getatt-example.yaml"></a>

```
Properties:
  PropertyName1:
    Fn::GetAtt:
      - LogicalResourceName
      - AttributeName
  PropertyName2: !GetAtt LogicalResourceName.AttributeName
```

Untuk informasi lebih rinci tentang `GetAtt` fungsi, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-getatt.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-getatt.html).

## Contoh
<a name="resources-section-structure-examples"></a>

Contoh berikut menggambarkan cara mendeklarasikan sumber daya dan bagaimana CloudFormation template dapat mereferensikan sumber daya lain yang ditentukan dalam template yang sama dan sumber daya yang ada. AWS 

**Topics**
+ [Mendeklarasikan sumber daya tunggal dengan nama kustom](#resources-section-structure-examples-single-resource)
+ [Mereferensikan sumber daya lain dengan fungsi `Ref`](#resources-section-structure-examples-ref)
+ [Mereferensikan atribut sumber daya menggunakan fungsi `Fn::GetAtt`](#resources-section-structure-examples-getatt)

### Mendeklarasikan sumber daya tunggal dengan nama kustom
<a name="resources-section-structure-examples-single-resource"></a>

Contoh berikut mendeklarasikan sumber daya tunggal tipe `AWS::S3::Bucket` dengan nama logis. `MyBucket` `BucketName`Properti diatur ke*amzn-s3-demo-bucket*, yang harus diganti dengan nama yang diinginkan untuk bucket S3 Anda.

Jika Anda menggunakan deklarasi sumber daya ini untuk membuat tumpukan, CloudFormation akan membuat bucket Amazon S3 dengan pengaturan default. Untuk sumber daya lain, seperti instans Amazon EC2 atau grup Auto Scaling CloudFormation , memerlukan informasi lebih lanjut.

#### JSON
<a name="resources-section-structure-examples-single-resource.json"></a>

```
{
    "Resources": {
        "MyBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": "amzn-s3-demo-bucket"
            }
        }
    }
}
```

#### YAML
<a name="resources-section-structure-examples-single-resource.yaml"></a>

```
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: amzn-s3-demo-bucket
```

### Mereferensikan sumber daya lain dengan fungsi `Ref`
<a name="resources-section-structure-examples-ref"></a>

Contoh berikut menunjukkan deklarasi sumber daya yang mendefinisikan instans EC2 dan grup keamanan. `Ec2Instance`Sumber daya mereferensikan `InstanceSecurityGroup` sumber daya sebagai bagian dari `SecurityGroupIds` propertinya menggunakan `Ref` fungsi. Ini juga mencakup grup keamanan yang ada (`sg-12a4c434`) yang tidak dideklarasikan dalam template. Anda menggunakan string literal untuk mereferensikan ke sumber daya AWS yang ada.

#### JSON
<a name="resources-section-structure-examples-ref.json"></a>

```
{
    "Resources": {
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "SecurityGroupIds": [
                    {
                        "Ref": "InstanceSecurityGroup"
                    },
                    "sg-12a4c434"
                ],
                "KeyName": "MyKey",
                "ImageId": "ami-1234567890abcdef0"
            }
        },
        "InstanceSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable SSH access via port 22",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        }
    }
}
```

#### YAML
<a name="resources-section-structure-examples-ref.yaml"></a>

```
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      SecurityGroupIds:
        - !Ref InstanceSecurityGroup
        - sg-12a4c434
      KeyName: MyKey
      ImageId: ami-1234567890abcdef0
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
```

### Mereferensikan atribut sumber daya menggunakan fungsi `Fn::GetAtt`
<a name="resources-section-structure-examples-getatt"></a>

Contoh berikut menunjukkan deklarasi sumber daya yang mendefinisikan sumber daya CloudFront distribusi dan bucket S3. `MyDistribution`Sumber daya menentukan nama DNS `MyBucket` sumber daya menggunakan `Fn::GetAtt` fungsi untuk mendapatkan atribut bucket. `DomainName` Anda akan melihat bahwa `Fn::GetAtt` fungsi tersebut mencantumkan dua parameternya dalam sebuah array. Untuk fungsi yang mengambil beberapa parameter, gunakan array untuk menentukan parameternya.

#### JSON
<a name="resources-section-structure-examples-getatt.json"></a>

```
{
  "Resources": {
    "MyBucket": {
      "Type": "AWS::S3::Bucket"
    },
    "MyDistribution": {
      "Type": "AWS::CloudFront::Distribution",
      "Properties": {
        "DistributionConfig": {
          "Origins": [
            {
              "DomainName": {
                "Fn::GetAtt": [
                  "MyBucket",
                  "DomainName"
                ]
              },
              "Id": "MyS3Origin",
              "S3OriginConfig": {}
            }
          ],
          "Enabled": "true",
          "DefaultCacheBehavior": {
            "TargetOriginId": "MyS3Origin",
            "ForwardedValues": {
              "QueryString": "false"
            },
            "ViewerProtocolPolicy": "allow-all"
          }
        }
      }
    }
  }
}
```

#### YAML
<a name="resources-section-structure-examples-getatt.yaml"></a>

```
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
  MyDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
          - DomainName: !GetAtt 
              - MyBucket
              - DomainName
            Id: MyS3Origin
            S3OriginConfig: {}
        Enabled: 'true'
        DefaultCacheBehavior:
          TargetOriginId: MyS3Origin
          ForwardedValues:
            QueryString: 'false'
          ViewerProtocolPolicy: allow-all
```

# CloudFormation Parameterssintaks template
<a name="parameters-section-structure"></a>

Gunakan bagian `Parameters` untuk menyesuaikan templat Anda. Dengan parameter, Anda dapat memasukkan nilai kustom ke template Anda setiap kali Anda membuat atau memperbarui tumpukan. Dengan menggunakan parameter dalam template Anda, Anda dapat membuat template yang dapat digunakan kembali dan fleksibel yang dapat disesuaikan dengan skenario tertentu. 

Dengan menentukan parameter dari jenis yang sesuai, Anda dapat memilih dari daftar pengidentifikasi sumber daya yang ada saat Anda menggunakan konsol untuk membuat tumpukan Anda. Untuk informasi selengkapnya, lihat [Tentukan sumber daya yang ada saat runtime dengan CloudFormation tipe parameter yang disediakan](cloudformation-supplied-parameter-types.md).

Parameter adalah cara populer untuk menentukan nilai properti sumber daya tumpukan. Namun, mungkin ada pengaturan yang bergantung pada wilayah atau agak rumit bagi pengguna untuk mencari tahu karena kondisi atau dependensi lain. Dalam kasus ini, Anda mungkin ingin menempatkan beberapa logika dalam template itu sendiri sehingga pengguna dapat menentukan nilai yang lebih sederhana (atau tidak sama sekali) untuk mendapatkan hasil yang mereka inginkan, seperti dengan menggunakan pemetaan. Untuk informasi selengkapnya, lihat [CloudFormation Mappingssintaks template](mappings-section-structure.md).

## Sintaksis
<a name="parameters-section-structure-syntax"></a>

Anda mendeklarasikan parameter di `Parameters` bagian template, yang menggunakan sintaks umum berikut:

### JSON
<a name="parameters-section-structure-syntax.json"></a>

```
"Parameters" : {
  "ParameterLogicalID" : {
    "Description": "Information about the parameter",
    "Type" : "DataType",
    "Default" : "value",
    "AllowedValues" : ["value1", "value2"]
  }
}
```

### YAML
<a name="parameters-section-structure-syntax.yaml"></a>

```
Parameters:
  ParameterLogicalID:
    Description: Information about the parameter
    Type: DataType
    Default: value
    AllowedValues:
      - value1
      - value2
```

Parameter berisi daftar atribut yang menentukan nilai dan batasan terhadap nilainya. Satu-satunya atribut yang diperlukan adalah`Type`, yang dapat berupa `String``Number`, atau tipe parameter yang CloudFormation disediakan. Anda juga dapat menambahkan `Description` atribut yang menjelaskan jenis nilai apa yang harus Anda tentukan. Nama dan deskripsi parameter muncul di halaman **Tentukan Parameter** saat Anda menggunakan templat di wizard **Buat Tumpukan**.

**catatan**  
Secara default, CloudFormation konsol mencantumkan parameter input menurut abjad berdasarkan ID logisnya. Untuk mengganti urutan default ini dan mengelompokkan parameter terkait bersama-sama, Anda dapat menggunakan kunci `AWS::CloudFormation::Interface` metadata di template Anda. Untuk informasi selengkapnya, lihat [Mengatur CloudFormation parameter dengan `AWS::CloudFormation::Interface` metadata](aws-cloudformation-interface.md).

Untuk parameter dengan nilai default, CloudFormation gunakan nilai default kecuali pengguna menentukan nilai lain. Jika Anda menghilangkan atribut default, pengguna diminta untuk menentukan nilai untuk parameter tersebut. Namun, mengharuskan pengguna untuk memasukkan nilai tidak memastikan bahwa nilainya valid. Untuk memvalidasi nilai parameter, Anda dapat mendeklarasikan batasan atau menentukan tipe parameter -spesifik. AWS

Untuk parameter tanpa nilai default, pengguna harus menentukan nilai nama kunci pada pembuatan tumpukan. Jika tidak, CloudFormation gagal membuat tumpukan dan melempar pengecualian:

```
Parameters: [KeyName] must have values
```

## Sifat-sifat
<a name="parameters-section-structure-properties"></a>

`AllowedPattern`  
Ekspresi reguler yang mewakili pola untuk memungkinkan `String` atau `CommaDelimitedList` mengetik. Ketika diterapkan pada parameter tipe`String`, pola harus cocok dengan seluruh nilai parameter yang disediakan. Ketika diterapkan ke parameter tipe`CommaDelimitedList`, pola harus cocok dengan setiap nilai dalam daftar.  
*Wajib*: Tidak

`AllowedValues`  
Array yang berisi daftar nilai yang diizinkan untuk parameter. Ketika diterapkan ke parameter tipe`String`, nilai parameter harus menjadi salah satu nilai yang diizinkan. Ketika diterapkan ke parameter tipe`CommaDelimitedList`, setiap nilai dalam daftar harus menjadi salah satu nilai yang diizinkan yang ditentukan.  
*Wajib*: Tidak  
Jika Anda menggunakan YAMAL dan ingin menggunakan `Yes` dan `No` string untuk`AllowedValues`, gunakan tanda kutip tunggal untuk mencegah parser YAMAL mempertimbangkan nilai boolean ini.

`ConstraintDescription`  
Suatu string yang menjelaskan kendala ketika ia dilanggar. Sebagai contoh, tanpa deskripsi kendala, parameter yang memiliki pola yang diizinkan `[A-Za-z0-9]+` menampilkan pesan kesalahan berikut ketika pengguna menentukan nilai yang tidak valid:  
`Malformed input-Parameter MyParameter must match pattern [A-Za-z0-9]+`  
Dengan menambahkan deskripsi kendala, seperti * hanya boleh berisi huruf (huruf besar dan huruf kecil) dan angka*, Anda dapat menampilkan pesan kesalahan yang disesuaikan berikut:  
`Malformed input-Parameter MyParameter must only contain uppercase and lowercase letters and numbers`  
*Wajib*: Tidak

`Default`  
Nilai tipe yang sesuai untuk templat untuk digunakan jika tidak ada nilai yang ditentukan ketika tumpukan dibuat. Jika Anda menentukan kendala untuk parameter, Anda harus menentukan nilai yang mematuhi kendala tersebut.  
*Wajib*: Tidak

`Description`  
String hingga 4000 karakter yang menggambarkan parameter.  
*Wajib*: Tidak

`MaxLength`  
Nilai integer yang menentukan jumlah karakter terbesar dengan `String` tipe yang Anda izinkan.  
*Wajib*: Tidak

`MaxValue`  
Nilai numerik yang menentukan nilai numerik terbesar dengan `Number` tipe yang ingin Anda izinkan.  
*Wajib*: Tidak

`MinLength`  
Nilai integer yang menentukan jumlah karakter terbesar dengan `String` tipe yang ingin Anda izinkan.  
*Wajib*: Tidak

`MinValue`  
Nilai numerik yang menentukan nilai numerik terkecil dengan `Number` tipe yang ingin Anda izinkan.  
*Wajib*: Tidak

`NoEcho`  
Apakah akan menutupi nilai parameter untuk mencegahnya ditampilkan di konsol, alat baris perintah, atau API. Jika Anda menyetel `NoEcho` atribut ke`true`, CloudFormation mengembalikan nilai parameter yang disamarkan sebagai tanda bintang (\$1\$1\$1\$1\$1) untuk setiap panggilan yang menggambarkan peristiwa tumpukan atau tumpukan, kecuali untuk informasi yang disimpan di lokasi yang ditentukan di bawah ini.  
*Wajib*: Tidak  
Menggunakan `NoEcho` atribut tidak menutupi informasi apa pun yang disimpan sebagai berikut:  
+ Bagian `Metadata` template. CloudFormation tidak mengubah, memodifikasi, atau menyunting informasi apa pun yang Anda sertakan di `Metadata` bagian ini. Untuk informasi selengkapnya, lihat [Metadata](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ Bagian `Outputs` template. Untuk informasi lebih lanjut, lihat [Output](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
+ `Metadata`Atribut definisi sumber daya. Untuk informasi lebih lanjut, lihat [Atribut `Metadata`](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Kami sangat menyarankan Anda untuk tidak menggunakan mekanisme ini untuk memasukkan informasi sensitif, seperti kata sandi atau rahasia.
Daripada menyematkan informasi sensitif secara langsung di CloudFormation template Anda, kami sarankan Anda menggunakan parameter dinamis dalam template tumpukan untuk mereferensikan informasi sensitif yang disimpan dan dikelola di luar CloudFormation, seperti di AWS Systems Manager Parameter Store atau AWS Secrets Manager.  
Untuk informasi selengkapnya, lihat Do [not embed credentials in your templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds) best practice.
Kami sangat menyarankan agar tidak termasuk `NoEcho` parameter, atau data sensitif apa pun, di properti sumber daya yang merupakan bagian dari pengenal utama sumber daya.  
Ketika `NoEcho` parameter disertakan dalam properti yang membentuk pengenal sumber daya utama, CloudFormation dapat menggunakan *nilai plaintext aktual* dalam pengidentifikasi sumber daya utama. ID sumber daya ini mungkin muncul dalam output turunan atau tujuan.  
Untuk menentukan properti sumber daya mana yang terdiri dari pengidentifikasi utama tipe sumber daya, lihat dokumentasi referensi sumber daya untuk sumber daya tersebut dalam referensi [tipe AWS sumber daya dan properti](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html). Di bagian **Kembalikan nilai**, nilai `Ref` pengembalian fungsi mewakili properti sumber daya yang terdiri dari tipe pengidentifikasi utama sumber daya.

`Type`  <a name="parameters-section-structure-properties-type"></a>
Tipe data untuk parameter (`DataType`).  
*Wajib*: Ya  
CloudFormation mendukung jenis parameter berikut:    
`String`  
Sebuah string literal. Anda dapat menggunakan atribut berikut untuk mendeklarasikan batasan:`MinLength`,,,, `MaxLength` dan. `Default` `AllowedValues` `AllowedPattern`   
Misalnya, pengguna dapat menentukan `"MyUserName"`.  
`Number`  
Sebuah integer atau float. CloudFormation memvalidasi nilai parameter sebagai angka; Namun, ketika Anda menggunakan parameter di tempat lain di template Anda (misalnya, dengan menggunakan fungsi `Ref` intrinsik), nilai parameter menjadi string.  
Anda dapat menggunakan atribut berikut untuk mendeklarasikan batasan:`MinValue`,,, dan. `MaxValue` `Default` `AllowedValues`  
Misalnya, pengguna dapat menentukan `"8888"`.  
`List<Number>`  
Array integer atau float yang dipisahkan oleh koma. CloudFormation memvalidasi nilai parameter sebagai angka; namun, ketika Anda menggunakan parameter di tempat lain dalam templat Anda (misalnya, dengan menggunakan `Ref` fungsi intrinsik), nilai parameter menjadi daftar string.  
Misalnya, pengguna dapat menentukan `"80,20"`, dan `Ref` akan menghasilkan `["80","20"]`.  
`CommaDelimitedList`  
Array string literal yang dipisahkan dengan koma. Jumlah total string harus satu lebih dari jumlah koma. Juga, setiap string anggota dipangkas ruang.  
Misalnya, pengguna dapat menentukan `"test,dev,prod"`, dan `Ref` akan menghasilkan `["test","dev","prod"]`.  
AWS-jenis parameter tertentu  
AWS nilai-nilai seperti nama key pair Amazon EC2 dan VPC. IDs Untuk informasi selengkapnya, lihat [Tentukan sumber daya yang ada saat runtime](cloudformation-supplied-parameter-types.md).  
Jenis parameter Systems Manager  
Parameter yang sesuai dengan parameter yang ada di Systems Manager Parameter Store. Anda menentukan kunci parameter Systems Manager sebagai nilai tipe parameter Systems Manager, dan CloudFormation mengambil nilai terbaru dari Parameter Store yang akan digunakan untuk tumpukan. Untuk informasi selengkapnya, lihat [Tentukan sumber daya yang ada saat runtime](cloudformation-supplied-parameter-types.md).

## Persyaratan umum untuk parameter
<a name="parameters-section-structure-requirements"></a>

Persyaratan berikut berlaku saat menggunakan parameter:
+ Anda dapat memiliki maksimum 200 parameter dalam CloudFormation template.
+ Setiap parameter harus diberi nama logis (juga disebut ID logis) yang harus alfanumerik dan unik di antara semua nama logis dalam template.
+ Setiap parameter harus diberi tipe parameter yang didukung oleh CloudFormation. Untuk informasi lebih lanjut, lihat [Tipe](#parameters-section-structure-properties-type).
+ Setiap parameter harus diberi nilai saat runtime CloudFormation agar berhasil menyediakan tumpukan. Anda dapat secara opsional menentukan nilai default CloudFormation untuk digunakan kecuali nilai lain disediakan.
+ Parameter harus dinyatakan dan direferensikan dari dalam templat yang sama. Anda dapat mereferensikan parameter dari bagian `Resources` dan `Outputs` templat tersebut.

## Contoh
<a name="parameters-section-examples"></a>

**Topics**
+ [Parameter string sederhana](#parameters-section-structure-example-1)
+ [Parameter kata sandi](#parameters-section-structure-example-2)
+ [Parameter referensi](#parameters-section-structure-example-3)
+ [Parameter daftar yang dibatasi koma](#parameters-section-structure-example-4)
+ [Kembalikan nilai dari parameter daftar yang dipisahkan koma](#parameters-section-structure-example-5)

### Parameter string sederhana
<a name="parameters-section-structure-example-1"></a>

Contoh berikut mendeklarasikan parameter bernama `InstanceTypeParameter` tipe`String`. Parameter ini memungkinkan Anda menentukan jenis instans Amazon EC2 untuk tumpukan. Jika tidak ada nilai yang diberikan selama pembuatan atau pembaruan tumpukan, CloudFormation gunakan nilai default`t2.micro`.

#### JSON
<a name="parameters-section-structure-example-1.json"></a>

```
"Parameters" : {
  "InstanceTypeParameter" : {
    "Description" : "Enter t2.micro, m1.small, or m1.large. Default is t2.micro.",
    "Type" : "String",
    "Default" : "t2.micro",
    "AllowedValues" : ["t2.micro", "m1.small", "m1.large"]
  }
}
```

#### YAML
<a name="parameters-section-structure-example-1.yaml"></a>

```
Parameters:
  InstanceTypeParameter:
    Description: Enter t2.micro, m1.small, or m1.large. Default is t2.micro.
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - m1.small
      - m1.large
```

### Parameter kata sandi
<a name="parameters-section-structure-example-2"></a>

Contoh berikut mendeklarasikan parameter bernama `DBPwd` tipe `String` tanpa nilai default. `NoEcho`Properti diatur `true` untuk mencegah nilai parameter ditampilkan dalam deskripsi tumpukan. Nilai minimum yang dapat ditentukan adalah `1`, dan panjang maksimum yang dapat ditentukan adalah `41`. Pola ini memungkinkan huruf kecil dan huruf besar karakter abjad dan angka. Contoh ini juga menggambarkan penggunaan ekspresi reguler untuk `AllowedPattern` properti.

#### JSON
<a name="parameters-section-structure-example-2.json"></a>

```
"Parameters" : {
  "DBPwd" : {
    "NoEcho" : "true",
    "Description" : "The database admin account password",
    "Type" : "String",
    "MinLength" : "1",
    "MaxLength" : "41",
    "AllowedPattern" : "^[a-zA-Z0-9]*$"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-2.yaml"></a>

```
Parameters: 
  DBPwd: 
    NoEcho: true
    Description: The database admin account password
    Type: String
    MinLength: 1
    MaxLength: 41
    AllowedPattern: ^[a-zA-Z0-9]*$
```

### Parameter referensi
<a name="parameters-section-structure-example-3"></a>

Anda menggunakan `Ref` fungsi intrinsik untuk referensi parameter, dan CloudFormation menggunakan nilai parameter untuk penyediaan tumpukan. Anda dapat mereferensikan parameter dari bagian `Resources` dan `Outputs` dari templat yang sama.

Pada contoh berikut, `InstanceType` properti referensi sumber daya Instans EC2 `InstanceTypeParameter` nilai parameter:

#### JSON
<a name="parameters-section-structure-example-3.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance",
  "Properties" : {
    "InstanceType" : { "Ref" : "InstanceTypeParameter" },
    "ImageId" : "ami-0ff8a91507f77f867"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-3.yaml"></a>

```
Ec2Instance:
  Type: AWS::EC2::Instance
  Properties:
    InstanceType:
      Ref: InstanceTypeParameter
    ImageId: ami-0ff8a91507f77f867
```

### Parameter daftar yang dibatasi koma
<a name="parameters-section-structure-example-4"></a>

Jenis `CommaDelimitedList` parameter dapat berguna ketika Anda perlu memberikan beberapa nilai untuk satu properti. Contoh berikut mendeklarasikan parameter bernama `DbSubnetIpBlocks` dengan nilai default dari tiga blok CIDR dipisahkan dengan koma.

#### JSON
<a name="parameters-section-structure-example-4.json"></a>

```
"Parameters" : {
  "DbSubnetIpBlocks": {
    "Description": "Comma-delimited list of three CIDR blocks",
    "Type": "CommaDelimitedList",
    "Default": "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-4.yaml"></a>

```
Parameters: 
  DbSubnetIpBlocks: 
    Description: "Comma-delimited list of three CIDR blocks"
    Type: CommaDelimitedList
    Default: "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
```

### Kembalikan nilai dari parameter daftar yang dipisahkan koma
<a name="parameters-section-structure-example-5"></a>

Untuk merujuk ke nilai tertentu dalam daftar parameter yang dibatasi koma, gunakan fungsi `Fn::Select` intrinsik di bagian templat Anda. `Resources` Lulus nilai indeks objek yang Anda inginkan dan daftar objek, seperti yang ditunjukkan pada contoh berikut.

#### JSON
<a name="parameters-section-structure-example-5.json"></a>

```
{
    "Parameters": {
        "VPC": {
            "Type": "String",
            "Default": "vpc-123456"
        },
        "VpcAzs": {
            "Type": "CommaDelimitedList",
            "Default": "us-west-2a, us-west-2b, us-west-2c"
        },
        "DbSubnetIpBlocks": {
            "Type": "CommaDelimitedList",
            "Default": "172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26"
        }
    },
    "Resources": {
        "DbSubnet1": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Select": [
                      0,
                      { 
                        "Ref": "VpcAzs" 
                      }
                   ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        0,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet2": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    1,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        1,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet3": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    2,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        2,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        }
    }
}
```

#### YAML
<a name="parameters-section-structure-example-5.yaml"></a>

```
Parameters:
  VPC:
    Type: String
    Default: vpc-123456
  VpcAzs:
    Type: CommaDelimitedList
    Default: us-west-2a, us-west-2b, us-west-2c
  DbSubnetIpBlocks:
    Type: CommaDelimitedList
    Default: 172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26
Resources:
  DbSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select
        - 0 
        - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 0
        - !Ref DbSubnetIpBlocks
  DbSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 1
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 1
        - !Ref DbSubnetIpBlocks
  DbSubnet3:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 2
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 2
        - !Ref DbSubnetIpBlocks
```

## Sumber daya terkait
<a name="parameters-section-structure-related-resources"></a>

CloudFormation juga mendukung penggunaan referensi dinamis untuk menentukan nilai properti secara dinamis. Misalnya, Anda mungkin perlu mereferensikan string aman yang disimpan di Systems Manager Parameter Store. Untuk informasi selengkapnya, lihat [Dapatkan nilai yang disimpan di layanan lain menggunakan referensi dinamis](dynamic-references.md).

Anda juga dapat menggunakan parameter semu dalam fungsi `Ref` atau `Sub` fungsi untuk mengisi nilai secara dinamis. Lihat informasi yang lebih lengkap di [Dapatkan AWS nilai menggunakan parameter semu](pseudo-parameter-reference.md). 

# CloudFormation Outputssintaks template
<a name="outputs-section-structure"></a>

`Outputs`Bagian opsional mendeklarasikan nilai output untuk tumpukan. Nilai output ini dapat digunakan dengan berbagai cara:
+ **Tangkap detail penting tentang sumber daya Anda** — Output adalah cara mudah untuk menangkap informasi penting tentang sumber daya Anda. Misalnya, Anda dapat menampilkan nama bucket S3 untuk tumpukan agar bucket lebih mudah ditemukan. Anda dapat melihat nilai output di tab **Output** CloudFormation konsol atau dengan menggunakan perintah [describe-stacks](service_code_examples.md#describe-stacks-sdk)CLI. 
+ **Referensi cross-stack** — Anda dapat mengimpor nilai output ke tumpukan lain untuk [membuat referensi antar](using-cfn-stack-exports.md) tumpukan. Ini sangat membantu ketika Anda perlu berbagi sumber daya atau konfigurasi di beberapa tumpukan.

**penting**  
CloudFormation tidak menyunting atau mengaburkan informasi apa pun yang Anda sertakan di bagian ini. `Outputs` Kami sangat merekomendasikan Anda untuk tidak menggunakan bagian ini untuk menampilkan informasi sensitif, seperti kata sandi atau rahasia.  
Nilai output tersedia setelah operasi tumpukan selesai. Nilai keluaran tumpukan tidak tersedia saat status tumpukan berada di salah satu `IN_PROGRESS` [status.](view-stack-events.md#cfn-console-view-stack-data-resources-status-codes) Kami tidak merekomendasikan membuat dependensi antara waktu aktif layanan dan nilai output tumpukan karena nilai output mungkin tidak tersedia setiap saat.

## Sintaksis
<a name="outputs-section-syntax"></a>

Bagian `Outputs` terdiri dari nama kunci `Outputs`. Anda dapat mendeklarasikan maksimum 200 output dalam sebuah templat.

Contoh berikut menunjukkan struktur bagian `Outputs`.

### JSON
<a name="outputs-section-structure-syntax.json"></a>

Gunakan tanda kurung untuk menutup seluruh deklarasi output. Membatasi beberapa output dengan koma.

```
"Outputs" : {
  "OutputLogicalID" : {
    "Description" : "Information about the value",
    "Value" : "Value to return",
    "Export" : {
      "Name" : "Name of resource to export"
    }
  }
}
```

### YAML
<a name="outputs-section-structure-syntax.yaml"></a>

```
Outputs:
  OutputLogicalID:
    Description: Information about the value
    Value: Value to return
    Export:
      Name: Name of resource to export
```

### Bidang output
<a name="outputs-section-structure-output-fields"></a>

Bagian `Outputs` dapat mencakup bidang berikut.

**Logical ID (juga disebut *nama logis*)**  
Sebuah pengidentifikasi untuk output saat ini. ID logis harus berupa alfanumerik (`a–z`, `A–Z`, `0–9`) dan unik dalam templat.

**`Description` (opsional)**  
Jenis `String` yang menjelaskan nilai output. Nilai untuk deklarasi deskripsi harus berupa string literal yang panjangnya antara 0 dan 1024 byte. Anda tidak dapat menggunakan parameter atau fungsi untuk menentukan deskripsi. 

**`Value`(Diperlukan)**  
Nilai properti yang dikembalikan oleh perintah [describe-stacks](service_code_examples.md#describe-stacks-sdk). Nilai output dapat mencakup literal, referensi parameter, parameter semu, nilai pemetaan, atau fungsi intrinsik.

**`Export` (opsional)**  
Nama output sumber daya yang akan diekspor untuk Referensi lintas tumpukan.  
Anda dapat menggunakan fungsi intrinsik untuk menyesuaikan nilai `Name` ekspor.  
Untuk informasi selengkapnya, lihat [Dapatkan output yang diekspor dari tumpukan yang diterapkan CloudFormation](using-cfn-stack-exports.md).

Untuk mengasosiasikan syarat dengan output, tentukan syarat di bagian [Conditions](conditions-section-structure.md) dari templat.

## Contoh
<a name="outputs-section-structure-examples"></a>

Contoh berikut menggambarkan cara kerja output tumpukan.

**Topics**
+ [Output tumpukan](#outputs-section-structure-examples-stack-output)
+ [Sesuaikan nama ekspor menggunakan `Fn::Sub`](#outputs-section-structure-examples-cross-stack)
+ [Sesuaikan nama ekspor menggunakan `Fn::Join`](#outputs-section-structure-examples-join-export-name)
+ [Kembalikan URL yang dibuat menggunakan `Fn::Join`](#outputs-section-structure-examples-join-export-url)

### Output tumpukan
<a name="outputs-section-structure-examples-stack-output"></a>

Dalam contoh berikut, output bernama `BackupLoadBalancerDNSName` mengembalikan nama DNS untuk sumber daya dengan ID logis `BackupLoadBalancer` hanya ketika kondisi `CreateProdResources` benar. Output bernama `InstanceID` mengembalikan ID dari contoh EC2 dengan ID `EC2Instance` logis.

#### JSON
<a name="outputs-section-structure-example.json"></a>

```
"Outputs" : {
  "BackupLoadBalancerDNSName" : {
    "Description": "The DNSName of the backup load balancer",  
    "Value" : { "Fn::GetAtt" : [ "BackupLoadBalancer", "DNSName" ]},
    "Condition" : "CreateProdResources"
  },
  "InstanceID" : {
    "Description": "The Instance ID",  
    "Value" : { "Ref" : "EC2Instance" }
  }
}
```

#### YAML
<a name="outputs-section-structure-example.yaml"></a>

```
Outputs:
  BackupLoadBalancerDNSName:
    Description: The DNSName of the backup load balancer
    Value: !GetAtt BackupLoadBalancer.DNSName
    Condition: CreateProdResources
  InstanceID:
    Description: The Instance ID
    Value: !Ref EC2Instance
```

### Sesuaikan nama ekspor menggunakan `Fn::Sub`
<a name="outputs-section-structure-examples-cross-stack"></a>

Dalam contoh berikut, output bernama `StackVPC` mengembalikan ID dari VPC, dan kemudian mengekspor nilai untuk referensi lintas tumpukan dengan nama `VPCID` ditambahkan ke nama tumpukan.

#### JSON
<a name="outputs-section-structure-cross-stack-example.json"></a>

```
"Outputs" : {
  "StackVPC" : {
    "Description" : "The ID of the VPC",
    "Value" : { "Ref" : "MyVPC" },
    "Export" : {
      "Name" : {"Fn::Sub": "${AWS::StackName}-VPCID" }
    }
  }
}
```

#### YAML
<a name="outputs-section-structure-cross-stack-example.yaml"></a>

```
Outputs:
  StackVPC:
    Description: The ID of the VPC
    Value: !Ref MyVPC
    Export:
      Name: !Sub "${AWS::StackName}-VPCID"
```

Untuk informasi selengkapnya tentang fungsi `Fn::Sub`, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html).

### Sesuaikan nama ekspor menggunakan `Fn::Join`
<a name="outputs-section-structure-examples-join-export-name"></a>

Anda juga dapat menggunakan `Fn::Join` fungsi untuk membangun nilai berdasarkan parameter, atribut sumber daya, dan string lainnya.

Contoh berikut menggunakan `Fn::Join` fungsi untuk menyesuaikan nama ekspor alih-alih `Fn::Sub` fungsi. `Fn::Join`Fungsi contoh menggabungkan nama tumpukan dengan nama `VPCID` menggunakan titik dua sebagai pemisah.

#### JSON
<a name="outputs-section-structure-join-export-name-example.json"></a>

```
"Outputs" : {
  "StackVPC" : {
    "Description" : "The ID of the VPC",
    "Value" : { "Ref" : "MyVPC" },
    "Export" : {
      "Name" : { "Fn::Join" : [ ":", [ { "Ref" : "AWS::StackName" }, "VPCID" ] ] }
    }
  }
}
```

#### YAML
<a name="outputs-section-structure-join-export-name-example.yaml"></a>

```
Outputs:
  StackVPC:
    Description: The ID of the VPC
    Value: !Ref MyVPC
    Export:
      Name: !Join [ ":", [ !Ref "AWS::StackName", VPCID ] ]
```

Untuk informasi selengkapnya tentang fungsi `Fn::Join`, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html).

### Kembalikan URL yang dibuat menggunakan `Fn::Join`
<a name="outputs-section-structure-examples-join-export-url"></a>

Dalam contoh berikut untuk template yang membuat WordPress situs, `InstallURL` adalah string yang dikembalikan oleh panggilan `Fn::Join` fungsi yang menggabungkan`http://`, nama DNS sumber daya, dan. `ElasticLoadBalancer` `/wp-admin/install.php` Nilai output akan serupa dengan berikut ini:

```
http://mywptests-elasticl-1gb51l6sl8y5v-206169572.aws-region.elb.amazonaws.com/wp-admin/install.php
```

#### JSON
<a name="outputs-section-structure-examples-join-export-url.json"></a>

```
{
    "Outputs": {
        "InstallURL": {
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        "http://",
                        {
                            "Fn::GetAtt": [
                                "ElasticLoadBalancer",
                                "DNSName"
                            ]
                        },
                        "/wp-admin/install.php"
                    ]
                ]
            },
            "Description": "Installation URL of the WordPress website"
        }
    }
}
```

#### YAML
<a name="outputs-section-structure-examples-join-export-url.yaml"></a>

```
Outputs:
  InstallURL:
    Value: !Join 
      - ''
      - - 'http://'
        - !GetAtt 
          - ElasticLoadBalancer
          - DNSName
        - /wp-admin/install.php
    Description: Installation URL of the WordPress website
```

Untuk informasi selengkapnya tentang fungsi `Fn::Join`, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html).

# CloudFormation Mappingssintaks template
<a name="mappings-section-structure"></a>

`Mappings`Bagian opsional membantu Anda membuat pasangan kunci-nilai yang dapat digunakan untuk menentukan nilai berdasarkan kondisi atau dependensi tertentu. 

Salah satu kasus penggunaan umum untuk `Mappings` bagian ini adalah untuk menetapkan nilai berdasarkan di Wilayah AWS mana tumpukan digunakan. Ini dapat dicapai dengan menggunakan parameter `AWS::Region` semu. Parameter `AWS::Region` pseudo adalah nilai yang CloudFormation menyelesaikan ke wilayah tempat tumpukan dibuat. Parameter pseudo diselesaikan CloudFormation saat Anda membuat tumpukan. 

Untuk mengambil nilai dalam peta, Anda dapat menggunakan fungsi `Fn::FindInMap` intrinsik dalam `Resources` bagian template Anda. 

## Sintaksis
<a name="mappings-section-structure-syntax"></a>

`Mappings`Bagian ini menggunakan sintaks berikut:

### JSON
<a name="mappings-section-structure-syntax.json"></a>

```
"Mappings" : {
  "MappingLogicalName" : {
    "Key1" : {
      "Name" : "Value1"
    },
    "Key2" : {
      "Name" : "Value2"
    },
    "Key3" : {
      "Name" : "Value3"
    }
  }
}
```

### YAML
<a name="mappings-section-structure-syntax.yaml"></a>

```
Mappings: 
  MappingLogicalName: 
    Key1: 
      Name: Value1
    Key2: 
      Name: Value2
    Key3: 
      Name: Value3
```
+ `MappingLogicalName`adalah nama logis untuk pemetaan.
+ Dalam pemetaan, setiap peta adalah kunci diikuti oleh pemetaan lain.
+ Kunci harus berupa peta pasangan nama-nilai dan unik dalam pemetaan.
+ Pasangan nama-nilai adalah label, dan nilai untuk memetakan. Dengan menamakan nilai-nilai, Anda dapat memetakan lebih dari satu set nilai ke kunci.
+ Kunci dalam pemetaan harus berupa string literal.
+ Nilainya bisa dari tipe `String` atau`List`.

**catatan**  
Anda tidak dapat menyertakan parameter, parameter semu, atau fungsi intrinsik dalam bagian `Mappings`.   
Jika nilai dalam pemetaan saat ini tidak digunakan oleh tumpukan Anda, Anda tidak dapat memperbarui pemetaan saja. Anda harus menyertakan perubahan yang menambah, memodifikasi, atau menghapus sumber daya.

## Contoh
<a name="mappings-section-structure-examples"></a>

**Topics**
+ [Pemetaan Basic](#mappings-section-structure-basic-example)
+ [Pemetaan dengan beberapa nilai](#mappings-section-structure-multiple-values-example)
+ [Mengembalikan nilai dari pemetaan](#mappings-section-structure-return-value-example)
+ [Parameter masukan dan `Fn::FindInMap`](#mappings-section-structure-input-parameter-example)

### Pemetaan Basic
<a name="mappings-section-structure-basic-example"></a>

Contoh berikut ini menunjukkan bagian `Mappings` dengan peta `RegionToInstanceType`, yang berisi lima kunci yang memetakan ke pasangan nama-nilai yang mengandung nilai-nilai string tunggal. Kunci adalah nama region. Setiap pasangan nama-nilai adalah tipe instance dari keluarga T yang tersedia di wilayah yang diwakili oleh kunci. Pasangan nama-nilai memiliki nama (`InstanceType`dalam contoh) dan nilai. 

#### JSON
<a name="mappings-section-structure-basic-example.json"></a>

```
"Mappings" : {
  "RegionToInstanceType" : {
    "us-east-1"      : { "InstanceType" : "t2.micro" },
    "us-west-1"      : { "InstanceType" : "t2.micro" },
    "eu-west-1"      : { "InstanceType" : "t2.micro" },
    "eu-north-1"     : { "InstanceType" : "t3.micro" },
    "me-south-1"     : { "InstanceType" : "t3.micro" }
  }
}
```

#### YAML
<a name="mappings-section-structure-basic-example.yaml"></a>

```
Mappings:
  RegionToInstanceType:
    us-east-1:
      InstanceType: t2.micro
    us-west-1:
      InstanceType: t2.micro
    eu-west-1:
      InstanceType: t2.micro
    eu-north-1:
      InstanceType: t3.micro
    me-south-1:
      InstanceType: t3.micro
```

### Pemetaan dengan beberapa nilai
<a name="mappings-section-structure-multiple-values-example"></a>

Contoh berikut memiliki kunci wilayah yang dipetakan ke dua set nilai: satu bernama `MyAMI1` dan yang lainnya`MyAMI2`.

**catatan**  
AMI yang IDs ditunjukkan dalam contoh ini adalah placeholder untuk tujuan demonstrasi. Jika memungkinkan, pertimbangkan untuk menggunakan referensi dinamis ke AWS Systems Manager parameter sebagai alternatif untuk `Mappings` bagian tersebut. Untuk menghindari memperbarui semua template Anda dengan ID baru setiap kali AMI yang ingin Anda gunakan berubah, gunakan AWS Systems Manager parameter untuk mengambil ID AMI terbaru saat tumpukan dibuat atau diperbarui. Versi terbaru yang umum digunakan juga AMIs tersedia sebagai parameter publik di Systems Manager. Untuk informasi selengkapnya, lihat [Mendapatkan nilai yang disimpan di layanan lain menggunakan referensi dinamis](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html). 

#### JSON
<a name="mappings-section-structure-multiple-values-example"></a>

```
"Mappings" : {
  "RegionToAMI" : {
    "us-east-1"        : { "MyAMI1" : "ami-12345678901234567", "MyAMI2" : "ami-23456789012345678" },
    "us-west-1"        : { "MyAMI1" : "ami-34567890123456789", "MyAMI2" : "ami-45678901234567890" },
    "eu-west-1"        : { "MyAMI1" : "ami-56789012345678901", "MyAMI2" : "ami-67890123456789012" },
    "ap-southeast-1"   : { "MyAMI1" : "ami-78901234567890123", "MyAMI2" : "ami-89012345678901234" },
    "ap-northeast-1"   : { "MyAMI1" : "ami-90123456789012345", "MyAMI2" : "ami-01234567890123456" }
  }
}
```

#### YAML
<a name="mappings-section-structure-multiple-values-example.yaml"></a>

```
Mappings:
  RegionToAMI:
    us-east-1:
      MyAMI1: ami-12345678901234567
      MyAMI2: ami-23456789012345678
    us-west-1:
      MyAMI1: ami-34567890123456789
      MyAMI2: ami-45678901234567890
    eu-west-1:
      MyAMI1: ami-56789012345678901
      MyAMI2: ami-67890123456789012
    ap-southeast-1:
      MyAMI1: ami-78901234567890123
      MyAMI2: ami-89012345678901234
    ap-northeast-1:
      MyAMI1: ami-90123456789012345
      MyAMI2: ami-01234567890123456
```

### Mengembalikan nilai dari pemetaan
<a name="mappings-section-structure-return-value-example"></a>

Anda dapat menggunakan fungsi `Fn::FindInMap` untuk mengembalikan nilai bernama berdasarkan kunci tertentu. Contoh template berikut berisi sumber daya Amazon EC2 yang `InstanceType` propertinya ditetapkan oleh fungsi. `FindInMap` `FindInMap`Fungsi menentukan kunci sebagai Wilayah AWS tempat tumpukan dibuat (menggunakan parameter `AWS::Region` semu) dan `InstanceType` sebagai nama nilai untuk dipetakan. `ImageId`Menggunakan parameter Systems Manager untuk secara dinamis mengambil Amazon Linux 2 AMI terbaru. Untuk informasi selengkapnya tentang parameter semu, lihat[Dapatkan AWS nilai menggunakan parameter semu](pseudo-parameter-reference.md).

#### JSON
<a name="mappings-section-structure-return-value-example.json"></a>

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Mappings" : {
    "RegionToInstanceType" : {
      "us-east-1"      : { "InstanceType" : "t2.micro" },
      "us-west-1"      : { "InstanceType" : "t2.micro" },
      "eu-west-1"      : { "InstanceType" : "t2.micro" },
      "eu-north-1"     : { "InstanceType" : "t3.micro" },
      "me-south-1"     : { "InstanceType" : "t3.micro" }
    }
  },
  "Resources" : {
    "myEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "InstanceType" : { "Fn::FindInMap" : [ "RegionToInstanceType", { "Ref" : "AWS::Region" }, "InstanceType" ]}
      }
    }
  }
}
```

#### YAML
<a name="mappings-section-structure-return-value-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Mappings: 
  RegionToInstanceType: 
    us-east-1:
      InstanceType: t2.micro
    us-west-1:
      InstanceType: t2.micro
    eu-west-1:
      InstanceType: t2.micro
    eu-north-1:
      InstanceType: t3.micro
    me-south-1:
      InstanceType: t3.micro
Resources: 
  myEC2Instance: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      InstanceType: !FindInMap [RegionToInstanceType, !Ref 'AWS::Region', InstanceType]
```

### Parameter masukan dan `Fn::FindInMap`
<a name="mappings-section-structure-input-parameter-example"></a>

Contoh template berikut menunjukkan cara membuat instance EC2 menggunakan beberapa pemetaan. Template menggunakan pemetaan bersarang untuk secara otomatis memilih jenis instans dan grup keamanan yang sesuai berdasarkan jenis target Wilayah AWS dan lingkungan (`Dev`atau). `Prod` Ini juga menggunakan parameter Systems Manager untuk secara dinamis mengambil Amazon Linux 2 AMI terbaru.

#### JSON
<a name="mappings-section-structure-input-parameter-example.json"></a>

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Parameters" : {
    "EnvironmentType" : {
      "Description" : "The environment type (Dev or Prod)",
      "Type" : "String",
      "Default" : "Dev",
      "AllowedValues" : [ "Dev", "Prod" ]
    }
  },
  "Mappings" : {
    "RegionAndEnvironmentToInstanceType" : {
      "us-east-1"        : { "Dev" : "t3.micro", "Prod" : "c5.large" },
      "us-west-1"        : { "Dev" : "t2.micro", "Prod" : "m5.large" }
    },
    "RegionAndEnvironmentToSecurityGroup" : {
      "us-east-1"        : { "Dev" : "sg-12345678", "Prod" : "sg-abcdef01" },
      "us-west-1"        : { "Dev" : "sg-ghijkl23", "Prod" : "sg-45678abc" }
    }
  },
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "InstanceType" : { "Fn::FindInMap": [ "RegionAndEnvironmentToInstanceType", { "Ref": "AWS::Region" }, { "Ref": "EnvironmentType" } ]},
        "SecurityGroupIds" : [{ "Fn::FindInMap" : [ "RegionAndEnvironmentToSecurityGroup", { "Ref" : "AWS::Region" }, { "Ref" : "EnvironmentType" } ]}]
      }
    }
  }
}
```

#### YAML
<a name="mappings-section-structure-input-parameter-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvironmentType: 
    Description: The environment type (Dev or Prod)
    Type: String
    Default: Dev
    AllowedValues: 
      - Dev
      - Prod
Mappings:
  RegionAndEnvironmentToInstanceType:
    us-east-1: 
      Dev: t3.micro
      Prod: c5.large
    us-west-1: 
      Dev: t2.micro
      Prod: m5.large
  RegionAndEnvironmentToSecurityGroup: 
    us-east-1: 
      Dev: sg-12345678
      Prod: sg-abcdef01
    us-west-1: 
      Dev: sg-ghijkl23
      Prod: sg-45678abc
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      InstanceType: !FindInMap [RegionAndEnvironmentToInstanceType, !Ref 'AWS::Region', !Ref EnvironmentType]
      SecurityGroupIds:
        - !FindInMap [RegionAndEnvironmentToSecurityGroup, !Ref 'AWS::Region', !Ref EnvironmentType]
```

## Sumber daya terkait
<a name="mappings-section-related-resources"></a>

Topik terkait ini dapat membantu saat Anda mengembangkan templat yang menggunakan `Fn::FindInMap` fungsi tersebut.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap.html)
+ [Fn::FindInMapperangkat tambahan](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap-enhancements.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html)

# CloudFormation Metadatasintaks template
<a name="metadata-section-structure"></a>

`Metadata`menyimpan informasi tambahan menggunakan objek JSON atau YAMAL. Jenis metadata tingkat template yang dapat Anda gunakan dalam template Anda meliputi:

Metadata kustom  
Menyimpan pasangan nilai kunci yang ditentukan pengguna. Misalnya, Anda dapat memberikan informasi tambahan yang tidak memengaruhi pembuatan sumber daya tetapi menawarkan konteks tambahan tentang spesifikasi infrastruktur, tim, atau penerapan.

`AWS::CloudFormation::Interface`  
Mendefinisikan pengelompokan dan urutan parameter input saat ditampilkan di konsol. CloudFormation Secara default, CloudFormation konsol mengurutkan parameter menurut abjad berdasarkan ID logisnya. 

`AWS::CloudFormation::Designer`  
CloudFormation Desainer (Desainer) mencapai akhir hayat pada 5 Februari 2025.



**penting**  
Selama pembaruan tumpukan, Anda tidak dapat memperbarui bagian `Metadata` dengan sendirinya. Anda hanya dapat memperbaruinya jika menyertakan perubahan yang menambahkan, mengubah, atau menghapus sumber daya.  
CloudFormation tidak mengubah, memodifikasi, atau menyunting informasi apa pun yang Anda sertakan di `Metadata` bagian ini. Karena itu, kami sangat merekomendasikan agar Anda tidak menggunakan bagian ini untuk menyimpan informasi sensitif, seperti kata sandi atau rahasia.

## Sintaksis
<a name="metadata-section-structure-syntax"></a>

Untuk mendeklarasikan metadata kustom di CloudFormation template Anda, gunakan sintaks berikut:

### JSON
<a name="metadata-section-structure-syntax.json"></a>

```
"Metadata" : {
  "Instances" : {"Description" : "Information about the instances"},
  "Databases" : {"Description" : "Information about the databases"}
}
```

### YAML
<a name="metadata-section-structure-syntax.yaml"></a>

```
Metadata:
  Instances:
    Description: "Information about the instances"
  Databases: 
    Description: "Information about the databases"
```

Untuk sintaks untuk`AWS::CloudFormation::Interface`, lihat[Mengatur CloudFormation parameter dengan `AWS::CloudFormation::Interface` metadata](aws-cloudformation-interface.md).

# Mengatur CloudFormation parameter dengan `AWS::CloudFormation::Interface` metadata
<a name="aws-cloudformation-interface"></a>

`AWS::CloudFormation::Interface`adalah kunci metadata yang mendefinisikan bagaimana parameter dikelompokkan dan diurutkan di konsol. CloudFormation Secara default, konsol mencantumkan parameter input dalam urutan abjad berdasarkan ID logisnya saat Anda membuat atau memperbarui tumpukan di konsol. Dengan menggunakan kunci ini, Anda dapat menentukan pengelompokan parameter dan pengurutan Anda sendiri agar pengguna dapat secara efisien menentukan nilai parameter. Misalnya, Anda bisa mengelompokkan semua parameter terkait EC2 di satu grup dan semua parameter yerkait VPC di grup lain.

Pada kunci metadata, Anda dapat menentukan grup yang akan dibuat, parameter yang akan disertakan di setiap grup, dan urutan saat konsol menampilkan setiap parameter dalam kelompoknya. 

Anda juga dapat menentukan label untuk parameter. Label adalah nama atau deskripsi yang mudah dimengerti yang ditampilkan oleh konsol sebagai pengganti ID logis parameter. Label berguna untuk membantu pengguna memahami nilai yang ditentukan untuk setiap parameter. Misalnya, Anda dapat melabeli parameter `KeyPair` `Select an EC2 key pair`.

Semua parameter yang Anda referensikan dalam kunci metadata harus dinyatakan dalam `Parameters` bagian dari template.

**catatan**  
Hanya CloudFormation konsol yang menggunakan kunci `AWS::CloudFormation::Interface` metadata. AWS CLI dan panggilan API tidak menggunakan kunci ini.

## Sintaksis
<a name="aws-resource-cloudformation-interface-syntax"></a>

Untuk mendeklarasikan entitas ini di CloudFormation template Anda, gunakan sintaks berikut:

### JSON
<a name="aws-resource-cloudformation-interface-syntax.json"></a>

```
"Metadata" : {
  "AWS::CloudFormation::Interface" : {
    "ParameterGroups": [
      {
        "Label": {
          "default": "Group Label"
        },
        "Parameters": [
          "Parameter1",
          "Parameter2"
        ]
      }
    ],
    "ParameterLabels": {
      "Parameter1": {
        "default": "Friendly Name for Parameter1"
      }
    }
  }
}
```

### YAML
<a name="aws-resource-cloudformation-interface-syntax.yaml"></a>

```
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Group Label
        Parameters:
          - Parameter1
          - Parameter2
    ParameterLabels:
      Parameter1:
        default: Friendly Name for Parameter1
```

## Sifat-sifat
<a name="w2aac11c23c29c17c17"></a>

`ParameterGroups`  
Daftar jenis grup parameter, di mana Anda menentukan nama grup, parameter di setiap grup, dan urutan parameter yang ditampilkan.  
*Wajib*: Tidak    
`Label`  
Nama untuk grup parameter.  
*Wajib*: Tidak  
`default`  
Label default yang digunakan CloudFormation konsol untuk memberi nama grup parameter.  
*Wajib*: Tidak  
*Tipe*: String  
`Parameters`  
Daftar parameter case-sensitive logis IDs untuk disertakan dalam grup. Parameter harus sudah didefinisikan dalam `Parameters` bagian dari templat. Parameter dapat dimasukkan hanya dalam satu kelompok parameter.  
Konsol mencantumkan parameter yang tidak Anda kaitkan dengan grup parameter dalam urutan abjad di `Other parameters` grup.  
*Wajib*: Tidak  
*Jenis*: Daftar nilai String

`ParameterLabels`  
Pemetaan parameter dan nama ramahnya yang ditampilkan CloudFormation konsol saat tumpukan dibuat atau diperbarui.  
*Wajib*: Tidak    
Label parameter  
Label untuk parameter. Label mendefinisikan nama atau deskripsi ramah yang ditampilkan CloudFormation konsol di halaman **Tentukan Parameter** saat tumpukan dibuat atau diperbarui. Label parameter harus berupa ID logis peka huruf besar/kecil dari parameter yang valid yang telah dideklarasikan di `Parameters` bagian template.  
*Wajib*: Tidak  
`default`  
Label default yang digunakan CloudFormation konsol untuk memberi nama parameter.  
*Wajib*: Tidak  
*Tipe*: String

## Contoh
<a name="w2aac11c23c29c17c19"></a>

Contoh berikut menentukan dua grup parameter: `Network Configuration` dan `Amazon EC2 Configuration`. Grup `Network Configuration` mencakup parameter `VPCID`, `SubnetId`, dan `SecurityGroupID`, yang ditentukan di bagian `Parameters` dari templat (tidak ditampilkan). Urutan di mana konsol menunjukkan parameter ini ditentukan berdasarkan urutan parameter yang tercantum, yang dimulai dengan parameter `VPCID`. Contoh secara identik mengelompokkan dan mengurutkan parameter `Amazon EC2 Configuration`.

Contoh ini juga menentukan label untuk parameter `VPCID`. Konsol akan menunjukkan **Di VPC mana ini harus di-deploy?** dan bukan ID logis parameter (`VPCID`).

### JSON
<a name="aws-cloudformation-interface-example.json"></a>

```
"Metadata" : {
  "AWS::CloudFormation::Interface" : {
    "ParameterGroups" : [
      {
        "Label" : { "default" : "Network Configuration" },
        "Parameters" : [ "VPCID", "SubnetId", "SecurityGroupID" ]
      },
      {
        "Label" : { "default":"Amazon EC2 Configuration" },
        "Parameters" : [ "InstanceType", "KeyName" ]
      }
    ],
    "ParameterLabels" : {
      "VPCID" : { "default" : "Which VPC should this be deployed to?" }
    }
  }
}
```

### YAML
<a name="aws-cloudformation-interface-example.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface: 
    ParameterGroups: 
      - Label: 
          default: "Network Configuration"
        Parameters: 
          - VPCID
          - SubnetId
          - SecurityGroupID
      - Label: 
          default: "Amazon EC2 Configuration"
        Parameters: 
          - InstanceType
          - KeyName
    ParameterLabels: 
      VPCID: 
        default: "Which VPC should this be deployed to?"
```

### Grup parameter di konsol
<a name="w2aac11c23c29c17c19c11"></a>

Penggunaan kunci metadata dari contoh ini, gambar berikut menunjukkan cara konsol menampilkan grup parameter saat tumpukan dibuat atau diperbarui: **Grup parameter di konsol** 

![\[Konsol menunjukkan grup parameter untuk contoh ini.\]](http://docs.aws.amazon.com/id_id/AWSCloudFormation/latest/UserGuide/images/console-create-stack-parameter-groups.png)


# CloudFormation Rulessintaks template
<a name="rules-section-structure"></a>

`Rules`Bagian ini adalah bagian opsional dari CloudFormation template yang memungkinkan logika validasi kustom. Saat disertakan, bagian ini berisi fungsi aturan yang memvalidasi nilai parameter sebelum CloudFormation membuat atau memperbarui sumber daya apa pun.

Aturan berguna ketika batasan parameter standar tidak mencukupi. Misalnya, ketika SSL diaktifkan, sertifikat dan nama domain harus disediakan. Aturan dapat memastikan bahwa dependensi ini terpenuhi.

## Sintaksis
<a name="template-constraint-rules-syntax"></a>

`Rules`Bagian ini menggunakan sintaks berikut:

### JSON
<a name="rules-section-structure-syntax.json"></a>

Bagian `Rules` dari templat terdiri dari nama kunci `Rules`, diikuti oleh titik dua. Anda harus menggunakan tanda kurung untuk membungkus seluruh deklarasi aturan. Jika Anda mendeklarasikan beberapa aturan, mereka dibatasi oleh koma. Untuk setiap aturan, Anda mendeklarasi nama logis dalam tanda kutip diikuti oleh titik dua dan tanda kurung yang membungkus syarat dan pernyataan aturan.

```
{
    "Rules": {
        "LogicalRuleName1": {
            "RuleCondition": {
                "rule-specific intrinsic function": "Value"
            },
            "Assertions": [
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                },
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                }
            ]
        },
        "LogicalRuleName2": {
            "Assertions": [
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                }
            ]
        }
    }
}
```

### YAML
<a name="rules-section-structure-syntax.yaml"></a>

```
Rules:
  LogicalRuleName1:
    RuleCondition:
      rule-specific intrinsic function: Value
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
  LogicalRuleName2:
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
```

### Bidang aturan
<a name="rules-section-fields"></a>

Bagian `Rules` dapat mencakup bidang-bidang berikut.

**Logical ID (juga disebut *nama logis*)**  
Pengidentifikasi unik untuk setiap aturan.

**`RuleCondition` (opsional)**  
Properti yang menentukan kapan aturan berlaku. Jika Anda tidak menentukan syarat aturan, pernyataan aturan selalu berlaku. Untuk setiap aturan, Anda hanya dapat menentukan satu syarat aturan. 

**`Assertions`(diperlukan)**  
Satu atau lebih pernyataan yang menentukan nilai yang dapat diterima untuk parameter tertentu.

**`Assert`**  
Suatu kondisi yang harus dievaluasi`true`.

**`AssertDescription`**  
Pesan yang ditampilkan saat pernyataan gagal.

## Fungsi intrinsik khusus aturan
<a name="rules-specific-intrinsic-section-structure"></a>

Untuk menentukan aturan Anda, Anda harus menggunakan *fungsi khusus aturan*, yang merupakan fungsi yang hanya dapat digunakan di `Rules` bagian templat. Sementara fungsi-fungsi ini dapat bersarang, hasil akhir dari kondisi aturan atau pernyataan harus salah satu atau. `true` `false`

Fungsi aturan berikut tersedia:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-contains](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-contains)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberequals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberequals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberin)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-refall](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-refall)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueof](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueof)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueofall](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueofall)

Fungsi-fungsi ini digunakan dalam kondisi atau pernyataan aturan. Properti kondisi menentukan apakah CloudFormation berlaku pernyataan. Jika kondisi mengevaluasi`true`, CloudFormation mengevaluasi pernyataan untuk memverifikasi apakah nilai parameter valid ketika produk yang disediakan dibuat atau diperbarui. Jika nilai parameter tidak valid, CloudFormation tidak membuat atau memperbarui tumpukan. Jika kondisi dievaluasi`false`, CloudFormation tidak memeriksa nilai parameter dan melanjutkan operasi tumpukan.

## Contoh
<a name="template-constraint-rules-example"></a>

**Topics**
+ [Memverifikasi nilai parameter secara bersyarat](#template-constraint-rules-example-verify)
+ [Validasi lintas parameter](#template-cross-parameter-rules-example)

### Memverifikasi nilai parameter secara bersyarat
<a name="template-constraint-rules-example-verify"></a>

Dalam contoh berikut, dua aturan tersebut memeriksa nilai parameter `InstanceType`. Tergantung pada nilai parameter lingkungan (`test` atau `prod`), pengguna harus menentukan `t3.medium` atau `t3.large` untuk parameter `InstanceType`. Parameter `InstanceType` dan `Environment` harus dideklarasikan dalam bagian `Parameters` dari templat yang sama.

#### JSON
<a name="rules-section-example-conditionally-verify.json"></a>

```
{
  "Rules": {
    "testInstanceType": {
      "RuleCondition": {
        "Fn::Equals": [
          {"Ref": "Environment"},
          "test"
        ]
      },
      "Assertions": [
        {
          "Assert": {
            "Fn::Contains": [
              ["t3.medium"],
              {"Ref": "InstanceType"}
            ]
          },
          "AssertDescription": "For a test environment, the instance type must be t3.medium"
        }
      ]
    },
    "prodInstanceType": {
      "RuleCondition": {
        "Fn::Equals": [
          {"Ref": "Environment"},
          "prod"
        ]
      },
      "Assertions": [
        {
          "Assert": {
            "Fn::Contains": [
              ["t3.large"],
              {"Ref": "InstanceType"}
            ]
          },
          "AssertDescription": "For a production environment, the instance type must be t3.large"
        }
      ]
    }
  }
}
```

#### YAML
<a name="rules-section-example-conditionally-verify.yaml"></a>

```
Rules:
  testInstanceType:
    RuleCondition: !Equals 
      - !Ref Environment
      - test
    Assertions:
      - Assert:
          'Fn::Contains':
            - - t3.medium
            - !Ref InstanceType
        AssertDescription: 'For a test environment, the instance type must be t3.medium'
  prodInstanceType:
    RuleCondition: !Equals 
      - !Ref Environment
      - prod
    Assertions:
      - Assert:
          'Fn::Contains':
            - - t3.large
            - !Ref InstanceType
        AssertDescription: 'For a production environment, the instance type must be t3.large'
```

### Validasi lintas parameter
<a name="template-cross-parameter-rules-example"></a>

Contoh template berikut menunjukkan penggunaan aturan untuk validasi lintas parameter. Mereka membuat situs web sampel yang berjalan pada grup Auto Scaling di belakang penyeimbang beban. Situs web tersedia di port 80 atau 443 tergantung pada parameter input. Instans dalam grup Auto Scaling dapat dikonfigurasi untuk mendengarkan pada port apa pun (dengan 8888 sebagai default).

Aturan dalam template ini memvalidasi parameter input sebelum pembuatan stack. Mereka memverifikasi bahwa semua subnet milik VPC yang ditentukan dan memastikan bahwa ketika `UseSSL` parameter disetel `Yes` ke, baik sertifikat SSL ARN dan nama zona yang dihosting disediakan.

**catatan**  
Anda akan ditagih untuk AWS sumber daya yang digunakan jika Anda membuat tumpukan dari template ini.

#### JSON
<a name="rules-section-example-cross-parameter-validation.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "VpcId": {
      "Type": "AWS::EC2::VPC::Id",
      "Description": "VpcId of your existing Virtual Private Cloud (VPC)",
      "ConstraintDescription": "must be the VPC Id of an existing Virtual Private Cloud."
    },
    "Subnets": {
      "Type": "List<AWS::EC2::Subnet::Id>",
      "Description": "The list of SubnetIds in your Virtual Private Cloud (VPC)",
      "ConstraintDescription": "must be a list of at least two existing subnets associated with at least two different availability zones."
    },
    "InstanceType": {
      "Description": "WebServer EC2 instance type",
      "Type": "String",
      "Default": "t2.micro",
      "AllowedValues": ["t2.micro", "t3.micro"],
      "ConstraintDescription": "must be a valid EC2 instance type."
    },
    "KeyName": {
      "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
      "Type": "AWS::EC2::KeyPair::KeyName",
      "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
    },
    "SSHLocation": {
      "Description": "The IP address range that can be used to SSH to the EC2 instances",
      "Type": "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default": "0.0.0.0/0",
      "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "UseSSL": {
      "AllowedValues": ["Yes", "No"],
      "Default": "No",
      "Description": "Select \"Yes\" to implement SSL, \"No\" to skip (default).",
      "Type": "String"
    },
    "ALBSSLCertificateARN": {
      "Default": "",
      "Description": "[Optional] The ARN of the SSL certificate to be used for the Application Load Balancer",
      "Type": "String"
    },
    "HostedZoneName": {
      "AllowedPattern": "^$|(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$",
      "Default": "",
      "Description": "[Optional] The domain name of a valid Hosted Zone on AWS.",
      "Type": "String"
    }
  },
  "Conditions": {
    "UseALBSSL": {"Fn::Equals": [{"Ref": "UseSSL"}, "Yes"]}
  },
  "Rules": {
    "SubnetsInVPC": {
      "Assertions": [
        {
          "Assert": {"Fn::EachMemberEquals": [{"Fn::ValueOf": ["Subnets", "VpcId"]}, {"Ref": "VpcId"}]},
          "AssertDescription": "All subnets must be in the VPC"
        }
      ]
    },
    "ValidateHostedZone": {
      "RuleCondition": {"Fn::Equals": [{"Ref": "UseSSL"}, "Yes"]},
      "Assertions": [
        {
          "Assert": {"Fn::Not": [{"Fn::Equals": [{"Ref": "ALBSSLCertificateARN"}, ""]}]},
          "AssertDescription": "ACM Certificate value cannot be empty if SSL is required"
        },
        {
          "Assert": {"Fn::Not": [{"Fn::Equals": [{"Ref": "HostedZoneName"}, ""]}]},
          "AssertDescription": "Route53 Hosted Zone Name is mandatory when SSL is required"
        }
      ]
    }
  },
  "Resources": {
    "WebServerGroup": {
      "Type": "AWS::AutoScaling::AutoScalingGroup",
      "Properties": {
        "VPCZoneIdentifier": {"Ref": "Subnets"},
        "LaunchTemplate": {
          "LaunchTemplateId": {"Ref": "LaunchTemplate"},
          "Version": {"Fn::GetAtt": ["LaunchTemplate","LatestVersionNumber"]}
        },
        "MinSize": "2",
        "MaxSize": "2",
        "TargetGroupARNs": [{"Ref": "ALBTargetGroup"}]
      },
      "CreationPolicy": {
        "ResourceSignal": {"Timeout": "PT15M"}
      },
      "UpdatePolicy": {
        "AutoScalingRollingUpdate": {
          "MinInstancesInService": "1",
          "MaxBatchSize": "1",
          "PauseTime": "PT15M",
          "WaitOnResourceSignals": true
        }
      }
    },
    "LaunchTemplate": {
      "Type": "AWS::EC2::LaunchTemplate",
      "Metadata": {
        "Comment": "Install a simple application",
        "AWS::CloudFormation::Init": {
          "config": {
            "packages": {"yum": {"httpd": []}},
            "files": {
              "/var/www/html/index.html": {
                "content": {"Fn::Join": ["\n", ["<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>"]]},
                "mode": "000644",
                "owner": "root",
                "group": "root"
              },
              "/etc/cfn/cfn-hup.conf": {
                "content": {"Fn::Join": ["", [
                  "[main]\n",
                  "stack=", {"Ref": "AWS::StackId"}, "\n",
                  "region=", {"Ref": "AWS::Region"}, "\n"
                ]]},
                "mode": "000400",
                "owner": "root",
                "group": "root"
              },
              "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {
                "content": {"Fn::Join": ["", [
                  "[cfn-auto-reloader-hook]\n",
                  "triggers=post.update\n",
                  "path=Resources.LaunchTemplate.Metadata.AWS::CloudFormation::Init\n",
                  "action=/opt/aws/bin/cfn-init -v ",
                  "         --stack ", {"Ref": "AWS::StackName"},
                  "         --resource LaunchTemplate ",
                  "         --region ", {"Ref": "AWS::Region"}, "\n",
                  "runas=root\n"
                ]]},
                "mode": "000400",
                "owner": "root",
                "group": "root"
              }
            },
            "services": {
              "sysvinit": {
                "httpd": {
                  "enabled": "true",
                  "ensureRunning": "true"
                },
                "cfn-hup": {
                  "enabled": "true",
                  "ensureRunning": "true",
                  "files": [
                    "/etc/cfn/cfn-hup.conf",
                    "/etc/cfn/hooks.d/cfn-auto-reloader.conf"
                  ]
                }
              }
            }
          }
        }
      },
      "Properties": {
        "LaunchTemplateName": {"Fn::Sub": "${AWS::StackName}-launch-template"},
        "LaunchTemplateData": {
          "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
          "SecurityGroupIds": [{"Ref": "InstanceSecurityGroup"}],
          "InstanceType": {"Ref": "InstanceType"},
          "KeyName": {"Ref": "KeyName"},
          "UserData": {
            "Fn::Base64": {"Fn::Join": ["", [
              "#!/bin/bash\n",
              "yum install -y aws-cfn-bootstrap\n",
              "/opt/aws/bin/cfn-init -v ",
              "         --stack ", {"Ref": "AWS::StackName"},
              "         --resource LaunchTemplate ",
              "         --region ", {"Ref": "AWS::Region"}, "\n",
              "/opt/aws/bin/cfn-signal -e $? ",
              "         --stack ", {"Ref": "AWS::StackName"},
              "         --resource WebServerGroup ",
              "         --region ", {"Ref": "AWS::Region"}, "\n"
            ]]}
          }
        }
      }
    },
    "ELBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Allow access to the ELB",
        "VpcId": {"Ref": "VpcId"},
        "SecurityGroupIngress": [{
          "Fn::If": [
            "UseALBSSL",
            {
              "IpProtocol": "tcp",
              "FromPort": 443,
              "ToPort": 443,
              "CidrIp": "0.0.0.0/0"
            },
            {
              "IpProtocol": "tcp",
              "FromPort": 80,
              "ToPort": 80,
              "CidrIp": "0.0.0.0/0"
            }
          ]
        }]
      }
    },
    "ApplicationLoadBalancer": {
      "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties": {
        "Subnets": {"Ref": "Subnets"},
        "SecurityGroups": [{"Ref": "ELBSecurityGroup"}]
      }
    },
    "ALBListener": {
      "Type": "AWS::ElasticLoadBalancingV2::Listener",
      "Properties": {
        "DefaultActions": [{
          "Type": "forward",
          "TargetGroupArn": {"Ref": "ALBTargetGroup"}
        }],
        "LoadBalancerArn": {"Ref": "ApplicationLoadBalancer"},
        "Port": {"Fn::If": ["UseALBSSL", 443, 80]},
        "Protocol": {"Fn::If": ["UseALBSSL", "HTTPS", "HTTP"]},
        "Certificates": [{
          "Fn::If": [
            "UseALBSSL",
            {"CertificateArn": {"Ref": "ALBSSLCertificateARN"}},
            {"Ref": "AWS::NoValue"}
          ]
        }]
      }
    },
    "ALBTargetGroup": {
      "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties": {
        "HealthCheckIntervalSeconds": 30,
        "HealthCheckTimeoutSeconds": 5,
        "HealthyThresholdCount": 3,
        "Port": 80,
        "Protocol": "HTTP",
        "UnhealthyThresholdCount": 5,
        "VpcId": {"Ref": "VpcId"}
      }
    },
    "InstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Enable SSH access and HTTP access on the inbound port",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 80,
            "ToPort": 80,
            "SourceSecurityGroupId": {"Fn::Select": [0, {"Fn::GetAtt": ["ApplicationLoadBalancer", "SecurityGroups"]}]}
          },
          {
            "IpProtocol": "tcp",
            "FromPort": 22,
            "ToPort": 22,
            "CidrIp": {"Ref": "SSHLocation"}
          }
        ],
        "VpcId": {"Ref": "VpcId"}
      }
    },
    "RecordSet": {
      "Type": "AWS::Route53::RecordSetGroup",
      "Condition": "UseALBSSL",
      "Properties": {
        "HostedZoneName": {"Fn::Join": ["", [{"Ref": "HostedZoneName"}, "."]]},
        "RecordSets": [{
          "Name": {"Fn::Join": ["", [
            {"Fn::Select": ["0", {"Fn::Split": [".", {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}]}]},
            ".",
            {"Ref": "HostedZoneName"},
            "."
          ]]},
          "Type": "A",
          "AliasTarget": {
            "DNSName": {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]},
            "EvaluateTargetHealth": true,
            "HostedZoneId": {"Fn::GetAtt": ["ApplicationLoadBalancer", "CanonicalHostedZoneID"]}
          }
        }]
      }
    }
  },
  "Outputs": {
    "URL": {
      "Description": "URL of the website",
      "Value": {"Fn::Join": ["", [
        {"Fn::If": [
          "UseALBSSL",
          {"Fn::Join": ["", [
            "https://",
            {"Fn::Join": ["", [
              {"Fn::Select": ["0", {"Fn::Split": [".", {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}]}]},
              ".",
              {"Ref": "HostedZoneName"},
              "."
            ]]}
          ]]},
          {"Fn::Join": ["", [
            "http://",
            {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}
          ]]}
        ]}
      ]]}
    }
  }
}
```

#### YAML
<a name="rules-section-example-syntax.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VpcId of your existing Virtual Private Cloud (VPC)
    ConstraintDescription: must be the VPC Id of an existing Virtual Private Cloud.
  Subnets:
    Type: List<AWS::EC2::Subnet::Id>
    Description: The list of SubnetIds in your Virtual Private Cloud (VPC)
    ConstraintDescription: >-
      must be a list of at least two existing subnets associated with at least
      two different availability zones. They should be residing in the selected
      Virtual Private Cloud.
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t3.micro
    ConstraintDescription: must be a valid EC2 instance type.
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  UseSSL:
    AllowedValues:
      - 'Yes'
      - 'No'
    ConstraintDescription: Select Yes to create a HTTPS Listener
    Default: 'No'
    Description: 'Select "Yes" to implement SSL, "No" to skip (default).'
    Type: String
  ALBSSLCertificateARN:
    Default: ''
    Description: >-
      [Optional] The ARN of the SSL certificate to be used for the Application
      Load Balancer
    Type: String
  HostedZoneName:
    AllowedPattern: >-
      ^$|(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$
    Default: ''
    Description: '[Optional] The domain name of a valid Hosted Zone on AWS.'
    Type: String
Conditions:
  UseALBSSL: !Equals 
    - !Ref UseSSL
    - 'Yes'
Rules:
  SubnetsInVPC:
    Assertions:
      - Assert:
          'Fn::EachMemberEquals':
            - 'Fn::ValueOf':
                - Subnets
                - VpcId
            - Ref: VpcId
        AssertDescription: All subnets must be in the VPC
  ValidateHostedZone:
    RuleCondition: !Equals 
      - !Ref UseSSL
      - 'Yes'
    Assertions:
      - Assert: !Not 
          - !Equals 
            - !Ref ALBSSLCertificateARN
            - ''
        AssertDescription: ACM Certificate value cannot be empty if SSL is required
      - Assert: !Not 
          - !Equals 
            - !Ref HostedZoneName
            - ''
        AssertDescription: Route53 Hosted Zone Name is mandatory when SSL is required
Resources:
  WebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier: !Ref Subnets
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MinSize: '2'
      MaxSize: '2'
      TargetGroupARNs:
        - !Ref ALBTargetGroup
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: '1'
        MaxBatchSize: '1'
        PauseTime: PT15M
        WaitOnResourceSignals: 'true'
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Metadata:
      Comment: Install a simple application
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          files:
            /var/www/html/index.html:
              content: !Join 
                - |+
                - - >-
                    <h1>Congratulations, you have successfully launched the AWS
                    CloudFormation sample.</h1>
              mode: '000644'
              owner: root
              group: root
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |-
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.LaunchTemplate.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchTemplate --region ${AWS::Region}
                runas=root
              mode: '000400'
              owner: root
              group: root
          services:
            sysvinit:
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              cfn-hup:
                enabled: 'true'
                ensureRunning: 'true'
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    Properties:
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
        SecurityGroupIds:
        - !Ref InstanceSecurityGroup
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        UserData: !Base64
          Fn::Sub: |
            #!/bin/bash
            yum install -y aws-cfn-bootstrap
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchTemplate --region ${AWS::Region}
            /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
  ELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow access to the ELB
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - !If 
          - UseALBSSL
          - IpProtocol: tcp
            FromPort: 443
            ToPort: 443
            CidrIp: 0.0.0.0/0
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: 0.0.0.0/0
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Subnets: !Ref Subnets
      SecurityGroups:
        - !Ref ELBSecurityGroup
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref ALBTargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: !If
        - UseALBSSL
        - 443
        - 80
      Protocol: !If 
        - UseALBSSL
        - HTTPS
        - HTTP
      Certificates:
        - !If 
          - UseALBSSL
          - CertificateArn: !Ref ALBSSLCertificateARN
          - !Ref 'AWS::NoValue'
  ALBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 3
      Port: 80
      Protocol: HTTP
      UnhealthyThresholdCount: 5
      VpcId: !Ref VpcId
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access and HTTP access on the inbound port
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupId: !Select 
            - 0
            - !GetAtt 
              - ApplicationLoadBalancer
              - SecurityGroups
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
      VpcId: !Ref VpcId
  RecordSet:
    Type: AWS::Route53::RecordSetGroup
    Condition: UseALBSSL
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZoneName
          - .
      RecordSets:
        - Name: !Join 
            - ''
            - - !Select 
                - '0'
                - !Split 
                  - .
                  - !GetAtt 
                    - ApplicationLoadBalancer
                    - DNSName
              - .
              - !Ref HostedZoneName
              - .
          Type: A
          AliasTarget:
            DNSName: !GetAtt 
              - ApplicationLoadBalancer
              - DNSName
            EvaluateTargetHealth: true
            HostedZoneId: !GetAtt 
              - ApplicationLoadBalancer
              - CanonicalHostedZoneID
Outputs:
  URL:
    Description: URL of the website
    Value: !Join 
      - ''
      - - !If 
          - UseALBSSL
          - !Join 
            - ''
            - - 'https://'
              - !Join 
                - ''
                - - !Select 
                    - '0'
                    - !Split 
                      - .
                      - !GetAtt 
                        - ApplicationLoadBalancer
                        - DNSName
                  - .
                  - !Ref HostedZoneName
                  - .
          - !Join 
            - ''
            - - 'http://'
              - !GetAtt 
                - ApplicationLoadBalancer
                - DNSName
```

# CloudFormation Conditionssintaks template
<a name="conditions-section-structure"></a>

Bagian `Conditions` opsional berisi pernyataan yang menentukan keadaan di mana entitas dibuat atau dikonfigurasi. Misalnya, Anda dapat membuat kondisi dan mengaitkannya dengan sumber daya atau output sehingga CloudFormation menciptakan sumber daya atau output hanya jika kondisi benar. Demikian pula, Anda dapat mengaitkan kondisi dengan properti sehingga CloudFormation menetapkan properti ke nilai tertentu hanya jika kondisi benar. Jika kondisinya salah, CloudFormation tetapkan properti ke nilai alternatif yang Anda tentukan.

Anda dapat menggunakan kondisi saat ingin menggunakan kembali template untuk membuat sumber daya dalam konteks yang berbeda, seperti lingkungan pengujian versus produksi. Misalnya, dalam template Anda, Anda dapat menambahkan parameter `EnvironmentType` input yang menerima salah satu `prod` atau `test` sebagai input. Untuk `prod` lingkungan, Anda mungkin menyertakan instans EC2 dengan kemampuan tertentu, sedangkan untuk `test` lingkungan, Anda mungkin menggunakan kemampuan yang lebih rendah untuk menghemat uang. Definisi kondisi ini memungkinkan Anda untuk menentukan sumber daya mana yang dibuat dan bagaimana mereka dikonfigurasi untuk setiap jenis lingkungan.

## Sintaksis
<a name="conditions-section-structure-syntax"></a>

Bagian `Conditions` terdiri dari nama kunci `Conditions`. Setiap deklarasi kondisi mencakup ID logis dan satu atau lebih fungsi intrinsik. 

### JSON
<a name="conditions-section-structure-syntax.json"></a>

```
"Conditions": {
  "LogicalConditionName1": {
    "Intrinsic function": ...[
  },

  "LogicalConditionName2": {
    "Intrinsic function": ...
  }
}
```

### YAML
<a name="conditions-section-structure-syntax.yaml"></a>

```
Conditions:
  LogicalConditionName1:
    Intrinsic function:
      ...

  LogicalConditionName2:
    Intrinsic function:
      ...
```

## Bagaimana kondisi bekerja
<a name="conditions-section-structure-overview"></a>

Untuk menggunakan kondisi, ikuti langkah-langkah ini:

1. **Tambahkan definisi parameter** - Tentukan input yang akan dievaluasi kondisi Anda di `Parameters` bagian template Anda. Kondisi mengevaluasi benar atau salah berdasarkan nilai parameter masukan ini. Perhatikan bahwa parameter semu tersedia secara otomatis dan tidak memerlukan definisi eksplisit di bagian tersebut. `Parameters` Untuk informasi selengkapnya tentang parameter semu, lihat[Dapatkan AWS nilai menggunakan parameter semu](pseudo-parameter-reference.md).

1. **Tambahkan definisi kondisi** - Tentukan kondisi di `Conditions` bagian menggunakan fungsi intrinsik seperti `Fn::If` atau. `Fn::Equals` Kondisi ini menentukan kapan CloudFormation menciptakan sumber daya terkait. Kondisi dapat didasarkan pada:
   + Nilai parameter masukan atau semu
   + Syarat lainnya
   + Nilai pemetaan

   Namun, Anda tidak dapat mereferensikan sumber daya logis IDs atau atributnya dalam kondisi.

1. **Mengaitkan kondisi dengan sumber daya atau output** — Kondisi referensi dalam sumber daya atau output menggunakan `Condition` kunci dan ID logis kondisi. Secara opsional, gunakan `Fn::If` di bagian lain dari template (seperti nilai properti) untuk menetapkan nilai berdasarkan kondisi. Untuk informasi selengkapnya, lihat [Menggunakan `Condition` kunci](#using-conditions-in-templates).

CloudFormation mengevaluasi kondisi saat membuat atau memperbarui tumpukan. CloudFormation menciptakan entitas yang terkait dengan kondisi sebenarnya dan mengabaikan entitas yang terkait dengan kondisi palsu. CloudFormation juga mengevaluasi kembali kondisi ini selama setiap pembaruan tumpukan sebelum memodifikasi sumber daya apa pun. Entitas yang tetap terkait dengan kondisi sebenarnya diperbarui, sedangkan entitas yang terkait dengan kondisi palsu dihapus.

**penting**  
Selama pembaruan tumpukan, Anda tidak dapat memperbarui syarat dengan sendirinya. Anda hanya dapat memperbarui syarat jika menyertakan perubahan yang menambahkan, mengubah, atau menghapus sumber daya.

## Fungsi intrinsik syarat
<a name="conditions-section-structure-functions"></a>

Anda dapat menggunakan fungsi intrinsik berikut untuk menentukan syarat:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)

**catatan**  
`Fn::If` hanya didukung dalam atribut metadata, atribut kebijakan pembaruan, dan nilai properti di bagian `Resources` dan bagian `Outputs` dari templat.

## Menggunakan `Condition` kunci
<a name="using-conditions-in-templates"></a>

Setelah kondisi ditentukan, Anda dapat menerapkannya di beberapa tempat di template, seperti `Resources` dan`Outputs`, menggunakan `Condition` kunci. `Condition`Kunci mereferensikan nama logis suatu kondisi dan mengembalikan hasil evaluasi dari kondisi yang ditentukan.

**Topics**
+ [Mengaitkan kondisi dengan sumber daya](#associate-conditions-with-resources)
+ [Kaitkan kondisi dengan output](#associate-conditions-with-outputs)
+ [Kondisi referensi dalam kondisi lain](#reference-conditions-in-other-conditions)
+ [Mengembalikan nilai properti secara kondisional menggunakan `Fn::If`](#conditional-return-property-values-using-fn-if)

### Mengaitkan kondisi dengan sumber daya
<a name="associate-conditions-with-resources"></a>

Untuk membuat sumber daya secara kondisional, tambahkan `Condition` kunci dan ID logis dari kondisi sebagai atribut ke sumber daya. CloudFormation menciptakan sumber daya hanya ketika kondisi dievaluasi ke true.

#### JSON
<a name="associate-conditions-with-resources.json"></a>

```
"NewVolume" : {
  "Type" : "AWS::EC2::Volume",
  "Condition" : "IsProduction",
  "Properties" : {
     "Size" : "100",
     "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]}
  }
}
```

#### YAML
<a name="associate-conditions-with-resources.yaml"></a>

```
NewVolume:
  Type: AWS::EC2::Volume
  Condition: IsProduction
  Properties:
    Size: 100
    AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
```

### Kaitkan kondisi dengan output
<a name="associate-conditions-with-outputs"></a>

Anda juga dapat mengaitkan kondisi dengan output. CloudFormation menciptakan output hanya ketika kondisi terkait mengevaluasi ke true.

#### JSON
<a name="associate-conditions-with-outputs.json"></a>

```
"Outputs" : {
  "VolumeId" : {
    "Condition" : "IsProduction",
    "Value" : { "Ref" : "NewVolume" }
  }
}
```

#### YAML
<a name="associate-conditions-with-outputs.yaml"></a>

```
Outputs:
  VolumeId:
    Condition: IsProduction
    Value: !Ref NewVolume
```

### Kondisi referensi dalam kondisi lain
<a name="reference-conditions-in-other-conditions"></a>

Saat menentukan kondisi di `Conditions` bagian ini, Anda dapat mereferensikan kondisi lain menggunakan `Condition` kunci. Ini memungkinkan Anda untuk membuat logika kondisional yang lebih kompleks dengan menggabungkan beberapa kondisi.

Dalam contoh berikut, `IsProdAndFeatureEnabled` kondisi mengevaluasi menjadi benar hanya jika `IsProduction` dan `IsFeatureEnabled` kondisi dievaluasi menjadi benar.

#### JSON
<a name="reference-conditions-in-other-conditions.json"></a>

```
"Conditions": {
  "IsProduction" : {"Fn::Equals" : [{"Ref" : "Environment"}, "prod"]},
  "IsFeatureEnabled" : { "Fn::Equals" : [{"Ref" : "FeatureFlag"}, "enabled"]},
  "IsProdAndFeatureEnabled" : {
    "Fn::And" : [
      {"Condition" : "IsProduction"},
      {"Condition" : "IsFeatureEnabled"}
    ]
  }
}
```

#### YAML
<a name="reference-conditions-in-other-conditions.yaml"></a>

```
Conditions:
  IsProduction:
    !Equals [!Ref Environment, "prod"]
  IsFeatureEnabled:
    !Equals [!Ref FeatureFlag, "enabled"]
  IsProdAndFeatureEnabled: !And
    - !Condition IsProduction
    - !Condition IsFeatureEnabled
```

### Mengembalikan nilai properti secara kondisional menggunakan `Fn::If`
<a name="conditional-return-property-values-using-fn-if"></a>

Untuk kontrol yang lebih terperinci, Anda dapat menggunakan fungsi `Fn::If` intrinsik untuk mengembalikan salah satu dari dua nilai properti secara kondisional dalam sumber daya atau output. Fungsi ini mengevaluasi kondisi dan mengembalikan satu nilai jika kondisi benar dan nilai lain jika kondisi palsu.

#### Nilai properti bersyarat
<a name="using-fn-if-for-conditional-values"></a>

Contoh berikut menunjukkan pengaturan jenis instans EC2 berdasarkan kondisi lingkungan. Jika `IsProduction` kondisi dievaluasi ke true, tipe instance disetel ke`c5.xlarge`. Jika tidak, itu diatur ke`t3.small`.

##### JSON
<a name="using-fn-if-for-conditional-values.json"></a>

```
"Properties" : {
  "InstanceType" : {
    "Fn::If" : [
      "IsProduction",
      "c5.xlarge",
      "t3.small"
    ]
  }
}
```

##### YAML
<a name="using-fn-if-for-conditional-values.yaml"></a>

```
Properties:
  InstanceType: !If
    - IsProduction
    - c5.xlarge
    - t3.small
```

#### Penghapusan properti bersyarat
<a name="using-fn-if-with-novalue"></a>

Anda juga dapat menggunakan parameter `AWS::NoValue` semu sebagai nilai kembali untuk menghapus properti yang sesuai ketika kondisi salah.

##### JSON
<a name="using-fn-if-with-novalue.json"></a>

```
"DBSnapshotIdentifier" : {
  "Fn::If" : [
    "UseDBSnapshot",
    {"Ref" : "DBSnapshotName"},
    {"Ref" : "AWS::NoValue"}
  ]
}
```

##### YAML
<a name="using-fn-if-with-novalue.yaml"></a>

```
DBSnapshotIdentifier: !If
  - UseDBSnapshot
  - !Ref DBSnapshotName
  - !Ref "AWS::NoValue"
```

## Contoh
<a name="conditions-section-structure-examples"></a>

**Topics**
+ [Pembuatan sumber daya berbasis lingkungan](#environment-based-resource-creation)
+ [Penyediaan sumber daya multi-kondisi](#multi-condition-resource-provisioning)

### Pembuatan sumber daya berbasis lingkungan
<a name="environment-based-resource-creation"></a>

Contoh berikut ini menyediakan instans EC2, dan secara kondisional membuat dan melampirkan volume EBS baru hanya jika tipe lingkungannya. `prod` Jika lingkungannya`test`, mereka hanya membuat instans EC2 tanpa volume tambahan.

#### JSON
<a name="conditions-section-example-resource-creation.json"></a>

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

#### YAML
<a name="conditions-section-example-resource-creation.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Description: Environment type
    Default: test
    Type: String
    AllowedValues:
      - prod
      - test
    ConstraintDescription: must specify prod or test
Conditions:
  IsProduction: !Equals
    - !Ref EnvType
    - prod
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-1234567890abcdef0
      InstanceType: c5.xlarge
  MountPoint:
    Type: AWS::EC2::VolumeAttachment
    Condition: IsProduction
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref NewVolume
      Device: /dev/sdh
  NewVolume:
    Type: AWS::EC2::Volume
    Condition: IsProduction
    Properties:
      Size: 100
      AvailabilityZone: !GetAtt
        - EC2Instance
        - AvailabilityZone
```

### Penyediaan sumber daya multi-kondisi
<a name="multi-condition-resource-provisioning"></a>

Contoh berikut membuat bucket S3 secara kondisional jika nama bucket disediakan, dan lampirkan kebijakan bucket hanya jika lingkungan disetel ke. `prod` Jika tidak ada nama bucket yang diberikan atau lingkungannya`test`, tidak ada sumber daya yang dibuat.

#### JSON
<a name="conditions-section-example-multi-condition.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "EnvType": {
            "Type": "String",
            "AllowedValues": [
                "prod",
                "test"
            ]
        },
        "BucketName": {
            "Default": "",
            "Type": "String"
        }
    },
    "Conditions": {
        "IsProduction": {
            "Fn::Equals": [
                {
                    "Ref": "EnvType"
                },
                "prod"
            ]
        },
        "CreateBucket": {
            "Fn::Not": [
                {
                    "Fn::Equals": [
                        {
                            "Ref": "BucketName"
                        },
                        ""
                    ]
                }
            ]
        },
        "CreateBucketPolicy": {
            "Fn::And": [
                {
                    "Condition": "IsProduction"
                },
                {
                    "Condition": "CreateBucket"
                }
            ]
        }
    },
    "Resources": {
        "Bucket": {
            "Type": "AWS::S3::Bucket",
            "Condition": "CreateBucket",
            "Properties": {
                "BucketName": {
                    "Ref": "BucketName"
                }
            }
        },
        "Policy": {
            "Type": "AWS::S3::BucketPolicy",
            "Condition": "CreateBucketPolicy",
            "Properties": {
                "Bucket": {
                    "Ref": "Bucket"
                },
                "PolicyDocument": { ... }
            }
        }
    }
}
```

#### YAML
<a name="conditions-section-example-multi-condition.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Type: String
    AllowedValues:
      - prod
      - test
  BucketName:
    Default: ''
    Type: String
Conditions:
  IsProduction: !Equals
    - !Ref EnvType
    - prod
  CreateBucket: !Not
    - !Equals
      - !Ref BucketName
      - ''
  CreateBucketPolicy: !And
    - !Condition IsProduction
    - !Condition CreateBucket
Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Condition: CreateBucket
    Properties:
      BucketName: !Ref BucketName
  Policy:
    Type: AWS::S3::BucketPolicy
    Condition: CreateBucketPolicy
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument: ...
```

Dalam contoh ini, `CreateBucketPolicy` kondisi menunjukkan bagaimana mereferensikan kondisi lain menggunakan `Condition` kunci. Kebijakan dibuat hanya ketika kedua `IsProduction` dan `CreateBucket` kondisi dievaluasi menjadi benar.

**catatan**  
Untuk contoh penggunaan kondisi yang lebih kompleks, lihat topik [Conditionatribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-condition.html) di *Panduan Referensi CloudFormation Template*.

# CloudFormation Transformbagian template
<a name="transform-section-structure"></a>

`Transform`Bagian opsional menentukan satu atau lebih makro yang CloudFormation digunakan untuk memproses template Anda dengan cara tertentu. 

Makro dapat melakukan tugas-tugas sederhana seperti menemukan dan mengganti teks, atau mereka dapat membuat transformasi yang lebih luas ke seluruh template. CloudFormation mengeksekusi makro dalam urutan yang ditentukan. Saat Anda membuat set perubahan, CloudFormation buat set perubahan yang menyertakan konten template yang diproses. Anda kemudian dapat meninjau perubahan dan mengeksekusi set perubahan. Untuk informasi selengkapnya tentang cara kerja makro, lihat[Lakukan pemrosesan kustom pada CloudFormation template dengan makro template](template-macros.md).

CloudFormation juga mendukung *transformasi*, yang merupakan makro yang dihosting oleh. CloudFormation CloudFormation memperlakukan transformasi ini sama seperti makro apa pun yang Anda buat dalam hal urutan eksekusi dan cakupan. Untuk informasi selengkapnya, lihat [Referensi Transform](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-reference.html).

Untuk mendeklarasikan beberapa makro, gunakan format daftar dan tentukan satu atau lebih makro.

Misalnya, dalam contoh templat di bawah ini`AWS::Serverless`, CloudFormation mengevaluasi `MyMacro` dan kemudian, keduanya dapat memproses isi seluruh templat karena dimasukkan ke dalam `Transform` bagian.

```
# Start of processable content for MyMacro and AWS::Serverless
Transform:
  - MyMacro
  - 'AWS::Serverless'
Resources:
  WaitCondition:
    Type: AWS::CloudFormation::WaitCondition
  MyBucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: amzn-s3-demo-bucket
      Tags: [{"key":"value"}]
      CorsConfiguration: []
  MyEc2Instance:
    Type: AWS::EC2::Instance 
    Properties:
      ImageId: ami-1234567890abcdef0
# End of processable content for MyMacro and AWS::Serverless
```

# CloudFormation format template sintaks versi
<a name="format-version-structure"></a>

`AWSTemplateFormatVersion`Bagian (opsional) mengidentifikasi versi format template yang sesuai dengan template. Versi format templat terbaru adalah `2010-09-09` dan saat ini merupakan satu-satunya nilai yang valid.

Versi format template tidak sama dengan versi API. Versi format template dapat berubah secara independen dari versi API.

Nilai untuk deklarasi versi format templat harus berupa literal string. Anda tidak dapat menggunakan parameter atau fungsi untuk menentukan versi format templat. Jika Anda tidak menentukan nilai, CloudFormation asumsikan versi format template terbaru. Cuplikan berikut ini adalah contoh deklarasi versi format templat yang valid:

## JSON
<a name="format-version-structure-example.json"></a>

```
"AWSTemplateFormatVersion" : "2010-09-09"
```

## YAML
<a name="format-version-structure-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
```

# CloudFormation Descriptionsintaks template
<a name="template-description-structure"></a>

`Description`Bagian (opsional) memungkinkan Anda untuk menyertakan string teks yang menggambarkan template. Bagian ini harus selalu mengikuti bagian versi format templat.

Nilai untuk deklarasi deskripsi harus berupa string literal yang panjangnya antara 0 dan 1024 byte. Anda tidak dapat menggunakan parameter atau fungsi untuk menentukan deskripsi. Cuplikan berikut ini adalah contoh deklarasi deskripsi:

**penting**  
Selama pembaruan tumpukan, Anda tidak dapat memperbarui bagian `Description` dengan sendirinya. Anda hanya dapat memperbaruinya jika menyertakan perubahan yang menambahkan, mengubah, atau menghapus sumber daya.

## JSON
<a name="template-description-structure-example.json"></a>

```
"Description" : "Here are some details about the template."
```

## YAML
<a name="template-description-structure-example.yaml"></a>

```
Description: > Here are some details about the template.
```

# Buat template secara visual dengan Infrastructure Composer
<a name="infrastructure-composer-for-cloudformation"></a>

AWS Infrastructure Composer (sebelumnya dikenal sebagai **Application Composer**) membantu Anda menyusun dan mengkonfigurasi aplikasi modern secara visual. AWS Alih-alih menulis kode, Anda dapat menarik dan melepas sumber daya yang berbeda untuk membangun aplikasi Anda secara visual. 

*Infrastructure Composer dalam mode CloudFormation konsol* adalah alat yang disarankan untuk bekerja dengan CloudFormation template secara visual. Versi Infrastructure Composer yang dapat Anda akses dari CloudFormation konsol ini merupakan peningkatan dari alat lama yang disebut CloudFormation Designer. 

Dengan Infrastructure Composer dalam mode CloudFormation konsol, Anda dapat menyeret, melepas, mengonfigurasi, dan menghubungkan berbagai sumber daya, yang disebut *kartu*, ke kanvas visual. Pendekatan visual ini memudahkan untuk merancang dan mengedit arsitektur aplikasi Anda tanpa harus bekerja dengan template secara langsung. Untuk mengakses mode ini dari [CloudFormation konsol](https://console.aws.amazon.com/cloudformation/), pilih **Infrastructure Composer** dari menu navigasi sisi kiri.

Untuk informasi selengkapnya, lihat [Cara menulis AWS Infrastructure Composer di](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/using-composer-basics.html) *Panduan AWS Infrastructure Composer Pengembang*.

## Mengapa menggunakan Infrastructure Composer dalam mode CloudFormation konsol?
<a name="app-composer-for-cloudformation-why-use"></a>

Memvisualisasikan template Anda di Infrastructure Composer membantu Anda mengidentifikasi kesenjangan dan area peningkatan dalam CloudFormation templat dan arsitektur aplikasi Anda. Infrastructure Composer meningkatkan pengalaman pengembangan Anda dengan kemudahan dan efisiensi membangun dan memodifikasi CloudFormation tumpukan secara visual. Anda dapat memulai dengan draf awal, membuat kode deployable, dan menggabungkan alur kerja pengembang Anda dengan desainer visual di Infrastructure Composer.

## Bagaimana mode ini berbeda dari konsol Infrastructure Composer?
<a name="app-composer-for-cloudformation-differences"></a>

Sementara versi CloudFormation konsol Infrastructure Composer memiliki fitur yang mirip dengan konsol Infrastructure Composer standar, ada beberapa perbedaan. Kartu terkait Lambda (**Fungsi Lambda dan** **Lapisan Lambda**) memerlukan pembuatan kode dan solusi pengemasan yang tidak tersedia di Infrastructure Composer dalam mode konsol. CloudFormation Sinkronisasi lokal juga tidak tersedia dalam mode ini.

Namun, Anda dapat menggunakan kartu terkait Lambda ini dan fitur sinkronisasi lokal di [konsol Infrastructure Composer](https://console.aws.amazon.com/composer/home) atau. AWS Toolkit for Visual Studio Code Untuk informasi selengkapnya, lihat [Panduan AWS Infrastructure Composer Pengembang](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/what-is-composer.html) dan [Komposer Infrastruktur](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/appcomposer.html) di *Panduan AWS Toolkit for Visual Studio Code Pengguna*.

# AWS CloudFormation Server Bahasa
<a name="ide-extension"></a>

Server AWS CloudFormation Bahasa menyediakan kemampuan untuk mempercepat authoring infrastructure-as-code (IAc) dan menyebarkan AWS sumber daya dengan aman dan percaya diri. Ini mengikuti [protokol server bahasa](https://microsoft.github.io/language-server-protocol/) (LSP) untuk menyediakan dokumentasi tentang hover, pelengkapan otomatis, diagnostik melalui validasi statis, pergi ke definisi dan tindakan kode. Selain kemampuan server bahasa tradisional ini, server menambahkan fitur online untuk mengeksplorasi dan menyebarkan AWS sumber daya melalui CloudFormation. Ini termasuk kemampuan untuk memvalidasi dan menyebarkan template menggunakan set perubahan; melihat perbedaan tumpukan, peristiwa, sumber daya, dan output; daftar tumpukan dan telusuri sumber daya berdasarkan jenis; dan masukkan status sumber daya langsung langsung ke templat. CloudFormation

**Topics**
+ [IDEs Integrasi dengan Server AWS CloudFormation Bahasa](#ide-extension-supported-ides)
+ [Memulai](#ide-extension-getting-started)
+ [Menginisialisasi CloudFormation proyek di IDE (hanya Kode VS)](#ide-extension-initialize-project)
+ [Sumber terbuka](#ide-extension-open-source)
+ [Butuh bantuan?](#ide-extension-need-help)

## IDEs Integrasi dengan Server AWS CloudFormation Bahasa
<a name="ide-extension-supported-ides"></a>

AWS menyediakan off-the-shelf integrasi dengan Server CloudFormation Bahasa melalui AWS Toolkit untuk hal-hal berikut: IDEs
+ [Kode Visual Studio](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode)
+ [JetBrains IDEs](https://plugins.jetbrains.com/plugin/11349-aws-toolkit)(versi 2025.3 atau yang lebih baru), termasuk IntelliJ IDEA,, dan WebStorm PyCharm

Berikut ini IDEs juga mendukung Server CloudFormation Bahasa:
+ [Kiro](https://kiro.dev/downloads/)
+ [Kursor](https://cursor.com/)
+ Sebagian besar garpu dan distribusi VS Code

Server CloudFormation Bahasa mematuhi [Protokol Server Bahasa](https://microsoft.github.io/language-server-protocol/) (LSP) dan oleh karena itu integrasi lain dapat dikonfigurasi. Untuk petunjuk tentang mengintegrasikan server bahasa dengan editor lain, lihat panduan [instalasi](https://github.com/aws-cloudformation/cloudformation-languageserver/blob/main/INSTALLATION.md).

## Memulai
<a name="ide-extension-getting-started"></a>

**Topics**
+ [Prasyarat](#ide-extension-prerequisites)
+ [Langkah 1: Instal atau tingkatkan AWS Toolkit](#ide-extension-install-toolkit)
+ [Langkah 2: Akses CloudFormation di AWS Toolkit](#ide-extension-access-toolkit-panel)
+ [Langkah 3: Validasi, uji, dan perbaiki template Anda](#ide-extension-validate-test-refine)
+ [Langkah 4: Arahkan melalui template](#ide-extension-navigate-template)
+ [Langkah 5: Validasi dan terapkan](#ide-extension-validate-deploy)

### Prasyarat
<a name="ide-extension-prerequisites"></a>

Sebelum Anda mulai, pastikan bahwa:
+ Anda menggunakan IDE yang didukung pada sistem operasi yang didukung (macOS,Windows, atauLinux).
+ Anda telah menginstal atau meningkatkan ke versi terbaru dari AWS Toolkit untuk IDE Anda.

Beberapa fitur di Server AWS CloudFormation Bahasa memerlukan kredensi aktif Akun AWS dan dikonfigurasi. Anda harus masuk ke Anda Akun AWS melalui AWS Toolkit menggunakan kredensil yang valid.

### Langkah 1: Instal atau tingkatkan AWS Toolkit
<a name="ide-extension-install-toolkit"></a>

Instal atau perbarui ke versi terbaru AWS Toolkit dari ekstensi IDE atau pengelola plugin Anda, lalu mulai ulang IDE Anda.

Setelah instalasi, AWS Toolkit secara otomatis mengaktifkan dukungan CloudFormation IDE. Saat pertama kali menginstal atau memutakhirkan AWS Toolkit dengan Server AWS CloudFormation Bahasa, Anda diminta untuk memberikan izin AWS untuk mengumpulkan data penggunaan anonim. Data ini membantu AWS meningkatkan Server CloudFormation Bahasa dan meningkatkan pengalaman penulisan. Tidak ada informasi sensitif yang dikumpulkan dan AWS tidak merekam atau menyimpan konten templat, konfigurasi sumber daya, atau data pelanggan yang dapat diidentifikasi. Anda dapat mengubah preferensi telemetri kapan saja dari pengaturan IDE. Mulai ulang IDE agar perubahan diterapkan. Data penggunaan yang dikumpulkan hanya berfokus pada interaksi fitur dan metrik kinerja. Wawasan ini membantu AWS mengidentifikasi dan memprioritaskan peningkatan seperti validasi yang lebih cepat, pelengkapan otomatis yang disempurnakan, dan diagnostik kesalahan yang lebih baik.

### Langkah 2: Akses CloudFormation di AWS Toolkit
<a name="ide-extension-access-toolkit-panel"></a>

Setelah menginstal AWS Toolkit, buka CloudFormation panel di IDE Anda. Di VS Code, buka panel AWS Toolkit dari bilah aktivitas dan pilih **CLOUDFORMATION**. Masuk JetBrains IDEs, buka jendela alat **AWS Toolkit** dari bilah samping dan pilih **CloudFormation**tab.

 CloudFormation Panel berisi bagian-bagian berikut:
+ **Wilayah**: Menampilkan arus Wilayah AWS. Di VS Code, Anda dapat mengubahnya dengan memilih nama Region atau dengan menggunakan perintah **AWS CloudFormation: Select Region** dari palet perintah. Di JetBrains IDEs, Wilayah dikonfigurasi melalui pengaturan koneksi AWS Toolkit.
+ **Tumpukan**: Menampilkan daftar CloudFormation tumpukan paginasi di akun Anda. Perluas tumpukan untuk melihat node **Change Sets**, yang mencantumkan set perubahan yang terkait dengan tumpukan itu. Gunakan tindakan View Stack Detail untuk membuka tampilan detail tumpukan, yang menampilkan ikhtisar tumpukan, peristiwa, output, dan sumber daya.
+ **Sumber Daya**: Setelah Anda menambahkan jenis sumber daya, panel akan menampilkan AWS sumber daya dari jenis itu di akun Anda. Anda dapat melihat, menyegarkan, menyalin, atau mengimpornya ke template Anda.

**Di JetBrains IDEs, bilah alat di atas pohon menyediakan akses cepat ke tindakan umum termasuk **Validasi dan Terapkan, Jalankan Ulang Validasi dan Terapkan****, **Tambahkan** Jenis Sumber Daya, dan** Segarkan.** Tindakan juga tersedia melalui menu konteks klik kanan pada node pohon.

### Langkah 3: Validasi, uji, dan perbaiki template Anda
<a name="ide-extension-validate-test-refine"></a>

Saat Anda menulis CloudFormation template Anda, IDE menyediakan bantuan penulisan cerdas untuk membantu Anda membuat infrastruktur yang akurat dan sesuai dengan lebih cepat. Server CloudFormation Bahasa berjalan di latar belakang dan menyediakan fitur authoring berikut:
+ Penyelesaian kode: Menyarankan jenis sumber daya, parameter, dan properti berdasarkan CloudFormation skema.
+ Tambahkan AWS sumber daya yang ada: Memungkinkan Anda mengimpor sumber daya yang ada dari template Anda Akun AWS ke dalam template Anda. IDE menggunakan [AWS Cloud Control API (CCAPI)](https://docs.aws.amazon.com/cloudcontrolapi/latest/userguide/what-is-cloudcontrolapi.html) untuk mengambil konfigurasi langsung dan properti sumber daya, membantu Anda mengkloning atau menggunakan kembali infrastruktur yang ada dalam template Anda.
+ Ekstrak ke parameter: Ketika kursor Anda berada pada nilai literal dalam templat (misalnya, string seperti`t2.micro`), IDE menawarkan tindakan refactoring untuk mengekstrak nilai ke dalam `Parameters` bagian dan mengganti literal dengan a `!Ref` ke parameter baru. Jika nilai literal yang sama muncul di beberapa tempat, Anda dapat memilih untuk mengekstrak semua kejadian sekaligus.

#### Untuk menambahkan sumber daya ke template Anda
<a name="ide-extension-add-resources-to-template"></a>
+ **Tambahkan jenis sumber daya**: Di CloudFormation panel AWS Toolkit, di bawah **Sumber Daya**, tambahkan jenis sumber daya untuk ditelusuri. Di VS Code, klik ikon **Add \$1** atau gunakan perintah **AWS CloudFormation: Add Resource Types** dari palet perintah. Di JetBrains, klik tombol **Add Resource Type** di toolbar atau klik kanan node **Resources**.
+ **Cari jenis sumber daya**: Dalam dialog pencarian, ketik jenis AWS sumber daya yang ingin Anda tambahkan. Contoh:
  + `AWS::S3::Bucket`
  + `AWS::Lambda::Function`
+ **Jelajahi sumber daya**: Di bawah bagian **Sumber Daya**, daftar sumber AWS daya yang terdeteksi di akun Anda ditampilkan. Jika Anda memiliki banyak sumber daya, hanya halaman pertama yang ditampilkan. Gunakan kontrol navigasi untuk menelusuri halaman tambahan dan melihat semua sumber daya yang tersedia.
+ Pilih sumber daya yang ingin Anda sertakan dalam template Anda.
+ Anda dapat menyisipkan sumber daya ke dalam template Anda dengan dua cara, tergantung pada tujuan Anda:
  + **Mengkloning sumber daya yang ada**: Buat sumber daya baru di template Anda menggunakan konfigurasi langsung dan properti AWS sumber daya yang ada.
  + **Impor sumber daya yang ada**: Masukkan sumber daya aktual ke tumpukan Anda dengan menambahkannya ke template Anda menggunakan status langsungnya.

**Kiat**
+ Anda dapat menyegarkan bagian **Sumber daya** kapan saja untuk melihat daftar sumber daya terbaru yang tersedia di akun atau Wilayah Anda.
+ Jika Anda mengimpor sumber daya, jangan menambahkan sumber daya yang sudah menjadi milik CloudFormation tumpukan yang ada di akun yang sama.
+ Untuk mengonfirmasi apakah sumber daya sudah dikelola oleh CloudFormation, gunakan tindakan informasi di sebelah sumber daya. Di VS Code, klik ikon **i**. Di JetBrains IDEs, klik kanan sumber daya dan pilih **Dapatkan Info Manajemen Stack**.

##### Tambahkan sumber daya terkait
<a name="ide-extension-add-related-resources"></a>

Di VS Code, Anda dapat menambahkan sumber daya terkait ke sumber daya yang dipilih dengan menggunakan perintah **AWS CloudFormation: Tambahkan Sumber Daya Terkait menurut Jenis**. Setelah Anda memilih jenis sumber daya dari yang sudah ditentukan dalam template Anda, IDE menampilkan daftar sumber daya yang biasanya terkait dengan atau bergantung pada jenis itu. Misalnya, jika Anda memilih`AWS::EC2::Instance`, IDE mungkin menyarankan untuk menambahkan sumber daya terkait seperti `AWS::EC2::SecurityGroup` atau`AWS::EC2::Subnet`. Fitur ini membantu Anda membangun komponen infrastruktur yang terhubung dengan cepat tanpa mencari jenis sumber daya yang kompatibel secara manual. Fitur ini saat ini tidak didukung di JetBrains IDEs.

#### Validasi statis
<a name="ide-extension-static-validation"></a>

Server CloudFormation Bahasa menyediakan validasi statis bawaan yang didukung oleh [AWS CloudFormation Linter (cfn-lint](https://github.com/aws-cloudformation/cfn-lint)) dan. [AWS CloudFormation Guard](https://docs.aws.amazon.com/cfn-guard/latest/ug/what-is-guard.html) Validasi ini berjalan di belakang layar saat Anda membuat templat, membantu Anda mengidentifikasi kesalahan sintaks, kesenjangan kepatuhan, dan masalah praktik terbaik sebelum penerapan.

**Ikhtisar validasi statis**

Anda akan melihat dua jenis validasi statis real-time di IDE:
+ CloudFormation Linter (`cfn-lint`): Memvalidasi template Anda terhadap spesifikasi CloudFormation sumber daya dan aturan skema.
+ Guard (`cfn-guard`): Memvalidasi template Anda terhadap aturan kepatuhan dan paket kebijakan organisasi.

##### CloudFormation Linter (cfn-serat)
<a name="ide-extension-cfn-linter-details"></a>

 CloudFormation Linter terintegrasi ke dalam IDE untuk secara otomatis memeriksa sintaks dan struktur template Anda saat Anda mengetik.
+ **Validasi skema**: Mendeteksi kesalahan sintaks dan skema untuk memastikan templat Anda sesuai dengan skema sumber daya. CloudFormation
+ **Penyorotan kesalahan**: Menampilkan penanda sebaris dalam masalah, mewakili pemblokir penerapan atau peringatan.
+ **Bantuan arahkan kursor**: Saat Anda mengarahkan kursor ke kesalahan, IDE akan menampilkan pesan diagnostik yang terkait dengan masalah tersebut. Jika perbaikan cepat tersedia, itu juga ditawarkan.

##### Integrasi penjaga
<a name="ide-extension-cfn-guard-integration"></a>

Guard memvalidasi template Anda terhadap set aturan yang menentukan kepatuhan dan kebijakan keamanan. IDE menjalankan validasi Guard secara real time melalui Server CloudFormation Bahasa, memberi Anda umpan balik langsung saat Anda membuat templat.
+ **Paket aturan default**: IDE menyertakan seperangkat aturan Penjaga yang telah terdaftar sebelumnya yang berfokus pada praktik terbaik dasar untuk keamanan sumber daya dan kebersihan konfigurasi. Untuk mempelajari lebih lanjut, lihat [registri aturan penjaga](https://github.com/aws-cloudformation/aws-guard-rules-registry).
+ **Menambahkan paket aturan**: Untuk menambah atau memodifikasi set aturan, buka pengaturan IDE Anda dan arahkan ke bagian konfigurasi Guard untuk memilih atau mengunggah paket aturan Guard tambahan.

**Tips**: Memahami indikator diagnostik
+ Indikator biru: Petunjuk praktik terbaik atau rekomendasi pengoptimalan.
+ Indikator kuning: Peringatan untuk masalah non-pemblokiran (misalnya, tag atau parameter yang hilang).
+ Indikator merah: Pemblokir penerapan seperti nama properti yang tidak valid, bidang wajib yang hilang, atau ketidakcocokan skema.

### Langkah 4: Arahkan melalui template
<a name="ide-extension-navigate-template"></a>

IDE menyediakan tampilan terstruktur dan hierarkis dari CloudFormation template Anda, yang disusun menjadi beberapa bagian seperti`Parameters`,,`Resources`, dan `Outputs``Mappings`, menampilkan setiap jenis sumber daya dan ID logis. Ini memudahkan untuk menemukan dan menavigasi dengan cepat ke sumber daya atau parameter tertentu dalam templat besar. Di VS Code, panel **Outline** di sidebar **Explorer** menampilkan struktur ini. Di JetBrains IDEs, buka jendela **Structure** tool untuk melihat struktur template untuk file yang sedang terbuka.

Anda dapat menggunakan **Go to Definition** untuk fungsi intrinsik seperti `GetAtt` dan`Ref`, memungkinkan Anda untuk melompat langsung ke sumber daya atau parameter yang direferensikan di template Anda. Ini membantu Anda melacak dependensi, memahami hubungan sumber daya, dan melakukan pengeditan dengan lebih efisien.

### Langkah 5: Validasi dan terapkan
<a name="ide-extension-validate-deploy"></a>

Ketika Anda siap untuk menerapkan CloudFormation template Anda, gunakan fitur Validasi dan Deploy untuk membuat set perubahan. IDE memvalidasi template Anda, dan jika tidak ada kesalahan pemblokiran yang ditemukan, ia melanjutkan untuk membuat set perubahan sadar [drift](drift-aware-change-sets.md). IDE kemudian menampilkan tampilan diff sehingga Anda dapat meninjau semua perubahan yang diusulkan sebelum menjalankan set perubahan.

Di VS Code, buka palet perintah dan jalankan **AWS CloudFormation: Validate and Deploy**. Palet perintah memandu Anda dalam memilih templat, nama tumpukan, parameter, kemampuan, dan opsi penerapan lainnya selangkah demi selangkah. Di JetBrains IDEs, gunakan tombol **Validasi dan Terapkan** toolbar, klik kanan file template di editor, atau klik kanan tumpukan di pohon. JetBrains menyajikan dialog wizard tempat Anda mengonfigurasi semua opsi penerapan termasuk pemilihan templat, nama tumpukan, parameter, kemampuan, tag, dan opsi lanjutan.

#### Bagaimana validasi bekerja
<a name="ide-extension-how-validation-works"></a>

IDE secara otomatis melakukan [pemeriksaan validasi sebelum penerapan](validate-stack-deployments.md) dan memvalidasi template Anda terhadap penyebab kegagalan umum, termasuk:
+ Ketidakcocokan sintaks properti atau skema yang tidak valid: Masalah ini biasanya tertangkap `cfn-lint` selama penulisan, tetapi jika Anda melanjutkan untuk menerapkan tanpa mengatasinya, CloudFormation validasi waktu penerapan akan menampilkan kesalahan yang sama sebelum tumpukan dibuat atau diperbarui.
+ Nama sumber daya bertentangan dengan sumber daya yang ada di akun Anda.
+ Kendala khusus layanan, seperti konflik nama bucket S3 atau enkripsi yang hilang.

Jika validasi mendeteksi kesalahan, IDE menyoroti masalah secara langsung di template Anda dan mencantumkan kesalahan di panel diagnostik. Setiap masalah mencakup properti atau sumber daya tertentu yang menyebabkan kegagalan, bersama dengan perbaikan yang disarankan. Jika tidak ada kesalahan pemblokiran, Anda dapat melanjutkan ke fase penerapan.

Jika peringatan ditemukan (masalah non-pemblokiran), dialog akan muncul yang memungkinkan Anda untuk melanjutkan penerapan atau membatalkan dan melakukan koreksi.

IDE membuka [set perubahan sadar drift](drift-aware-change-sets.md) yang menampilkan perbedaan antara template Anda saat ini dan konfigurasi tumpukan yang diterapkan. Ini memungkinkan Anda untuk meninjau, mengonfirmasi, atau membatalkan set perubahan sebelum eksekusi. Membatalkan penerapan akan menghapus set perubahan.

Set perubahan sadar drift meningkatkan proses CloudFormation penerapan dengan memungkinkan Anda menangani tumpukan drift dengan aman. Stack drift terjadi ketika keadaan sebenarnya dari sumber daya Anda berbeda dari apa yang didefinisikan dalam CloudFormation template Anda, seringkali karena perubahan manual yang dilakukan melalui, CLI Konsol Manajemen AWS, atau SDK. CloudFormation [set perubahan sadar drift](drift-aware-change-sets.md) membandingkan konfigurasi tumpukan yang diproses dengan status sumber daya langsung, dan IDE memunculkan perbedaan ini sehingga Anda dapat mengembalikan sumber daya ke kepatuhan sebelum penerapan.

#### Lihat acara tumpukan
<a name="ide-extension-view-stack-events"></a>

Saat penerapan dimulai, Anda dapat memantau kemajuan secara real time dari CloudFormation panel. Di bawah **Stack Events**, Anda melihat daftar operasi yang dilakukan selama penerapan. Setiap acara mencakup detail seperti:
+ **Timestamp**: Waktu peristiwa terjadi
+ **Sumber daya**: AWS Sumber daya spesifik yang dibuat, diperbarui, atau dihapus
+ **Status**: Keadaan operasi saat ini (misalnya,, `CREATE_IN_PROGRESS``UPDATE_COMPLETE`, atau`ROLLBACK_IN_PROGRESS`)
+ **Alasan**: Konteks tambahan atau pesan kesalahan, jika berlaku

Anda juga dapat melihat **Sumber Daya** dan **Output** tumpukan dari panel ini. Tampilan **Stack Events** membantu Anda melacak kemajuan penerapan, mengidentifikasi potensi masalah, dan mengonfirmasi kapan tumpukan Anda berhasil diselesaikan.

## Menginisialisasi CloudFormation proyek di IDE (hanya Kode VS)
<a name="ide-extension-initialize-project"></a>

Menginisialisasi CloudFormation proyek di IDE membantu Anda menyiapkan ruang kerja terstruktur dengan folder, konfigurasi lingkungan, dan AWS kredensil yang benar sehingga Anda dapat memvalidasi dan menerapkan templat dengan andal. Anda dapat menginisialisasi CloudFormation proyek baru langsung dari IDE untuk membuat pengaturan yang direkomendasikan ini. Fitur ini saat ini hanya tersedia di VS Code dan tidak didukung di JetBrains IDEs.

**Untuk menginisialisasi CloudFormation proyek:**
+ **Buka palet perintah**
  + Dari VS Code, buka palet perintah (`Ctrl+Shift+P`atau `Cmd+Shift+P` aktifmacOS).
  + Pilih **AWS CloudFormation: CFN Init: Inisialisasi Proyek**.
+ **Pilih direktori proyek**
  + Secara default, IDE menggunakan direktori kerja Anda saat ini.
  + Anda dapat mengubah jalur ini ke folder mana pun tempat Anda ingin menyimpan CloudFormation templat Anda.
+ **Pilih profil AWS kredensialnya**
  + Anda diminta untuk memilih profil AWS kredensi. Profil yang dipilih digunakan untuk deteksi lingkungan, validasi, dan penerapan.
+ **Siapkan lingkungan Anda**
  + Anda diminta untuk membuat atau memilih lingkungan.
  + Lingkungan menentukan di mana dan bagaimana template Anda digunakan atau divalidasi (misalnya, dev, beta, atau produksi). Anda dapat menggunakan **AWS CloudFormation: CFN Init: Add Environment** untuk memilih atau mengubah lingkungan Anda.
  + Anda dapat menggunakan **AWS CloudFormation: CFN Init: Hapus Lingkungan** untuk menghapus lingkungan yang telah Anda pilih.
+ **(Opsional) Impor file parameter**
  + Jika Anda sudah memiliki file parameter yang ada, IDE memungkinkan Anda untuk mengimpornya selama inisialisasi.
  + IDE secara otomatis mendeteksi file yang kompatibel dan menautkannya ke proyek Anda untuk digunakan dalam validasi dan penerapan templat.
+ **Beri nama dan selesaikan proyek**
  + Berikan nama proyek, seperti beta-environment, dan selesaikan pengaturannya.
  + IDE membuat struktur proyek awal dan file konfigurasi untuk Anda.

Anda dapat menjalankan validasi, pratinjau penerapan, atau beralih antar lingkungan langsung dari IDE.

## Sumber terbuka
<a name="ide-extension-open-source"></a>

Server AWS CloudFormation Bahasa bersumber terbuka di bawah Apache-2.0 Lisensi, memberikan transparansi penuh kepada pelanggan tentang bagaimana diagnostik templat, validasi skema, dan analisis statis dilakukan. Ini mengurangi gesekan keamanan dan kepatuhan bagi pelanggan yang membutuhkan visibilitas tingkat sumber sebelum mengadopsi perkakas.

Basis kode tersedia untuk umum di GitHub: [https://github.com/aws-cloudformation/cloudformation-languageserver/](https://github.com/aws-cloudformation/cloudformation-languageserver/).

## Butuh bantuan?
<a name="ide-extension-need-help"></a>

Coba [CloudFormationkomunitas](https://repost.aws/tags/TAm3R3LNU3RfSX9L23YIpo3w) di AWS re:Post.

# Hasilkan templat dari sumber daya yang ada dengan generator IAc
<a name="generate-IaC"></a>

Dengan CloudFormation infrastruktur sebagai generator kode (IAc generator), Anda dapat membuat template menggunakan AWS sumber daya yang disediakan di akun Anda yang belum dikelola oleh. CloudFormation 

Berikut ini adalah manfaat dari generator IAc:
+ Bawa seluruh aplikasi di bawah CloudFormation manajemen atau migrasikan ke dalam AWS CDK aplikasi.
+ Hasilkan template tanpa harus mendeskripsikan properti sumber daya berdasarkan properti dan kemudian menerjemahkannya ke dalam sintaks JSON atau YAMAL.
+ Gunakan templat untuk mereplikasi sumber daya di akun atau Wilayah baru.

Proses pembuatan IAc terdiri dari langkah-langkah berikut:

1. **Pindai sumber daya** — Langkah pertama adalah memulai pemindaian sumber daya Anda. Pemindaian ini di seluruh wilayah dan kedaluwarsa setelah 30 hari. Selama waktu ini, Anda dapat membuat beberapa templat dari pemindaian yang sama.

1. **Buat template Anda** - Untuk membuat template, Anda memiliki dua opsi:
   + Buat template baru dari awal dan tambahkan sumber daya yang dipindai dan sumber daya terkait ke dalamnya.
   + Gunakan CloudFormation tumpukan yang ada sebagai titik awal dan tambahkan sumber daya yang dipindai dan sumber daya terkait ke templatnya.

1. **Impor sumber daya** — Gunakan templat Anda untuk mengimpor sumber daya sebagai CloudFormation tumpukan atau memigrasikannya ke dalam AWS CDK aplikasi.

Fitur generator IAC tersedia di semua Wilayah komersial dan mendukung banyak jenis AWS sumber daya umum. Untuk daftar lengkap sumber daya yang didukung, lihat[Dukungan jenis sumber daya](resource-import-supported-resources.md).

**Topics**
+ [Pertimbangan-pertimbangan](#iac-generator-considerations)
+ [Izin IAM diperlukan untuk memindai sumber daya](#iac-generator-permissions)
+ [Perintah yang umum digunakan untuk pembuatan template, manajemen, dan penghapusan](#iac-generator-commonly-used-commands)
+ [Migrasikan template ke AWS CDK](#iac-generator-cdk-migrate)
+ [Mulai pemindaian sumber daya dengan CloudFormation generator IAc](iac-generator-start-resource-scan.md)
+ [Lihat ringkasan pemindaian di CloudFormation konsol](generate-IaC-view-scan-summary.md)
+ [Buat CloudFormation template dari sumber daya yang dipindai dengan generator IAc](iac-generator-create-template-from-scanned-resources.md)
+ [Buat CloudFormation tumpukan dari sumber daya yang dipindai](iac-generator-create-stack-from-scanned-resources.md)
+ [Selesaikan properti hanya tulis](generate-IaC-write-only-properties.md)

## Pertimbangan-pertimbangan
<a name="iac-generator-considerations"></a>

Anda dapat membuat template JSON atau YAMAL untuk AWS sumber daya yang telah Anda baca. Template untuk kemampuan generator IAc memodelkan sumber daya cloud dengan andal dan cepat tanpa harus mendeskripsikan properti sumber daya berdasarkan properti.

Tabel berikut mencantumkan kuota yang tersedia untuk fitur generasi IAC.


| Nama | Pemindaian penuh | Pemindaian sebagian | 
| --- | --- | --- | 
|  Jumlah maksimum sumber daya yang dapat diproses dalam pemindaian  |  100.000  |  100.000  | 
|  Jumlah pemindaian per hari (untuk pemindaian dengan kurang dari 10.000 sumber daya)  |  10  |  10  | 
|  Jumlah pemindaian per hari (untuk pemindaian dengan lebih dari 10.000 sumber daya)  |  1  |  1  | 
|  Jumlah template yang dihasilkan secara bersamaan per akun  |  5  |  5  | 
|  Jumlah sumber daya bersamaan yang dimodelkan untuk satu pembuatan templat  |  5  |  5  | 
|  Jumlah total sumber daya yang dapat dimodelkan dalam satu template  |  500  |  500  | 
|  Jumlah maksimum template yang dihasilkan per akun  |  1.000  |  1.000  | 

**penting**  
Generator IAC hanya mendukung AWS sumber daya yang didukung oleh Cloud Control API di Wilayah Anda. Untuk informasi selengkapnya, lihat [Dukungan jenis sumber daya](resource-import-supported-resources.md).

## Izin IAM diperlukan untuk memindai sumber daya
<a name="iac-generator-permissions"></a>

Untuk memindai sumber daya dengan generator IAC, prinsipal IAM Anda (pengguna, peran, atau grup) harus memiliki:
+ CloudFormation izin pemindaian
+ Baca izin untuk layanan target AWS 

Cakupan pemindaian terbatas pada sumber daya yang telah Anda baca akses. Izin yang hilang tidak akan menyebabkan kegagalan pemindaian tetapi akan mengecualikan sumber daya tersebut.

Untuk contoh kebijakan IAM yang memberikan izin pemindaian dan pengelolaan templat, lihat. [Izinkan semua operasi generator IAc](security_iam_id-based-policy-examples.md#iam-policy-example-for-iac-generator)

## Perintah yang umum digunakan untuk pembuatan template, manajemen, dan penghapusan
<a name="iac-generator-commonly-used-commands"></a>

Perintah yang umum digunakan untuk bekerja dengan generator IAc meliputi: 
+ [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html)untuk memulai pemindaian sumber daya di akun di file Wilayah AWS. 
+ [describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html)untuk memantau kemajuan pemindaian sumber daya. 
+ [list-resource-scans](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scans.html)untuk membuat daftar pemindaian sumber daya di file Wilayah AWS.
+ [list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html)untuk membuat daftar sumber daya yang ditemukan selama pemindaian sumber daya.
+  [list-resource-scan-related-resource](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html) untuk membuat daftar sumber daya yang terkait dengan sumber daya yang dipindai.
+ [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html)untuk menghasilkan CloudFormation template dari satu set sumber daya yang dipindai.
+ [update-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-generated-template.html)untuk memperbarui template yang dihasilkan.
+ [describe-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-generated-template.html)untuk mengembalikan informasi tentang template yang dihasilkan.
+ [list-generated-templates](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-generated-templates.html)untuk mencantumkan semua templat yang dihasilkan di akun Anda dan Wilayah saat ini.
+ [delete-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/delete-generated-template.html)untuk menghapus template yang dihasilkan.

## Migrasikan template ke AWS CDK
<a name="iac-generator-cdk-migrate"></a>

 AWS Cloud Development Kit (AWS CDK) Ini adalah kerangka pengembangan perangkat lunak open-source yang dapat Anda gunakan untuk mengembangkan, mengelola, dan menyebarkan CloudFormation sumber daya menggunakan bahasa pemrograman populer.

 AWS CDK CLI menyediakan integrasi dengan generator IAc. Gunakan `cdk migrate` perintah AWS CDK CLI untuk mengonversi CloudFormation template dan membuat aplikasi CDK baru yang berisi sumber daya Anda. Kemudian, Anda dapat menggunakan AWS CDK untuk mengelola sumber daya Anda dan CloudFormation menerapkannya.

Untuk informasi selengkapnya, lihat [Memigrasi ke AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/migrate.html) dalam *Panduan AWS Cloud Development Kit (AWS CDK) Pengembang*.

# Mulai pemindaian sumber daya dengan CloudFormation generator IAc
<a name="iac-generator-start-resource-scan"></a>

Sebelum Anda membuat template dari sumber daya yang ada, Anda harus terlebih dahulu memulai pemindaian sumber daya untuk menemukan sumber daya Anda saat ini dan hubungannya.

Anda dapat memulai pemindaian sumber daya menggunakan salah satu opsi berikut. Untuk pengguna pertama kali generator IAC, kami merekomendasikan opsi pertama.
+ **Pindai semua sumber daya (pemindaian penuh)** - Memindai semua sumber daya yang ada di akun saat ini dan Wilayah. Proses pemindaian ini dapat memakan waktu hingga 10 menit untuk 1.000 sumber daya.
+ **Pindai sumber daya tertentu (pemindaian sebagian)** — Pilih jenis sumber daya mana yang akan dipindai secara manual di akun dan Wilayah saat ini. Opsi ini menyediakan proses pemindaian yang lebih cepat dan lebih terfokus, sehingga ideal untuk pengembangan template berulang.

Setelah pemindaian selesai, Anda dapat memilih sumber daya dan sumber daya terkait yang akan disertakan saat membuat templat Anda. Saat menggunakan pemindaian sebagian, sumber daya terkait hanya akan tersedia selama pembuatan templat jika:
+ Anda secara khusus memilihnya sebelum memulai pemindaian, atau
+ Mereka diminta untuk menemukan jenis sumber daya yang Anda pilih. 

Misalnya, jika Anda memilih `AWS::EKS::Nodegroup` tanpa memilih`AWS::EKS::Cluster`, generator IAc secara otomatis menyertakan `AWS::EKS::Cluster` sumber daya dalam pemindaian karena menemukan grup node memerlukan penemuan cluster terlebih dahulu. Dalam semua kasus lain, pemindaian hanya akan mencakup sumber daya yang Anda pilih secara khusus.

**catatan**  
Sebelum melanjutkan, konfirmasikan bahwa Anda memiliki izin yang diperlukan untuk bekerja dengan generator IAc. Untuk informasi selengkapnya, lihat [Izin IAM diperlukan untuk memindai sumber daya](generate-IaC.md#iac-generator-permissions).

**Topics**
+ [Mulai pemindaian sumber daya (konsol)](#start-resource-scan-console)
+ [Mulai pemindaian sumber daya (AWS CLI)](#start-resource-scan-cli)

## Mulai pemindaian sumber daya (konsol)
<a name="start-resource-scan-console"></a>

**Untuk memulai pemindaian sumber daya dari semua jenis sumber daya (pemindaian penuh)**

1. Buka [halaman generator IAC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) CloudFormation konsol.

1. Pada bilah navigasi di bagian atas layar, pilih Wilayah AWS yang berisi sumber daya untuk dipindai.

1. Dari panel **Scan**, pilih **Mulai pemindaian baru dan kemudian pilih Pindai** **semua sumber daya**. 

**Untuk memulai pemindaian sumber daya jenis sumber daya tertentu (pemindaian sebagian)**

1. Buka [halaman generator IAC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) CloudFormation konsol.

1. Pada bilah navigasi di bagian atas layar, pilih Wilayah AWS yang berisi sumber daya untuk dipindai.

1. Dari panel **Scan**, pilih **Mulai pemindaian baru dan kemudian pilih Pindai** **sumber daya tertentu**. 

1. Dalam kotak dialog **Mulai pemindaian sebagian**, pilih hingga 100 jenis sumber daya, lalu pilih **Mulai pemindaian**. 

## Mulai pemindaian sumber daya (AWS CLI)
<a name="start-resource-scan-cli"></a>

**Untuk memulai pemindaian sumber daya dari semua jenis sumber daya (pemindaian penuh)**  
Gunakan perintah berikut [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html). Ganti *us-east-1* dengan Wilayah AWS yang berisi sumber daya untuk memindai.

```
aws cloudformation start-resource-scan --region us-east-1
```

Jika berhasil, perintah ini mengembalikan ARN pemindaian. Perhatikan ARN di properti. `ResourceScanId` Anda membutuhkannya untuk membuat template Anda.

```
{
    "ResourceScanId":
      "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60"
}
```

**Untuk memulai pemindaian sumber daya jenis sumber daya tertentu (pemindaian sebagian)**

1. Gunakan perintah [cat](https://en.wikipedia.org/wiki/Cat_(Unix)) berikut untuk menyimpan jenis sumber daya yang ingin Anda pindai dalam file JSON bernama `config.json` di direktori home Anda. Berikut ini adalah contoh konfigurasi pemindaian yang memindai instans Amazon EC2, grup keamanan, dan semua sumber daya Amazon S3.

   ```
   $ cat > config.json
   [
     {
       "Types":[
         "AWS::EC2::Instance",
         "AWS::EC2::SecurityGroup",
         "AWS::S3::*"
       ]
     }
   ]
   ```

1. Gunakan [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html)perintah dengan `--scan-filters` opsi, bersama dengan `config.json` file yang Anda buat, untuk memulai pemindaian sebagian. Ganti *us-east-1* dengan Wilayah AWS yang berisi sumber daya untuk memindai.

   ```
   aws cloudformation start-resource-scan --scan-filters file://config.json --region us-east-1
   ```

   Jika berhasil, perintah ini mengembalikan ARN pemindaian. Perhatikan ARN di properti. `ResourceScanId` Anda membutuhkannya untuk membuat template Anda.

   ```
   {
       "ResourceScanId":
         "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60"
   }
   ```

**Untuk memantau kemajuan pemindaian sumber daya**  
Gunakan perintah [describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html). Untuk `--resource-scan-id` opsi, ganti sampel ARN dengan ARN yang sebenarnya.

```
aws cloudformation describe-resource-scan --region us-east-1 \
  --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60
```

Jika berhasil, perintah ini mengembalikan output yang serupa dengan yang berikut: 

```
{
    "ResourceScanId": "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60",
    "Status": "COMPLETE",
    "StartTime": "2023-08-21T03:10:38.485000+00:00",
    "EndTime": "2023-08-21T03:20:28.485000+00:00",
    "PercentageCompleted": 100.0,
    "ResourceTypes": [
        "AWS::CloudFront::CachePolicy",
        "AWS::CloudFront::OriginRequestPolicy",
        "AWS::EC2::DHCPOptions",
        "AWS::EC2::InternetGateway",
        "AWS::EC2::KeyPair",
        "AWS::EC2::NetworkAcl",
        "AWS::EC2::NetworkInsightsPath",
        "AWS::EC2::NetworkInterface",
        "AWS::EC2::PlacementGroup",
        "AWS::EC2::Route",
        "AWS::EC2::RouteTable",
        "AWS::EC2::SecurityGroup",
        "AWS::EC2::Subnet",
        "AWS::EC2::SubnetCidrBlock",
        "AWS::EC2::SubnetNetworkAclAssociation",
        "AWS::EC2::SubnetRouteTableAssociation",
        ...
    ],
    "ResourcesRead": 676
}
```

Untuk pemindaian sebagian, output akan terlihat mirip dengan yang berikut: 

```
{
    "ResourceScanId": "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60",
    "Status": "COMPLETE",
    "StartTime": "2025-03-06T18:24:19.542000+00:00",
    "EndTime": "2025-03-06T18:25:23.142000+00:00",
    "PercentageCompleted": 100.0,
    "ResourceTypes": [
        "AWS::EC2::Instance",
        "AWS::EC2::SecurityGroup",
        "AWS::S3::Bucket",
        "AWS::S3::BucketPolicy"
    ],
    "ResourcesRead": 65,
    "ScanFilters": [
        {
            "Types": [
                "AWS::EC2::Instance",
                "AWS::EC2::SecurityGroup",
                "AWS::S3::*"
            ]
        }
    ]
}
```

Untuk deskripsi bidang dalam output, lihat [DescribeResourceScan](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeResourceScan.html)di *Referensi AWS CloudFormation API*.

# Lihat ringkasan pemindaian di CloudFormation konsol
<a name="generate-IaC-view-scan-summary"></a>

Setelah pemindaian selesai, Anda dapat melihat visualisasi sumber daya yang ditemukan selama pemindaian untuk membantu Anda mengidentifikasi konsentrasi sumber daya di berbagai jenis produk.

**Untuk melihat informasi tentang sumber daya yang ditemukan selama pemindaian**

1. Buka [halaman generator IAC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) CloudFormation konsol.

1. Pada bilah navigasi di bagian atas layar, pilih Wilayah AWS yang berisi pemindaian sumber daya untuk dilihat.

1. Dari panel navigasi, pilih generator **IAc**.

1. **Di bawah **rincian sumber daya yang dipindai**, Anda akan menemukan rincian visual dari sumber daya yang dipindai berdasarkan jenis produk, misalnya, **Compute** dan Storage.** 

1. Untuk menyesuaikan jumlah jenis produk yang ditampilkan, pilih **Filter data yang ditampilkan**. Ini membantu Anda menyesuaikan visualisasi untuk fokus pada jenis produk yang paling Anda minati.

1. Di sisi kanan halaman adalah panel **detail ringkasan Pindai**. Untuk membuka panel, pilih ikon **panel terbuka**.

![\[Konsol generator IAC menyediakan rincian visual sumber daya yang dipindai.\]](http://docs.aws.amazon.com/id_id/AWSCloudFormation/latest/UserGuide/images/IaC-generator-scan-summary.png)


# Buat CloudFormation template dari sumber daya yang dipindai dengan generator IAc
<a name="iac-generator-create-template-from-scanned-resources"></a>

Topik ini menjelaskan cara membuat template dari sumber daya yang dipindai menggunakan fitur generator IAc. 

## Buat template dari sumber daya yang dipindai (konsol)
<a name="create-template-from-scanned-resources-console"></a>

**Untuk membuat template tumpukan dari sumber daya yang dipindai**

1. Buka [halaman generator IAC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) CloudFormation konsol.

1. Pada bilah navigasi di bagian atas layar, pilih Wilayah AWS yang berisi sumber daya yang dipindai.

1. Dari bagian **Template**, pilih **Buat template**. 

1. Pilih **Mulai dari template baru**.

   1. Untuk **nama Template**, berikan nama untuk template Anda.

   1. (Opsional) Konfigurasikan **kebijakan Penghapusan Anda dan Perbarui kebijakan** **penggantian**.

   1. Pilih **Berikutnya** untuk menambahkan sumber daya yang dipindai ke template.

1. Untuk **Tambahkan sumber daya yang dipindai**, telusuri daftar sumber daya yang dipindai dan pilih sumber daya yang ingin Anda tambahkan ke templat Anda. Anda dapat memfilter sumber daya berdasarkan pengenal sumber daya, jenis sumber daya, atau tag. Filter saling inklusif.

1. Ketika Anda telah menambahkan semua sumber daya yang diperlukan ke template Anda, pilih **Berikutnya** untuk keluar dari halaman **Tambahkan sumber daya yang dipindai** dan lanjutkan ke halaman **Tambahkan sumber daya terkait**.

1. Tinjau daftar sumber daya terkait yang direkomendasikan. Sumber daya terkait, seperti instans Amazon EC2 dan grup keamanan, saling bergantung dan biasanya termasuk dalam beban kerja yang sama. Pilih sumber daya terkait yang ingin Anda sertakan dalam template yang dihasilkan.
**catatan**  
Kami menyarankan Anda menambahkan semua sumber daya terkait ke template ini.

1. Tinjau detail template, sumber daya yang dipindai, dan sumber daya terkait. 

1. Pilih **Buat template** untuk keluar dari halaman **Review dan buat** dan buat template.

## Buat template dari sumber daya yang dipindai ()AWS CLI
<a name="create-template-from-scanned-resources-cli"></a>

**Untuk membuat template tumpukan dari sumber daya yang dipindai**

1. Gunakan [list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html)perintah untuk membuat daftar sumber daya yang ditemukan selama pemindaian, secara opsional menentukan `--resource-identifier` opsi untuk membatasi output. Untuk `--resource-scan-id` opsi, ganti sampel ARN dengan ARN yang sebenarnya.

   ```
   aws cloudformation list-resource-scan-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resource-identifier MyApp
   ```

   Berikut ini adalah contoh respon, di mana `ManagedByStack` menunjukkan apakah CloudFormation mengelola sumber daya sudah. Salin outputnya. Anda membutuhkannya untuk langkah selanjutnya.

   ```
   {
       "Resources": [
           {
               "ResourceType": "AWS::EKS::Cluster",
               "ResourceIdentifier": {
                   "ClusterName": "MyAppClusterName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
               "ResourceIdentifier": {
                   "AutoScalingGroupName": "MyAppASGName"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   Untuk deskripsi bidang dalam output, lihat [ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html)di *Referensi AWS CloudFormation API*.

1. Gunakan `cat` perintah untuk menyimpan jenis sumber daya dan pengidentifikasi dalam file JSON bernama `resources.json` di direktori home Anda. Berikut ini adalah contoh JSON berdasarkan contoh output pada langkah sebelumnya.

   ```
   $ cat > resources.json
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       }
   ]
   ```

1. Gunakan perintah [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html), bersama dengan `resources.json` file yang Anda buat, untuk membuat daftar sumber daya yang terkait dengan sumber daya yang dipindai.

   ```
   aws cloudformation list-resource-scan-related-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resources file://resources.json
   ```

   Berikut ini adalah contoh respon, di mana `ManagedByStack` menunjukkan apakah CloudFormation mengelola sumber daya sudah. Tambahkan sumber daya ini ke file JSON yang Anda buat di langkah sebelumnya. Anda akan membutuhkannya untuk membuat template Anda.

   ```
   {
       "RelatedResources": [
           {
               "ResourceType": "AWS::EKS::Nodegroup",
               "ResourceIdentifier": {
                   "NodegroupName": "MyAppNodegroupName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::IAM::Role",
               "ResourceIdentifier": {
                   "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   Untuk deskripsi bidang dalam output, lihat [ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html)di *Referensi AWS CloudFormation API*.
**catatan**  
Daftar input sumber daya tidak dapat melebihi panjang 100. Untuk membuat daftar sumber daya terkait untuk lebih dari 100 sumber daya, jalankan **list-resource-scan-related-resources** perintah dalam batch 100 dan konsolidasikan hasilnya.  
Ketahuilah bahwa output mungkin berisi sumber daya duplikat dalam daftar.

1. Gunakan [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html)perintah untuk membuat template tumpukan baru, sebagai berikut, dengan modifikasi ini:
   + Ganti `us-east-1` dengan Wilayah AWS yang berisi sumber daya yang dipindai.
   + Ganti `MyTemplate` dengan nama template yang akan dibuat.

   ```
   aws cloudformation create-generated-template --region us-east-1 \
    --generated-template-name MyTemplate \
     --resources file://resources.json
   ```

   Berikut ini adalah contoh `resources.json` file.

   ```
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "LogicalResourceId":"MyCluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "LogicalResourceId":"MyASG",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       },
       {
           "ResourceType": "AWS::EKS::Nodegroup",
           "LogicalResourceId":"MyNodegroup",
           "ResourceIdentifier": {
               "NodegroupName": "MyAppNodegroupName"
           }
       },
       {
           "ResourceType": "AWS::IAM::Role",
           "LogicalResourceId":"MyRole",
           "ResourceIdentifier": {
               "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
           }
       }
   ]
   ```

   Jika berhasil, perintah ini mengembalikan berikut ini.

   ```
   {
     "Arn":
       "arn:aws:cloudformation:region:account-id:generatedtemplate/7fc8512c-d8cb-4e02-b266-d39c48344e48",
     "Name": "MyTemplate"
   }
   ```

# Buat CloudFormation tumpukan dari sumber daya yang dipindai
<a name="iac-generator-create-stack-from-scanned-resources"></a>

Setelah Anda membuat template Anda, Anda dapat melihat pratinjau template yang dihasilkan dengan Infrastructure Composer sebelum membuat tumpukan dan mengimpor sumber daya yang dipindai. Ini membantu Anda memvisualisasikan arsitektur aplikasi lengkap dengan sumber daya dan hubungannya. Untuk informasi selengkapnya tentang Infrastructure Composer, lihat[Buat template secara visual dengan Infrastructure Composer](infrastructure-composer-for-cloudformation.md).

**Untuk membuat tumpukan dan mengimpor sumber daya yang dipindai**

1. Buka [halaman generator IAC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) CloudFormation konsol.

1. Pada bilah navigasi di bagian atas layar, pilih Wilayah AWS untuk template Anda.

1. Pilih tab **Template**, lalu pilih nama template Anda untuk melihat informasi selengkapnya.

1. Pada tab **Definisi Template**, di bagian atas bagian **Template**, Anda dapat mengganti template dari YAMAL ke sintaks JSON berdasarkan preferensi Anda. 

1. Tinjau detail template Anda untuk memastikan semuanya sudah diatur dengan benar. Untuk membuatnya lebih mudah untuk meninjau dan memahami template, Anda dapat beralih dari tampilan kode default ke tampilan grafis dari infrastruktur yang dijelaskan dalam template menggunakan Infrastructure Composer. Untuk melakukannya, di bawah **Template**, pilih **Canvas** bukan **Template**.

    **Tindakan kanvas** 
   + Untuk fokus pada detail sumber daya tertentu dalam template Anda, klik dua kali kartu untuk membuka panel **Resource properties**.
   + Untuk mengatur dan mengatur kartu secara visual di kanvas, pilih **Atur** dari kiri atas kanvas. 
   + Untuk memperbesar dan memperkecil kanvas Anda, gunakan kontrol zoom di kanan bawah kanvas. 

1. Untuk melihat sumber daya tertentu di konsol, pilih tab **Sumber daya Template**, lalu pilih ID fisik sumber daya yang ingin Anda lihat. Ini membawa Anda ke konsol untuk sumber daya tertentu. Anda juga dapat menambahkan, menghapus, dan menyinkronkan ulang sumber daya dalam definisi templat dari tab **Sumber daya Template**. 

1. Pada tab **Definisi Template**, generator IAc mungkin mengeluarkan peringatan tentang sumber daya yang berisi properti khusus tulis. Setelah meninjau peringatan, Anda dapat mengunduh templat yang dihasilkan dan membuat perubahan yang diperlukan. Untuk informasi selengkapnya, lihat [Selesaikan properti hanya tulis](generate-IaC-write-only-properties.md).

1. Ketika Anda puas dengan definisi template Anda, pada tab **Definisi template**, pilih **Impor untuk ditumpuk** dan kemudian pilih **Berikutnya**.

1. Pada panel **Tentukan tumpukan** dari halaman **Tentukan detail tumpukan**, masukkan nama tumpukan Anda, lalu pilih **Berikutnya**.

1. Tinjau dan masukkan parameter untuk tumpukan. Pilih **Berikutnya**.

1. Tinjau opsi Anda di halaman **Tinjau perubahan** dan pilih **Berikutnya**.

1. Tinjau detail Anda di halaman **Tinjau dan impor** dan pilih **Impor sumber daya**. 

# Selesaikan properti hanya tulis
<a name="generate-IaC-write-only-properties"></a>

Dengan generator CloudFormation IAC, Anda dapat membuat template menggunakan sumber daya yang disediakan di akun Anda yang belum dikelola oleh. CloudFormation Namun, properti sumber daya tertentu ditetapkan sebagai *write-only*, yang berarti mereka dapat ditulis tetapi tidak dapat dibaca oleh CloudFormation, misalnya, kata sandi database. 

Saat membuat CloudFormation templat dari sumber daya yang ada, properti khusus tulis menimbulkan tantangan. Dalam kebanyakan kasus, CloudFormation mengubah properti ini menjadi parameter dalam template yang dihasilkan. Ini memungkinkan Anda untuk memasukkan properti sebagai nilai parameter selama operasi impor. Namun, ada skenario di mana konversi ini tidak mungkin, dan CloudFormation menangani kasus ini secara berbeda.

## Properti yang saling eksklusif
<a name="write-only-mutually-exclusive-properties"></a>

Beberapa sumber daya memiliki beberapa set properti yang saling eksklusif, setidaknya beberapa di antaranya hanya ditulis. Dalam kasus ini, generator IAc tidak dapat menentukan kumpulan properti eksklusif mana yang diterapkan ke sumber daya selama pembuatan. Misalnya, Anda dapat memberikan kode untuk [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)menggunakan salah satu set properti ini. 
+ `Code/S3Bucket`,`Code/S3Key`, dan secara opsional `Code/S3ObjectVersion`
+ `Code/ImageUri`
+ `Code/ZipFile`

Semua properti ini hanya ditulis. Generator IAc memilih salah satu set properti eksklusif dan menambahkannya ke template yang dihasilkan. Parameter ditambahkan untuk masing-masing properti write-only. Nama parameter termasuk `OneOf` dan deskripsi parameter menunjukkan bahwa properti yang sesuai dapat diganti dengan properti eksklusif lainnya. Generator IAc menetapkan jenis peringatan `MUTUALLY_EXCLUSIVE_PROPERTIES` untuk properti yang disertakan.

## Jenis yang saling eksklusif
<a name="write-only-mutually-exclusive-types"></a>

Dalam beberapa kasus, properti write-only dapat terdiri dari beberapa tipe data. Misalnya, `Body` properti [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html)dapat berupa a `object` atau a`string`. Ketika ini terjadi, generator IAc menyertakan properti dalam template yang dihasilkan menggunakan jenis `string` dan menetapkan jenis `MUTUALLY_EXCLUSIVE_TYPES` peringatan.

## Arrayproperti
<a name="write-only-array-properties"></a>

Jika properti write-only memiliki tipe`array`, generator IAc tidak dapat memasukkannya ke dalam template yang dihasilkan karena parameter hanya dapat berupa nilai skalar. Dalam hal ini, properti dihilangkan dari template, dan jenis peringatan `UNSUPPORTED_PROPERTIES` ditetapkan.

## Properti opsional
<a name="write-only-optional-properties"></a>

Untuk properti write-only opsional, generator IAc tidak dapat mendeteksi apakah properti digunakan saat menyiapkan sumber daya. Dalam hal ini, properti dihilangkan dari template yang dihasilkan, dan jenis peringatan `UNSUPPORTED_PROPERTIES` disetel.

## Peringatan dan langkah selanjutnya
<a name="write-only-properties-warnings-and-next-steps"></a>

Untuk menentukan properti mana yang hanya ditulis, Anda harus melihat peringatan yang dikembalikan oleh konsol generator IAc. [Referensi tipe AWS sumber daya dan properti](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html) tidak menunjukkan apakah properti hanya ditulis, atau jika mendukung beberapa tipe.

Atau, Anda dapat melihat properti mana yang hanya ditulis dari skema penyedia sumber daya. Untuk mengunduh skema penyedia sumber daya, lihat [skema penyedia CloudFormation sumber daya](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html). 

**Untuk mengatasi masalah dengan properti khusus tulis**

1. Buka [halaman generator iAc](https://console.aws.amazon.com/cloudformation/home?#iac-generator) CloudFormation konsol.

1. Pada bilah navigasi di bagian atas layar, pilih Wilayah AWS untuk template Anda.

1. Pilih tab **Template**, lalu pilih nama template yang Anda buat.

1. Pada tab **Definisi templat**, ketika template yang dihasilkan menyertakan sumber daya dengan properti khusus tulis, konsol generator IAc menampilkan peringatan dengan ringkasan jenis masalah. Contoh:  
![\[Peringatan konsol generator IAC tentang properti hanya tulis di template yang dihasilkan\]](http://docs.aws.amazon.com/id_id/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-warning.png)

1. Pilih **Lihat detail peringatan untuk detail** selengkapnya. Sumber daya dengan properti write-only diidentifikasi oleh ID logis yang digunakan dalam template yang dihasilkan dan jenis sumber daya.

   Gunakan daftar peringatan untuk mengidentifikasi sumber daya dengan properti hanya tulis dan lihat setiap sumber daya untuk menentukan perubahan apa (jika ada) yang perlu dilakukan pada templat yang dihasilkan.  
![\[Konsol generator IAC peringatan terperinci tentang properti hanya tulis dalam templat yang dihasilkan\]](http://docs.aws.amazon.com/id_id/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-resource-warning.png)

1. Jika template Anda harus diperbarui untuk menyelesaikan masalah dengan properti write-only, lakukan hal berikut: 

   1. Pilih **Unduh** untuk mengunduh salinan templat.

   1. Edit template Anda.

   1. Saat perubahan selesai, Anda dapat memilih tombol **Impor templat yang diedit** untuk melanjutkan proses impor.

# Cara mengatasi masalah dengan properti khusus tulis di sumber daya AWS::ApiGateway::RestAPI
<a name="generate-IaC-apigateway-restapi"></a>

Topik ini menjelaskan cara mengatasi masalah dengan properti khusus tulis di [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html)sumber daya saat menggunakan generator IAc.

## Isu
<a name="apigateway-restapi-write-only-properties-issue"></a>

Ketika template yang dihasilkan berisi `AWS::ApiGateway::RestApi` sumber daya, maka peringatan dihasilkan yang menyatakan bahwa`Body`,`BodyS3Location`, dan `CloneFrom` properti diidentifikasi sebagai. `UNSUPPORTED_PROPERTIES` Ini karena ini adalah properti write-only opsional. Generator IAc tidak tahu apakah properti ini pernah diterapkan pada sumber daya. Oleh karena itu, ia menghilangkan properti ini dalam template yang dihasilkan.

## Resolusi
<a name="apigateway-restapi-write-only-properties-resolution"></a>

Untuk menyetel `Body` properti untuk REST API Anda, perbarui template yang Anda buat.

1. Gunakan tindakan API Amazon [https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html](https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html)API Gateway untuk mengunduh API. Misalnya, dengan menggunakan [https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html) AWS CLI perintah. Untuk informasi selengkapnya, lihat [Mengekspor REST API dari API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html) di *Panduan Pengembang API Gateway*.

1. Ambil `Body` properti dari respons tindakan `GetExport` API. Unggah ke bucket Amazon S3.

1. Unduh template yang dihasilkan.

1. Tambahkan `BodyS3Location/Key` properti `BodyS3Location/Bucket` dan ke template, tentukan nama bucket dan kunci tempat penyimpanan. `Body`

1. Buka template yang dihasilkan di konsol generator IAC dan pilih **Impor template yang diedit.**

# Cara mengatasi masalah dengan properti khusus tulis di sumber daya AWS::Lambda::Function
<a name="generate-IaC-lambda-function"></a>

Topik ini menjelaskan cara mengatasi masalah dengan properti khusus tulis di [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)sumber daya saat menggunakan generator IAc.

## Isu
<a name="lambda-function-mutually-exclusive-properties-issue"></a>

Sumber `AWS::Lambda::Function` daya memiliki tiga set properti yang saling eksklusif untuk menentukan kode Lambda:
+ `Code/S3Bucket`dan `Code/S3Key` properti, dan opsional properti `Code/S3ObjectVersion`
+ `Code/ImageUri`properti
+ `Code/ZipFile`properti

Hanya satu dari set ini yang dapat digunakan untuk `AWS::Lambda::Function` sumber daya tertentu.

Generator IAc tidak dapat menentukan kumpulan properti khusus tulis eksklusif mana yang digunakan untuk membuat atau memperbarui sumber daya. Akibatnya, ini hanya mencakup set properti pertama dalam template yang dihasilkan. `Code/ZipFile`Properti `Code/ImageUri` dan dihilangkan. 

Selain itu, generator IAc mengeluarkan peringatan berikut:
+ **`MUTUALLY_EXCLUSIVE_PROPERTIES`**Memperingatkan bahwa `Code/S3Bucket` dan `Code/S3Key` diidentifikasi sebagai properti yang saling eksklusif.
+ **`UNSUPPORTED_PROPERTIES`**Memperingatkan bahwa `Code/S3ObjectVersion` properti tidak didukung.

Untuk menyertakan `AWS::Lambda::Function` sumber daya dalam template yang dihasilkan, Anda harus mengunduh dan memperbarui template dengan properti kode yang benar.

## Resolusi
<a name="lambda-function-mutually-exclusive-properties-resolution"></a>

**Jika Anda menyimpan kode Lambda di bucket Amazon S3 dan tidak menggunakan `S3ObjectVersion`** properti, Anda dapat mengimpor template yang dihasilkan tanpa modifikasi apa pun. Generator IAC akan meminta Anda untuk bucket Amazon S3 dan kunci sebagai parameter template selama operasi impor.

****Jika Anda menyimpan kode Lambda Anda sebagai repositori Amazon ECR**, Anda dapat memperbarui template Anda menggunakan petunjuk berikut:**

1. Unduh template yang dihasilkan.

1. Hapus properti dan parameter yang sesuai untuk `Code/S3Key` properti `Code/S3Bucket` dan dari template yang dihasilkan.

1. Ganti properti yang dihapus dalam template yang dihasilkan dengan `Code/ImageUri` properti, tentukan URL untuk repositori Amazon ECR.

1. Buka template yang dihasilkan di konsol generator IAC dan pilih tombol **Impor templat yang diedit**.

****Jika Anda menyimpan kode Lambda Anda seperti dalam file zip**, Anda dapat memperbarui template Anda menggunakan petunjuk berikut:**

1. Unduh template yang dihasilkan.

1. Hapus properti dan parameter yang sesuai untuk `Code/S3Key` properti `Code/S3Bucket` dan dari template yang dihasilkan.

1. Ganti properti yang dihapus dalam template yang dihasilkan dengan `Code/ZipFile` properti.

1. Buka template yang dihasilkan di konsol generator IAC dan pilih tombol **Impor templat yang diedit**.

****Jika Anda tidak memiliki salinan kode Lambda Anda**, Anda dapat memperbarui template Anda menggunakan petunjuk berikut:**

1. Gunakan tindakan AWS Lambda [https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html)API (misalnya, dengan menggunakan [https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html) AWS CLI perintah.

1. Sebagai tanggapan, `RepositoryType` parameternya adalah `S3` jika kode ada di bucket Amazon S3, atau `ECR` jika kode tersebut ada di repositori Amazon ECR.

1. Sebagai tanggapan, `Location` parameter berisi URL yang telah ditandatangani sebelumnya yang dapat Anda gunakan untuk mengunduh paket penerapan selama 10 menit. Unduh kodenya.

1. Unggah kode ke bucket Amazon S3.

1. Jalankan operasi impor dengan templat yang dihasilkan dan berikan nama dan kunci bucket sebagai nilai parameter.

# Dapatkan nilai yang disimpan di layanan lain menggunakan referensi dinamis
<a name="dynamic-references"></a>

Referensi dinamis memberikan cara yang nyaman bagi Anda untuk menentukan nilai eksternal yang disimpan dan dikelola di layanan lain dan memisahkan informasi sensitif dari templat Anda infrastructure-as-code. CloudFormation mengambil nilai referensi yang ditentukan bila diperlukan selama tumpukan dan mengubah operasi set.

Dengan referensi dinamis, Anda dapat:
+ **Gunakan string aman** — Untuk data sensitif, selalu gunakan parameter string aman di AWS Systems Manager Parameter Store atau rahasia AWS Secrets Manager untuk memastikan data Anda dienkripsi saat istirahat.
+ **Batasi akses** — Batasi akses ke parameter Parameter Store atau rahasia Secrets Manager hanya untuk prinsipal dan peran yang berwenang.
+ **Putar kredensyal** — Putar data sensitif Anda secara teratur yang disimpan di Parameter Store atau Secrets Manager untuk mempertahankan tingkat keamanan yang tinggi.
+ **Rotasi otomatis** — Manfaatkan fitur rotasi otomatis Secrets Manager untuk memperbarui dan mendistribusikan data sensitif Anda secara berkala di seluruh aplikasi dan lingkungan Anda.

## Pertimbangan umum
<a name="dynamic-references-considerations"></a>

Berikut ini adalah pertimbangan umum untuk Anda pertimbangkan sebelum Anda menentukan referensi dinamis dalam CloudFormation template Anda:
+ Hindari menyertakan referensi dinamis, atau data sensitif apa pun, di properti sumber daya yang merupakan bagian dari pengenal utama sumber daya. CloudFormation dapat menggunakan nilai plaintext aktual dalam pengidentifikasi sumber daya utama, yang bisa menjadi risiko keamanan. ID sumber daya ini mungkin muncul dalam output turunan atau tujuan.

  Untuk menentukan properti sumber daya mana yang terdiri dari pengidentifikasi utama tipe sumber daya, lihat dokumentasi referensi sumber daya untuk sumber daya tersebut dalam referensi [tipe AWS sumber daya dan properti](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html). Di bagian **Kembalikan nilai**, nilai `Ref` pengembalian fungsi mewakili properti sumber daya yang terdiri dari tipe pengidentifikasi utama sumber daya.
+ Anda dapat menyertakan hingga 60 referensi dinamis dalam templat tumpukan.
+ Jika Anda menggunakan transformasi (seperti `AWS::Include` atau`AWS::Serverless`), CloudFormation tidak menyelesaikan referensi dinamis sebelum menerapkan transformasi. Sebagai gantinya, ia meneruskan string literal dari referensi dinamis ke transformasi, dan menyelesaikan referensi saat Anda menjalankan set perubahan menggunakan template.
+ Referensi dinamis tidak dapat digunakan untuk nilai aman (seperti yang disimpan di Parameter Store atau Secrets Manager) di sumber daya khusus. 
+ Referensi dinamis juga tidak didukung dalam `AWS::CloudFormation::Init` metadata dan properti Amazon `UserData` EC2.
+ Jangan membuat referensi dinamis yang diakhiri dengan garis miring terbalik (\$1). CloudFormationtidak dapat menyelesaikan referensi ini, yang akan menyebabkan operasi tumpukan gagal.

Topik berikut memberikan informasi dan pertimbangan lain untuk menggunakan referensi dinamis.

**Topics**
+ [Pertimbangan umum](#dynamic-references-considerations)
+ [Dapatkan nilai plaintext dari Systems Manager Parameter Store](dynamic-references-ssm.md)
+ [Dapatkan nilai string aman dari Systems Manager Parameter Store](dynamic-references-ssm-secure-strings.md)
+ [Dapatkan nilai rahasia atau rahasia dari Secrets Manager](dynamic-references-secretsmanager.md)

# Dapatkan nilai plaintext dari Systems Manager Parameter Store
<a name="dynamic-references-ssm"></a>

Saat membuat CloudFormation template, Anda mungkin ingin menggunakan nilai plaintext yang disimpan di Parameter Store. Parameter Store adalah kemampuan AWS Systems Manager. Untuk pengantar Parameter Store, lihat [AWS Systems Manager Parameter Menyimpan](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) di *Panduan AWS Systems Manager Pengguna*. 

Untuk menggunakan nilai plaintext dari Parameter Store dalam template Anda, Anda menggunakan referensi `ssm` dinamis. Referensi ini memungkinkan Anda untuk mengakses nilai dari parameter tipe `String` atau `StringList` di Parameter Store. 

Untuk memverifikasi versi referensi `ssm` dinamis mana yang akan digunakan dalam operasi tumpukan, buat set perubahan untuk operasi tumpukan. Kemudian, tinjau template yang diproses pada tab **Template**. Untuk informasi selengkapnya, lihat [Buat set perubahan untuk CloudFormation tumpukan](using-cfn-updating-stacks-changesets-create.md).

Saat menggunakan referensi `ssm` dinamis, ada beberapa hal penting yang perlu diingat:
+ CloudFormation tidak mendukung deteksi drift pada referensi dinamis. Untuk referensi `ssm` dinamis di mana Anda belum menentukan versi parameter, sebaiknya, jika Anda memperbarui versi parameter di Systems Manager, Anda juga melakukan operasi pembaruan tumpukan pada tumpukan apa pun yang menyertakan referensi `ssm` dinamis, untuk mengambil versi parameter terbaru.
+ Untuk menggunakan referensi `ssm` dinamis di `Parameters` bagian CloudFormation template Anda, Anda harus menyertakan nomor versi. CloudFormation tidak memungkinkan Anda untuk mereferensikan nilai Parameter Store tanpa nomor versi di bagian ini. Atau, Anda dapat menentukan parameter Anda sebagai tipe parameter Systems Manager di template Anda. Ketika Anda melakukan ini, Anda dapat menentukan kunci parameter Systems Manager sebagai nilai default untuk parameter Anda. CloudFormation kemudian akan mengambil versi terbaru dari nilai parameter dari Parameter Store, tanpa Anda harus menentukan nomor versi. Ini dapat membuat template Anda lebih sederhana dan lebih mudah dirawat. Untuk informasi selengkapnya, lihat [Tentukan sumber daya yang ada saat runtime dengan CloudFormation tipe parameter yang disediakan](cloudformation-supplied-parameter-types.md).
+ Untuk sumber daya kustom, CloudFormation selesaikan referensi `ssm` dinamis sebelum mengirim permintaan ke sumber daya kustom.
+ CloudFormation tidak mendukung penggunaan referensi dinamis untuk mereferensikan parameter yang dibagikan dari yang lain Akun AWS.
+ CloudFormation tidak mendukung penggunaan label parameter Systems Manager dalam referensi dinamis.

## Izin
<a name="dynamic-references-ssm-permissions"></a>

Untuk menentukan parameter yang disimpan di Systems Manager Parameter Store, Anda harus memiliki izin [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)untuk memanggil parameter yang ditentukan. *Untuk mempelajari cara membuat kebijakan IAM yang menyediakan akses ke parameter Systems Manager tertentu, lihat [Membatasi akses ke parameter Systems Manager menggunakan kebijakan IAM di Panduan](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-access.html) Pengguna.AWS Systems Manager *

## Pola referensi
<a name="dynamic-references-ssm-pattern"></a>

Untuk mereferensikan nilai plaintext yang disimpan di Systems Manager Parameter Store di CloudFormation template Anda, gunakan pola `ssm` referensi berikut.

```
{{resolve:ssm:parameter-name:version}}
```

Referensi Anda harus mematuhi pola ekspresi reguler berikut untuk nama parameter dan versi:

```
{{resolve:ssm:[a-zA-Z0-9_.\-/]+(:\d+)?}}
```

`parameter-name`  
Nama parameter dalam Penyimpanan Parameter. Perhatikan bahwa nama parameter bersifat peka huruf besar-kecil.  
Wajib.

`version`  
Integer yang menentukan versi parameter untuk digunakan. Jika Anda tidak menentukan versi yang tepat, CloudFormation gunakan versi terbaru dari parameter setiap kali Anda membuat atau memperbarui tumpukan. Untuk informasi selengkapnya, lihat [Bekerja dengan versi parameter](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html) di *Panduan AWS Systems Manager Pengguna*.  
Tidak wajib.

## Contoh
<a name="dynamic-references-ssm-examples"></a>

**Topics**
+ [Parameter ID AMI Publik](#dynamic-references-ssm-public-ami-example)
+ [Parameter ID AMI kustom](#dynamic-references-ssm-custom-ami-example)

### Parameter ID AMI Publik
<a name="dynamic-references-ssm-public-ami-example"></a>

Contoh berikut membuat instance EC2 yang mereferensikan parameter AMI publik. Referensi dinamis mengambil ID AMI Amazon Linux 2023 terbaru dari parameter publik. Untuk informasi selengkapnya tentang parameter publik, lihat [Menemukan parameter publik di Penyimpanan Parameter](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) di *Panduan AWS Systems Manager Pengguna*.

#### JSON
<a name="dynamic-references-ssm-public-ami-example.json"></a>

```
{
    "Resources": {
        "MyInstance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
                "InstanceType": "t2.micro"
            }
        }
    }
}
```

#### YAML
<a name="dynamic-references-ssm-public-ami-example.yaml"></a>

```
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      InstanceType: t2.micro
```

### Parameter ID AMI kustom
<a name="dynamic-references-ssm-custom-ami-example"></a>

Contoh berikut membuat template peluncuran EC2 yang mereferensikan ID AMI kustom yang disimpan di Parameter Store. Referensi dinamis mengambil ID AMI *`2`* dari versi `golden-ami` parameter setiap kali instance diluncurkan dari template peluncuran.

#### JSON
<a name="dynamic-references-ssm-custom-ami-example.json"></a>

```
{
    "Resources": {
        "MyLaunchTemplate": {
            "Type": "AWS::EC2::LaunchTemplate",
            "Properties": {
                "LaunchTemplateName": {
                    "Fn::Sub": "${AWS::StackName}-launch-template"
                },
                "LaunchTemplateData": {
                    "ImageId": "{{resolve:ssm:golden-ami:2}}",
                    "InstanceType": "t2.micro"
                }
            }
        }
    }
}
```

#### YAML
<a name="dynamic-references-ssm-custom-ami-example.yaml"></a>

```
Resources:
  MyLaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: '{{resolve:ssm:golden-ami:2}}'
        InstanceType: t2.micro
```

# Dapatkan nilai string aman dari Systems Manager Parameter Store
<a name="dynamic-references-ssm-secure-strings"></a>

Di CloudFormation, Anda dapat menggunakan data sensitif seperti kata sandi atau kunci lisensi tanpa mengeksposnya langsung di templat Anda dengan menyimpan data sensitif sebagai “string aman” di AWS Systems Manager Parameter Store. Untuk pengenalan Parameter Store, lihat [AWS Systems Manager Parameter Menyimpan](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) di *Panduan AWS Systems Manager Pengguna*.

Untuk menggunakan string aman Parameter Store dalam template Anda, Anda menggunakan referensi `ssm-secure` dinamis. CloudFormation tidak pernah menyimpan nilai string aman yang sebenarnya. Sebaliknya, ia hanya menyimpan referensi dinamis literal, yang berisi nama parameter plaintext dari string aman. 

Selama pembuatan tumpukan atau pembaruan, CloudFormation mengakses nilai string aman sesuai kebutuhan, tanpa mengekspos nilai sebenarnya. String aman hanya dapat digunakan untuk properti sumber daya yang mendukung pola referensi `ssm-secure` dinamis. Untuk informasi selengkapnya, lihat [Sumber daya yang men-support pola parameter dinamis untuk string aman](#template-parameters-dynamic-patterns-resources).

CloudFormation tidak mengembalikan nilai parameter aktual untuk string aman dalam panggilan API apa pun. Ini hanya mengembalikan referensi dinamis literal. Saat membandingkan perubahan menggunakan set perubahan, CloudFormation hanya membandingkan string referensi dinamis literal. Itu tidak menyelesaikan dan membandingkan nilai string aman yang sebenarnya.

Saat menggunakan referensi `ssm-secure` dinamis, ada beberapa hal penting yang perlu diingat:
+ CloudFormation tidak dapat mengakses nilai Parameter Store dari yang lain Akun AWS.
+ CloudFormation tidak mendukung penggunaan label parameter Systems Manager atau parameter publik dalam referensi dinamis.
+ Di wilayah `cn-north-1` dan `cn-northwest-1` wilayah, string aman tidak didukung oleh Systems Manager.
+ Referensi dinamis untuk nilai aman, seperti`ssm-secure`, saat ini tidak didukung dalam sumber daya khusus.
+ Jika CloudFormation perlu memutar kembali pembaruan tumpukan, dan versi parameter string aman yang ditentukan sebelumnya tidak lagi tersedia, operasi rollback akan gagal. Dalam kasus seperti itu, Anda memiliki dua opsi:
  + Gunakan `CONTINUE_UPDATE_ROLLBACK` untuk melewati sumber daya.
  + Buat ulang parameter string aman di Systems Manager Parameter Store, dan perbarui hingga versi parameter mencapai versi yang digunakan dalam template. Kemudian, gunakan `CONTINUE_UPDATE_ROLLBACK` tanpa melewatkan sumber daya.

## Sumber daya yang men-support pola parameter dinamis untuk string aman
<a name="template-parameters-dynamic-patterns-resources"></a>

Sumber daya yang mendukung pola referensi `ssm-secure` dinamis meliputi:


| Sumber daya | Jenis properti | Sifat-sifat | 
| --- | --- | --- | 
| [AWS::DirectoryService::MicrosoftIKLAN](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html) |  | `Password` | 
| [AWS::DirectoryService::SimpleIKLAN](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-simplead.html) |  | `Password` | 
| [AWS::ElastiCache::ReplicationGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticache-replicationgroup.html) |  | `AuthToken` | 
| [AWS::IAM::User](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) | [LoginProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html) | `Password` | 
| [AWS::KinesisFirehose::DeliveryStream](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-kinesisfirehose-deliverystream.html) | [RedshiftDestinationConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html) | `Password` | 
| [AWS::OpsWorks::App](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-app.html) | [Sumber](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-app-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [CustomCookbooksSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [RdsDbInstances](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-rdsdbinstance.html) | `DbPassword` | 
| [AWS: :RDS:: DBCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html) |  | `MasterUserPassword` | 
| [AWS: :RDS:: DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) |  | `MasterUserPassword`  | 
| [AWS::Redshift::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html) |  | `MasterUserPassword` | 

## Pola referensi
<a name="dynamic-references-ssm-secure-pattern"></a>

Untuk mereferensikan nilai string aman dari Systems Manager Parameter Store di CloudFormation template Anda, gunakan pola `ssm-secure` referensi berikut.

```
{{resolve:ssm-secure:parameter-name:version}}
```

Referensi Anda harus mematuhi pola ekspresi reguler berikut untuk nama parameter dan versi:

```
{{resolve:ssm-secure:[a-zA-Z0-9_.\-/]+(:\d+)?}}
```

`parameter-name`  
Nama parameter dalam Penyimpanan Parameter. Perhatikan bahwa nama parameter bersifat peka huruf besar-kecil.  
Wajib.

`version`  
Integer yang menentukan versi parameter untuk digunakan. Jika Anda tidak menentukan versi yang tepat, CloudFormation gunakan versi terbaru dari parameter setiap kali Anda membuat atau memperbarui tumpukan. Untuk informasi selengkapnya, lihat [Bekerja dengan versi parameter](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html) di *Panduan AWS Systems Manager Pengguna*.  
Tidak wajib.

## Contoh
<a name="dynamic-references-ssm-secure-example"></a>

Contoh berikut menggunakan referensi `ssm-secure` dinamis untuk mengatur kata sandi untuk pengguna IAM ke string aman yang disimpan di Parameter Store. Seperti yang ditentukan, CloudFormation akan menggunakan *`10`* versi `IAMUserPassword` parameter untuk tumpukan dan mengubah operasi set.

### JSON
<a name="dynamic-references-ssm-secure-example.json"></a>

```
  "MyIAMUser": {
    "Type": "AWS::IAM::User",
    "Properties": {
      "UserName": "MyUserName",
      "LoginProfile": {
        "Password": "{{resolve:ssm-secure:IAMUserPassword:10}}"
      }
    }
  }
```

### YAML
<a name="dynamic-references-ssm-secure-example.yaml"></a>

```
  MyIAMUser:
    Type: AWS::IAM::User
    Properties:
      UserName: 'MyUserName'
      LoginProfile:
        Password: '{{resolve:ssm-secure:IAMUserPassword:10}}'
```

# Dapatkan nilai rahasia atau rahasia dari Secrets Manager
<a name="dynamic-references-secretsmanager"></a>

Secrets Manager adalah layanan yang memungkinkan Anda menyimpan dan mengelola rahasia dengan aman seperti kredensi database, kata sandi, dan kunci API pihak ketiga. Dengan menggunakan Secrets Manager, Anda dapat menyimpan dan mengontrol akses ke rahasia ini secara terpusat, sehingga Anda dapat mengganti kredensi hardcode dalam kode Anda (termasuk kata sandi), dengan panggilan API ke Secrets Manager untuk mengambil rahasia secara terprogram. Untuk informasi lebih lanjut, lihat [Apa itu AWS Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) dalam *AWS Secrets Manager User Guide*.

Untuk menggunakan seluruh rahasia atau nilai rahasia yang disimpan di Secrets Manager dalam CloudFormation template Anda, Anda menggunakan referensi `secretsmanager` dinamis.

## Praktik terbaik
<a name="dynamic-references-secretsmanager-best-practices"></a>

Ikuti praktik terbaik ini saat menggunakan referensi dinamis Secrets Manager di CloudFormation template Anda:
+ **Gunakan referensi tanpa versi untuk CloudFormation template Anda** — Simpan kredensi di Secrets Manager dan gunakan referensi dinamis tanpa menentukan `version-stage` atau `version-id` parameter untuk mendukung alur kerja rotasi rahasia yang tepat.
+ **Manfaatkan rotasi otomatis** — Gunakan fitur rotasi otomatis Secrets Manager dengan referensi dinamis tanpa versi untuk manajemen kredensi. Ini memastikan kredensialmu diperbarui secara berkala tanpa memerlukan perubahan template. Untuk informasi selengkapnya, lihat [Merotasi rahasia AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html).
+ **Gunakan referensi berversi hemat** — Hanya tentukan eksplisit `version-stage` atau `version-id` parameter untuk skenario tertentu seperti situasi pengujian atau rollback.

## Pertimbangan-pertimbangan
<a name="dynamic-references-secretsmanager-considerations"></a>

Saat menggunakan referensi `secretsmanager` dinamis, ada pertimbangan penting yang perlu diingat:
+ CloudFormation tidak melacak versi rahasia mana yang digunakan dalam penerapan sebelumnya. Rencanakan strategi manajemen rahasia Anda dengan hati-hati sebelum menerapkan referensi dinamis. Gunakan referensi tanpa versi bila memungkinkan untuk memanfaatkan rotasi rahasia otomatis. Pantau dan validasi pembaruan sumber daya saat membuat perubahan pada konfigurasi referensi dinamis, seperti saat beralih dari referensi dinamis yang tidak berversi ke berversi, dan sebaliknya.
+ Memperbarui hanya nilai rahasia di Secrets Manager tidak secara otomatis menyebabkan CloudFormation untuk mengambil nilai baru. CloudFormation mengambil nilai rahasia hanya selama pembuatan sumber daya atau pembaruan yang memodifikasi sumber daya yang berisi referensi dinamis. 

  Misalnya, anggaplah template Anda menyertakan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)sumber daya tempat `MasterPassword` properti disetel ke referensi dinamis Secrets Manager. Setelah membuat tumpukan dari template ini, Anda memperbarui nilai rahasia di Secrets Manager. Namun, `MasterPassword` properti mempertahankan nilai kata sandi lama. 

  Untuk menerapkan nilai rahasia baru, Anda harus memodifikasi `AWS::RDS::DBInstance` sumber daya di CloudFormation template Anda dan melakukan pembaruan tumpukan. 

  Untuk menghindari proses manual ini di masa depan, pertimbangkan untuk menggunakan Secrets Manager untuk memutar rahasia secara otomatis. 
+ Referensi dinamis untuk nilai aman, seperti`secretsmanager`, saat ini tidak didukung dalam sumber daya khusus.
+ Referensi `secretsmanager` dinamis dapat digunakan di semua atribut sumber daya. Menggunakan referensi `secretsmanager` dinamis menunjukkan bahwa Secrets Manager maupun CloudFormation log tidak boleh mempertahankan nilai rahasia yang diselesaikan. Namun, nilai rahasia dapat muncul di layanan yang sumber dayanya digunakan. Tinjau penggunaan Anda untuk menghindari kebocoran data rahasia.

## Izin
<a name="dynamic-references-secretsmanager-permissions"></a>

Untuk menentukan rahasia yang disimpan di Secrets Manager, Anda harus memiliki izin [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)untuk memanggil rahasia tersebut.

## Pola referensi
<a name="dynamic-references-secretsmanager-pattern"></a>

Untuk mereferensikan rahasia Secrets Manager di CloudFormation template Anda, gunakan pola `secretsmanager` referensi berikut.

```
{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
```

`secret-id`  
Nama atau ARN rahasianya.  
Untuk mengakses rahasia di Anda Akun AWS, Anda hanya perlu menentukan nama rahasia. Untuk mengakses rahasia di tempat yang berbeda Akun AWS, tentukan ARN lengkap rahasia tersebut.  
Wajib.

`secret-string`  
Satu-satunya nilai yang di-support adalah `SecretString`. Nilai default-nya `SecretString`.

`json-key`  
Nama kunci dari pasangan kunci-nilai yang nilainya ingin Anda ambil. Jika Anda tidak menentukan`json-key`, CloudFormation mengambil seluruh teks rahasia.  
Segmen ini mungkin tidak memasukkan karakter titik dua ( `:`).

`version-stage`  
Label pementasan versi rahasia yang akan digunakan. Secrets Manager menggunakan label pementasan untuk melacak versi yang berbeda selama proses rotasi. Jika Anda menggunakan `version-stage` maka jangan tentukan `version-id`. Jika Anda tidak menentukan salah satu `version-stage` atau`version-id`, maka defaultnya adalah `AWSCURRENT` versinya.  
Segmen ini mungkin tidak memasukkan karakter titik dua ( `:`).

`version-id`  
Pengidentifikasi unik dari versi rahasia yang akan digunakan. Jika Anda menentukan `version-id`, jangan tentukan `version-stage`. Jika Anda tidak menentukan salah satu `version-stage` atau`version-id`, maka defaultnya adalah `AWSCURRENT` versinya.  
Segmen ini mungkin tidak memasukkan karakter titik dua ( `:`).

## Contoh
<a name="dynamic-references-secretsmanager-examples"></a>

**Topics**
+ [Mengambil nilai nama pengguna dan kata sandi dari rahasia](#dynamic-references-secretsmanager-examples-user-name-and-password)
+ [Mengambil seluruh SecretString](#dynamic-references-secretsmanager-examples-entire-secretstring)
+ [Mengambil nilai dari versi rahasia tertentu](#dynamic-references-secretsmanager-examples-specific-version)
+ [Mengambil rahasia dari yang lain Akun AWS](#dynamic-references-secretsmanager-examples-secrets-from-another-account)

### Mengambil nilai nama pengguna dan kata sandi dari rahasia
<a name="dynamic-references-secretsmanager-examples-user-name-and-password"></a>

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)Contoh berikut mengambil nama pengguna dan nilai kata sandi yang disimpan dalam `MySecret` rahasia. Contoh ini menunjukkan pola yang direkomendasikan untuk referensi dinamis tanpa versi, yang secara otomatis menggunakan `AWSCURRENT` versi dan mendukung alur kerja rotasi Secrets Manager tanpa memerlukan perubahan template.

#### JSON
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.json"></a>

```
{
    "MyRDSInstance": {
        "Type": "AWS::RDS::DBInstance",
        "Properties": {
            "DBName": "MyRDSInstance",
            "AllocatedStorage": "20",
            "DBInstanceClass": "db.t2.micro",
            "Engine": "mysql",
            "MasterUsername": "{{resolve:secretsmanager:MySecret:SecretString:username}}",
            "MasterUserPassword": "{{resolve:secretsmanager:MySecret:SecretString:password}}"
        }
    }
}
```

#### YAML
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.yaml"></a>

```
  MyRDSInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MyRDSInstance
      AllocatedStorage: '20'
      DBInstanceClass: db.t2.micro
      Engine: mysql
      MasterUsername: '{{resolve:secretsmanager:MySecret:SecretString:username}}'
      MasterUserPassword: '{{resolve:secretsmanager:MySecret:SecretString:password}}'
```

### Mengambil seluruh SecretString
<a name="dynamic-references-secretsmanager-examples-entire-secretstring"></a>

Referensi dinamis berikut mengambil `SecretString` for`MySecret`.

```
{{resolve:secretsmanager:MySecret}}
```

Atau:

```
{{resolve:secretsmanager:MySecret::::}}
```

### Mengambil nilai dari versi rahasia tertentu
<a name="dynamic-references-secretsmanager-examples-specific-version"></a>

Referensi dinamis berikut mengambil `password` nilai untuk `AWSPREVIOUS` versi. `MySecret`

```
{{resolve:secretsmanager:MySecret:SecretString:password:AWSPREVIOUS}}
```

### Mengambil rahasia dari yang lain Akun AWS
<a name="dynamic-references-secretsmanager-examples-secrets-from-another-account"></a>

Referensi dinamis berikut mengambil `SecretString` untuk `MySecret` yang lain Akun AWS. Anda harus menentukan ARN rahasia lengkap untuk mengakses rahasia di tempat lain. Akun AWS

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}
```

Referensi dinamis berikut mengambil `password` nilai untuk `MySecret` yang lain Akun AWS. Anda harus menentukan ARN rahasia lengkap untuk mengakses rahasia di tempat lain. Akun AWS

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}
```

# Dapatkan AWS nilai menggunakan parameter semu
<a name="pseudo-parameter-reference"></a>

Parameter semu adalah variabel bawaan yang menyediakan akses ke informasi AWS lingkungan penting seperti akun IDs, nama Wilayah, dan detail tumpukan yang dapat berubah antara penerapan atau lingkungan.

Anda dapat menggunakan parameter semu alih-alih nilai hard-code untuk membuat templat Anda lebih portabel dan lebih mudah digunakan kembali di berbagai wilayah dan wilayah. Akun AWS 

## Sintaksis
<a name="pseudo-parameter-syntax"></a>

Anda dapat mereferensikan parameter semu menggunakan fungsi `Ref` intrinsik atau fungsi intrinsik. `Fn::Sub` 

### Ref
<a name="pseudo-parameter-ref-syntax"></a>

Fungsi `Ref` intrinsik menggunakan sintaks umum berikut. Untuk informasi lebih lanjut, lihat [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html).

#### JSON
<a name="pseudo-parameter-ref-syntax.json"></a>

```
{ "Ref" : "AWS::PseudoParameter" }
```

#### YAML
<a name="pseudo-parameter-ref-syntax.yaml"></a>

```
!Ref AWS::PseudoParameter
```

### Fn: :Sub
<a name="pseudo-parameter-sub-syntax"></a>

Fungsi `Fn::Sub` intrinsik menggunakan format berbeda yang mencakup `${}` sintaks di sekitar parameter semu. Untuk informasi selengkapnya, lihat [Fn::Sub](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html).

#### JSON
<a name="pseudo-parameter-sub-syntax.json"></a>

```
{ "Fn::Sub" : "${AWS::PseudoParameter}" }
```

#### YAML
<a name="pseudo-parameter-sub-syntax.yaml"></a>

```
!Sub '${AWS::PseudoParameter}'
```

## Parameter pseudo yang tersedia
<a name="available-pseudo-parameters"></a>

### `AWS::AccountId`
<a name="cfn-pseudo-param-accountid"></a>

Mengembalikan Akun AWS ID akun di mana tumpukan sedang dibuat, seperti`123456789012`.

Parameter semu ini biasanya digunakan saat mendefinisikan peran IAM, kebijakan, dan kebijakan sumber daya lainnya yang melibatkan spesifik akun. ARNs

### `AWS::NotificationARNs`
<a name="cfn-pseudo-param-notificationarns"></a>

Mengembalikan daftar Nama Sumber Daya Amazon (ARNs) untuk topik Amazon SNS yang menerima pemberitahuan peristiwa tumpukan. Anda dapat menentukan ini ARNs melalui `--notification-arns` opsi di AWS CLI atau melalui konsol saat Anda membuat atau memperbarui tumpukan Anda.

Tidak seperti parameter semu lainnya yang mengembalikan nilai tunggal, `AWS::NotificationARNs` mengembalikan daftar. ARNs Untuk mengakses ARN tertentu dalam daftar, gunakan fungsi `Fn::Select` intrinsik. Untuk informasi selengkapnya, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-select.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-select.html).

### `AWS::NoValue`
<a name="cfn-pseudo-param-novalue"></a>

Menghapus atribut sumber daya yang sesuai jika ditentukan sebagai nilai kembali dalam fungsi intrinsik `Fn::If`. Untuk informasi selengkapnya, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if).

Parameter semu ini sangat berguna untuk membuat properti sumber daya bersyarat yang seharusnya hanya disertakan dalam kondisi tertentu.

### `AWS::Partition`
<a name="cfn-pseudo-param-partition"></a>

Mengembalikan partisi tempat sumber daya berada. Untuk standar Wilayah AWS, partisi adalah`aws`. Jika Anda memiliki sumber daya di partisi lain, maka partisi-nya adalah `aws-`*partitionname*. Misalnya, partisi untuk sumber daya di Wilayah Tiongkok (Beijing dan Ningxia) `aws-cn` adalah dan partisi untuk sumber daya di AWS GovCloud Wilayah (AS-Barat) adalah. `aws-us-gov`

Partisi merupakan bagian dari ARN untuk sumber daya. Menggunakan `AWS::Partition` memastikan template Anda bekerja dengan benar di berbagai AWS partisi.

### `AWS::Region`
<a name="cfn-pseudo-param-region"></a>

Mengembalikan string yang mewakili Wilayah tempat sumber daya yang dicakup sedang dibuat, seperti `us-west-2`.

Ini adalah salah satu parameter semu yang paling umum digunakan, karena memungkinkan template untuk beradaptasi dengan yang berbeda Wilayah AWS tanpa modifikasi.

### `AWS::StackId`
<a name="cfn-pseudo-param-stackid"></a>

Mengembalikan ID (ARN) dari tumpukan, seperti. `arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123`

### `AWS::StackName`
<a name="cfn-pseudo-param-stackname"></a>

Mengembalikan nama tumpukan, seperti`teststack`.

Nama tumpukan biasanya digunakan untuk membuat nama sumber daya unik yang mudah diidentifikasi sebagai milik tumpukan tertentu.

### `AWS::URLSuffix`
<a name="cfn-pseudo-param-urlsuffix"></a>

Mengembalikan akhiran untuk AWS domain di Wilayah AWS tempat tumpukan digunakan. Akhiran biasanya`amazonaws.com`, tetapi untuk Wilayah Tiongkok (Beijing), sufiksnya adalah. `amazonaws.com.cn`

Parameter ini sangat berguna ketika membangun URLs untuk titik akhir AWS layanan.

## Contoh
<a name="pseudo-parameter-examples"></a>

**Topics**
+ [Penggunaan dasar](#pseudo-parameter-basic-example)
+ [Menggunakan AWS::NotificationARNs](#pseudo-parameter-notification-example)
+ [Properti bersyarat dengan AWS::NoValue](#pseudo-parameter-novalue-example)

### Penggunaan dasar
<a name="pseudo-parameter-basic-example"></a>

Contoh berikut membuat dua sumber daya: topik Amazon SNS dan CloudWatch alarm yang mengirimkan pemberitahuan ke topik itu. Mereka menggunakan`AWS::StackName`,`AWS::Region`, dan `AWS::AccountId` untuk secara dinamis memasukkan nama tumpukan, saat ini Wilayah AWS, dan ID akun ke dalam nama sumber daya, deskripsi, dan. ARNs

#### JSON
<a name="pseudo-parameter-basic-example.json"></a>

```
{
    "Resources": {
        "MyNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "DisplayName": { "Fn::Sub": "Notifications for ${AWS::StackName}" }
            }
        },
        "CPUAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": { "Fn::Sub": "Alarm for high CPU in ${AWS::Region}" },
                "AlarmName": { "Fn::Sub": "${AWS::StackName}-HighCPUAlarm" },
                "MetricName": "CPUUtilization",
                "Namespace": "AWS/EC2",
                "Statistic": "Average",
                "Period": 300,
                "EvaluationPeriods": 1,
                "Threshold": 80,
                "ComparisonOperator": "GreaterThanThreshold",
                "AlarmActions": [{ "Fn::Sub": "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}" }]
            }
        }
    }
}
```

#### YAML
<a name="pseudo-parameter-basic-example.yaml"></a>

```
Resources:
  MyNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: !Sub Notifications for ${AWS::StackName}
  CPUAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: !Sub Alarm for high CPU in ${AWS::Region}
      AlarmName: !Sub ${AWS::StackName}-HighCPUAlarm
      MetricName: CPUUtilization
      Namespace: AWS/EC2
      Statistic: Average
      Period: 300
      EvaluationPeriods: 1
      Threshold: 80
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}
```

### Menggunakan AWS::NotificationARNs
<a name="pseudo-parameter-notification-example"></a>

Contoh berikut mengonfigurasi grup Auto Scaling untuk mengirim notifikasi misalnya peristiwa peluncuran dan kesalahan peluncuran. Konfigurasi menggunakan parameter `AWS::NotificationARNs` semu, yang menyediakan daftar ARNs topik Amazon SNS yang ditentukan selama pembuatan tumpukan. `Fn::Select`Fungsi memilih ARN pertama dari daftar itu.

#### JSON
<a name="pseudo-parameter-notification-example.json"></a>

```
"myASG": {
   "Type": "AWS::AutoScaling::AutoScalingGroup",
   "Properties": {
      "LaunchTemplate": {
         "LaunchTemplateId": { "Ref": "myLaunchTemplate" },
         "Version": { "Fn::GetAtt": [ "myLaunchTemplate", "LatestVersionNumber" ] }
       },
       "MaxSize": "1",
       "MinSize": "1",
       "VPCZoneIdentifier": [
          "subnetIdAz1",
          "subnetIdAz2",
          "subnetIdAz3"
      ],
      "NotificationConfigurations" : [{
         "TopicARN" : { "Fn::Select" : [ "0", { "Ref" : "AWS::NotificationARNs" } ] },
         "NotificationTypes" : [ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR" ]
      }]
   }
}
```

#### YAML
<a name="pseudo-parameter-notification-example.yaml"></a>

```
myASG:
  Type: AWS::AutoScaling::AutoScalingGroup
  Properties:
    LaunchTemplate:
      LaunchTemplateId: !Ref myLaunchTemplate
      Version: !GetAtt myLaunchTemplate.LatestVersionNumber
    MinSize: '1'
    MaxSize: '1'
    VPCZoneIdentifier:
      - subnetIdAz1
      - subnetIdAz2
      - subnetIdAz3
    NotificationConfigurations:
      - TopicARN:
          Fn::Select:
          - '0'
          - Ref: AWS::NotificationARNs
        NotificationTypes:
        - autoscaling:EC2_INSTANCE_LAUNCH
        - autoscaling:EC2_INSTANCE_LAUNCH_ERROR
```

### Properti bersyarat dengan AWS::NoValue
<a name="pseudo-parameter-novalue-example"></a>

Contoh berikut membuat instans Amazon RDS DB yang menggunakan snapshot hanya jika ID snapshot disediakan. Jika `UseDBSnapshot` kondisi mengevaluasi ke true, CloudFormation menggunakan nilai `DBSnapshotName` parameter untuk `DBSnapshotIdentifier` properti. Jika kondisi dievaluasi menjadi false, CloudFormation hapus `DBSnapshotIdentifier` properti. 

#### JSON
<a name="pseudo-parameter-novalue-example.json"></a>

```
"MyDB" : {
  "Type" : "AWS::RDS::DBInstance",
  "Properties" : {
    "AllocatedStorage" : "5",
    "DBInstanceClass" : "db.t2.small",
    "Engine" : "MySQL",
    "EngineVersion" : "5.5",
    "MasterUsername" : { "Ref" : "DBUser" },
    "MasterUserPassword" : { "Ref" : "DBPassword" },
    "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" },
    "DBSnapshotIdentifier" : {
      "Fn::If" : [
        "UseDBSnapshot",
        {"Ref" : "DBSnapshotName"},
        {"Ref" : "AWS::NoValue"}
      ]
    }
  }
}
```

#### YAML
<a name="pseudo-parameter-novalue-example.yaml"></a>

```
MyDB:
  Type: AWS::RDS::DBInstance
  Properties:
    AllocatedStorage: '5'
    DBInstanceClass: db.t2.small
    Engine: MySQL
    EngineVersion: '5.5'
    MasterUsername:
      Ref: DBUser
    MasterUserPassword:
      Ref: DBPassword
    DBParameterGroupName:
      Ref: MyRDSParamGroup
    DBSnapshotIdentifier:
      Fn::If:
        - UseDBSnapshot
        - Ref: DBSnapshotName
        - Ref: AWS::NoValue
```

# Dapatkan output yang diekspor dari tumpukan yang diterapkan CloudFormation
<a name="using-cfn-stack-exports"></a>

Jika Anda memiliki beberapa tumpukan di area yang sama Akun AWS dan Region, Anda mungkin ingin berbagi informasi di antara mereka. Ini berguna ketika satu tumpukan perlu menggunakan sumber daya yang dibuat oleh tumpukan lain.

Misalnya, Anda mungkin memiliki satu tumpukan yang membuat sumber daya jaringan, seperti subnet dan grup keamanan, untuk server web Anda. Tumpukan lain yang membuat server web yang sebenarnya kemudian dapat menggunakan sumber daya jaringan yang dibuat oleh tumpukan pertama. Anda tidak perlu membuat sumber daya kode keras IDs di template tumpukan atau meneruskannya IDs sebagai parameter input.

Untuk berbagi informasi antar tumpukan, Anda *mengekspor* nilai keluaran dari satu tumpukan dan *mengimpornya* ke tumpukan lain. Begini cara kerjanya:

1. Di template tumpukan pertama (misalnya, tumpukan jaringan), Anda menentukan nilai tertentu untuk ekspor dengan menggunakan `Export` bidang di `Outputs` bagian tersebut. Untuk informasi selengkapnya, lihat [CloudFormation Outputssintaks template](outputs-section-structure.md).

1. Saat Anda membuat atau memperbarui tumpukan itu, CloudFormation ekspor nilai output, membuatnya tersedia untuk tumpukan lain di wilayah Akun AWS dan yang sama.

1. Di template tumpukan lain, Anda menggunakan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html)fungsi untuk mengimpor nilai yang diekspor dari tumpukan pertama.

1. Saat Anda membuat atau memperbarui tumpukan kedua (misalnya, tumpukan server web), CloudFormation secara otomatis mengambil nilai yang diekspor dari tumpukan pertama dan menggunakannya.

Untuk panduan dan contoh templat, lihat [Lihat output sumber daya di tumpukan lain CloudFormation](walkthrough-crossstackref.md).

## Mengekspor nilai output tumpukan versus menggunakan tumpukan bersarang
<a name="output-vs-nested"></a>

Tumpukan bersarang adalah tumpukan yang Anda buat dalam tumpukan lain dengan menggunakan `AWS::CloudFormation::Stack` sumber daya. Dengan tumpukan nest, Anda men-deploy dan mengelola semua sumber daya dari tumpukan tunggal. Anda dapat menggunakan output dari satu tumpukan dalam grup tumpukan nest sebagai input ke tumpukan lain dalam grup tersebut. Ini berbeda dari mengekspor nilai.

Jika Anda ingin mengisolasi berbagi informasi untuk dalam grup tumpukan nest, kami merekomendasikan Anda untuk menggunakan tumpukan nest. Untuk berbagi informasi dengan tumpukan lain (tidak hanya dalam grup tumpukan nest), ekspor nilai. Misalnya, Anda dapat membuat satu tumpukan dengan subnet dan kemudian mengekspor ID nya. Tumpukan lain dapat menggunakan subnet itu dengan mengimpor ID-nya. Setiap tumpukan tidak perlu membuat subnetnya sendiri. Selama tumpukan mengimpor ID subnet, Anda tidak dapat mengubah atau menghapusnya.

Untuk informasi lebih lanjut tentang tumpukan bersarang, lihat. [Pisahkan template menjadi potongan-potongan yang dapat digunakan kembali menggunakan tumpukan bersarang](using-cfn-nested-stacks.md)

## Pertimbangan-pertimbangan
<a name="using-cfn-stack-exports-considerations"></a>

Pembatasan berikut berlaku untuk referensi cross-stack:
+ Untuk masing-masing Akun AWS, `Export` nama harus unik dalam suatu Wilayah.
+ Anda tidak dapat membuat referensi cross-stack di seluruh Wilayah. Anda dapat menggunakan fungsi intrinsik `Fn::ImportValue` untuk mengimpor hanya nilai yang telah diekspor dalam Wilayah yang sama.
+ Untuk output, nilai `Name` properti tidak `Export` dapat digunakan `Ref` atau `GetAtt` fungsi yang bergantung pada sumber daya.

  Demikian pula, `ImportValue` fungsi tidak dapat menyertakan `Ref` atau `GetAtt` fungsi yang bergantung pada sumber daya.
+ Setelah tumpukan lain mengimpor nilai output, Anda tidak dapat menghapus tumpukan yang mengekspor nilai output atau memodifikasi nilai output yang diekspor. Semua impor harus dihapus sebelum Anda dapat menghapus tumpukan ekspor atau mengubah nilai output.

## Mencantumkan nilai output yang diekspor
<a name="using-cfn-stack-exports-listing"></a>

Jika Anda perlu melihat nilai output yang diekspor dari tumpukan Anda, gunakan salah satu metode berikut:

**Untuk mencantumkan nilai output yang diekspor (konsol)**

1. Buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Pada bilah navigasi di bagian atas layar, pilih Anda Wilayah AWS.

1. Dari panel navigasi kiri, pilih **Ekspor**.

**Untuk mencantumkan nilai output yang diekspor (AWS CLI)**  
Gunakan perintah berikut [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html). Ganti *us-east-1* dengan Anda Wilayah AWS.

```
aws cloudformation list-exports --region us-east-1
```

Berikut ini adalah output contoh.

```
{
    "Exports": [
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-a",
            "Value": "subnet-07b410xmplddcfa03"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-b",
            "Value": "subnet-075ed3xmplebd2fb1"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-vpcid",
            "Value": "vpc-011d7xmpl100e9841"
        }
    ]
}
```

CloudFormation menunjukkan nama dan nilai output yang diekspor untuk wilayah saat ini dan tumpukan tempat mereka diekspor. Untuk menggunakan nilai output yang diekspor di template tumpukan lain, Anda dapat mereferensikannya menggunakan nama ekspor dan `Fn::ImportValue` fungsinya.

## Pencantuman tumpukan yang mengimpor nilai output yang diekspor
<a name="using-cfn-stack-imports"></a>

Untuk menghapus atau mengubah nilai output yang diekspor, Anda harus terlebih dahulu mengetahui tumpukan mana yang mengimpornya.

Untuk melihat tumpukan yang mengimpor nilai output yang diekspor, gunakan salah satu metode berikut:

**Untuk mencantumkan tumpukan yang mengimpor nilai output yang diekspor (konsol)**

1. Buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Dari panel navigasi kiri, pilih **Ekspor**.

1. Untuk melihat tumpukan mana yang mengimpor nilai ekspor tertentu, pilih **Nama Ekspor** untuk nilai ekspor tersebut. CloudFormation menampilkan halaman detail ekspor, yang mencantumkan semua tumpukan yang mengimpor nilai.

**Untuk mencantumkan tumpukan yang mengimpor nilai output yang diekspor (AWS CLI)**  
Gunakan perintah [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html). Ganti *us-east-1* dengan Anda Wilayah AWS dan `private-vpc-vpcid` dengan nama nilai output yang diekspor.

```
aws cloudformation list-imports --region us-east-1 \
    --export-name private-vpc-vpcid
```

CloudFormation mengembalikan daftar tumpukan yang mengimpor nilai.

```
{
    "Imports": [
        "my-app-stack"
    ]
}
```

Setelah Anda mengetahui tumpukan mana yang mengimpor nilai ekspor tertentu, Anda perlu memodifikasi tumpukan tersebut untuk menghapus `Fn::ImportValue` fungsi yang mereferensikan nilai output. Anda harus menghapus semua impor yang mereferensikan nilai output yang diekspor sebelum Anda dapat menghapus atau mengubah nilai output yang diekspor. 

# Tentukan sumber daya yang ada saat runtime dengan CloudFormation tipe parameter yang disediakan
<a name="cloudformation-supplied-parameter-types"></a>

Saat membuat templat, Anda dapat membuat parameter yang mengharuskan pengguna memasukkan pengenal AWS sumber daya yang ada atau parameter Systems Manager dengan menggunakan tipe parameter khusus yang disediakan oleh CloudFormation. 

**Topics**
+ [Ikhtisar](#cloudformation-supplied-parameter-types-overview)
+ [Contoh](#cloudformation-supplied-parameter-types-example)
+ [Pertimbangan-pertimbangan](#cloudformation-supplied-parameter-types-considerations)
+ [Jenis parameter AWS spesifik yang didukung](#aws-specific-parameter-types-supported)
+ [Jenis parameter Systems Manager yang Didukung](#systems-manager-parameter-types-supported)
+ [Tipe parameter Systems Manager yang tidak didukung](#systems-manager-parameter-types-unsupported)

## Ikhtisar
<a name="cloudformation-supplied-parameter-types-overview"></a>

Di CloudFormation, Anda dapat menggunakan parameter untuk menyesuaikan tumpukan Anda dengan memberikan nilai input selama pembuatan atau pembaruan tumpukan. Fitur ini membuat template Anda dapat digunakan kembali dan fleksibel di berbagai skenario. 

Parameter didefinisikan di `Parameters` bagian CloudFormation template. Setiap parameter memiliki nama dan tipe, dan dapat memiliki pengaturan tambahan seperti nilai default dan nilai yang diizinkan. Untuk informasi selengkapnya, lihat [CloudFormation Parameterssintaks template](parameters-section-structure.md). 

Jenis parameter menentukan jenis nilai input yang dapat diterima parameter. Misalnya, `Number` hanya menerima nilai numerik, sementara `String` menerima input teks. 

CloudFormation menyediakan beberapa jenis parameter tambahan yang dapat Anda gunakan dalam template Anda untuk mereferensikan AWS sumber daya yang ada dan parameter Systems Manager. 

Jenis parameter ini terbagi dalam dua kategori:
+ **AWS Jenis parameter spesifik** - CloudFormation menyediakan satu set tipe parameter yang membantu catch nilai yang tidak valid saat membuat atau memperbarui tumpukan. Saat Anda menggunakan tipe parameter ini, siapa pun yang menggunakan template Anda harus menentukan nilai yang valid dari Akun AWS dan Wilayah tempat mereka membuat tumpukan.

  Jika mereka menggunakan Konsol Manajemen AWS, CloudFormation berikan daftar nilai yang ada yang sudah terisi sebelumnya dari akun dan Wilayah mereka. Dengan cara ini, pengguna tidak perlu mengingat dan mengetikkan nama atau ID tertentu dengan benar. Sebaliknya, mereka hanya memilih nilai dari daftar drop-down. Dalam beberapa kasus, mereka bahkan dapat mencari nilai berdasarkan ID, nama, atau nilai `Name` tag.
+ **Jenis parameter Systems Manager** — CloudFormation juga menyediakan tipe parameter yang sesuai dengan parameter yang ada di Systems Manager Parameter Store. Bila Anda menggunakan tipe parameter ini, siapa pun yang menggunakan template Anda harus menentukan kunci Parameter Store sebagai nilai dari tipe parameter Systems Manager, dan CloudFormation kemudian mengambil nilai terbaru dari Parameter Store untuk digunakan dalam tumpukan mereka. Ini dapat berguna ketika Anda perlu sering memperbarui aplikasi dengan nilai properti baru, seperti Amazon Machine Image (AMI) baru IDs. Untuk informasi tentang Parameter Store, lihat [Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html).

Setelah parameter Anda ditentukan di `Parameters` bagian, Anda dapat mereferensikan nilai parameter di seluruh CloudFormation template Anda menggunakan `Ref` fungsi.

## Contoh
<a name="cloudformation-supplied-parameter-types-example"></a>

Contoh berikut menunjukkan template yang menggunakan jenis parameter berikut. 
+ `AWS::EC2::VPC::Id`
+ `AWS::EC2::Subnet::Id`
+ `AWS::EC2::KeyPair::KeyName`
+ `AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>`

Untuk membuat tumpukan dari template ini, Anda harus menentukan ID VPC, ID subnet, dan nama key pair yang ada dari akun Anda. Anda juga dapat menentukan kunci Parameter Store yang ada yang mereferensikan ID AMI yang diinginkan atau mempertahankan nilai default`/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2`. Parameter publik ini adalah alias untuk ID AMI regional untuk AMI Amazon Linux 2 terbaru. Untuk informasi selengkapnya tentang parameter publik, lihat [Menemukan parameter publik di Penyimpanan Parameter](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) di *Panduan AWS Systems Manager Pengguna*.

### JSON
<a name="cloudformation-supplied-parameter-types-example.json"></a>

```
{
    "Parameters": {
        "VpcId": {
            "Description": "ID of an existing Virtual Private Cloud (VPC).",
            "Type": "AWS::EC2::VPC::Id"
        },
        "PublicSubnetId": {
            "Description": "ID of an existing public subnet within the specified VPC.",
            "Type": "AWS::EC2::Subnet::Id"
        },
        "KeyName": {
            "Description": "Name of an existing EC2 key pair to enable SSH access to the instance.",
            "Type": "AWS::EC2::KeyPair::KeyName"
        },
        "AMIId": {
            "Description": "Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).",
            "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
            "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
        }
    },
    "Resources": {
        "InstanceSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable SSH access via port 22",
                "VpcId": { "Ref": "VpcId" },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        },
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "KeyName": { "Ref": "KeyName" },
                "ImageId": { "Ref": "AMIId" },
                "NetworkInterfaces": [
                    {
                        "AssociatePublicIpAddress": "true",
                        "DeviceIndex": "0",
                        "SubnetId": { "Ref": "PublicSubnetId" },
                        "GroupSet": [{ "Ref": "InstanceSecurityGroup" }]
                    }
                ]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Value": { "Ref": "Ec2Instance" }
        }
    }
}
```

### YAML
<a name="cloudformation-supplied-parameter-types-example.yaml"></a>

```
Parameters:
  VpcId:
    Description: ID of an existing Virtual Private Cloud (VPC).
    Type: AWS::EC2::VPC::Id
  PublicSubnetId:
    Description: ID of an existing public subnet within the specified VPC.
    Type: AWS::EC2::Subnet::Id
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance.
    Type: AWS::EC2::KeyPair::KeyName
  AMIId:
    Description: Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: !Ref KeyName
      ImageId: !Ref AMIId
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnetId
          GroupSet:
            - !Ref InstanceSecurityGroup
Outputs:
  InstanceId:
    Value: !Ref Ec2Instance
```

### AWS CLI perintah untuk membuat tumpukan
<a name="cloudformation-supplied-parameter-types-cli-command"></a>

[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html)Perintah berikut membuat tumpukan berdasarkan contoh template. 

```
aws cloudformation create-stack --stack-name MyStack \
  --template-body file://sampletemplate.json \
  --parameters \
ParameterKey="VpcId",ParameterValue="vpc-a123baa3" \
ParameterKey="PublicSubnetId",ParameterValue="subnet-123a351e" \
ParameterKey="KeyName",ParameterValue="MyKeyName" \
ParameterKey="AMIId",ParameterValue="MyParameterKey"
```

Untuk menggunakan tipe parameter yang menerima daftar string, seperti`List<AWS::EC2::Subnet::Id>`, Anda harus keluar dari koma di dalam `ParameterValue` dengan garis miring terbalik ganda, seperti yang ditunjukkan pada contoh berikut.

```
--parameters ParameterKey="SubnetIDs",ParameterValue="subnet-5ea0c127\\,subnet-6194ea3b\\,subnet-c87f2be0"
```

## Pertimbangan-pertimbangan
<a name="cloudformation-supplied-parameter-types-considerations"></a>

Sangat disarankan agar Anda menggunakan referensi dinamis untuk membatasi akses ke definisi konfigurasi sensitif, seperti kredensi pihak ketiga. Untuk informasi selengkapnya, lihat [Dapatkan nilai yang disimpan di layanan lain menggunakan referensi dinamis](dynamic-references.md).

Jika Anda ingin mengizinkan pengguna template untuk menentukan nilai dari yang berbeda Akun AWS, jangan gunakan tipe parameter AWS-specific. Sebaliknya, tentukan parameter tipe `String` atau`CommaDelimitedList`. 

Ada beberapa hal yang perlu diingat dengan tipe parameter Systems Manager:
+ Anda dapat melihat nilai parameter yang diselesaikan pada tab **Parameter** tumpukan di konsol, atau dengan menjalankan [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html)atau [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html). Ingat, nilai-nilai ini ditetapkan ketika tumpukan dibuat atau diperbarui, sehingga mereka mungkin berbeda dari nilai terbaru di Parameter Store.
+ Untuk pembaruan tumpukan, saat Anda menggunakan opsi **Use existing value** (atau disetel `UsePreviousValue` ke true), ini berarti Anda ingin tetap menggunakan kunci Parameter Store yang sama, bukan nilainya. CloudFormation selalu mengambil nilai terbaru.
+ Jika Anda menentukan nilai yang diizinkan atau kendala lainnya, CloudFormation validasi terhadap kunci parameter yang Anda tentukan, tetapi bukan nilainya. Anda harus memvalidasi nilai di Parameter Store itu sendiri.
+ Saat Anda membuat atau memperbarui tumpukan dan membuat set perubahan, CloudFormation gunakan nilai apa pun yang ada di Parameter Store pada saat itu. Jika parameter tertentu tidak ada di Parameter Store di bawah pemanggil Akun AWS, CloudFormation mengembalikan kesalahan validasi.
+ Ketika Anda menjalankan set perubahan, CloudFormation menggunakan nilai-nilai yang ditentukan dalam set perubahan. Anda harus meninjau nilai-nilai ini sebelum mengeksekusi perubahan yang ditetapkan karena mereka mungkin berubah dalam Penyimpanan Parameter antara waktu saat Anda membuat perubahan set dan menjalankannya.
+ Untuk parameter Parameter Store yang disimpan dalam hal yang sama Akun AWS, Anda harus memberikan nama parameter. Untuk parameter Parameter Store yang dibagikan oleh yang lain Akun AWS, Anda harus memberikan parameter ARN lengkap.

## Jenis parameter AWS spesifik yang didukung
<a name="aws-specific-parameter-types-supported"></a>

CloudFormation mendukung jenis AWS-spesifik berikut:

`AWS::EC2::AvailabilityZone::Name`  
Availability Zone, seperti `us-west-2a`.

`AWS::EC2::Image::Id`  
ID gambar Amazon EC2, seperti. `ami-0ff8a91507f77f867` Perhatikan bahwa CloudFormation konsol tidak menampilkan daftar drop-down nilai untuk jenis parameter ini.

`AWS::EC2::Instance::Id`  
ID instans Amazon EC2, seperti. `i-1e731a32`

`AWS::EC2::KeyPair::KeyName`  
Nama key pair Amazon EC2.

`AWS::EC2::SecurityGroup::GroupName`  
Nama grup keamanan VPC default, seperti. `my-sg-abc`

`AWS::EC2::SecurityGroup::Id`  
ID grup keamanan, seperti `sg-a123fd85`.

`AWS::EC2::Subnet::Id`  
ID subnet, seperti `subnet-123a351e`.

`AWS::EC2::Volume::Id`  
ID volume Amazon EBS, seperti`vol-3cdd3f56`.

`AWS::EC2::VPC::Id`  
ID VPC, seperti `vpc-a123baa3`.

`AWS::Route53::HostedZone::Id`  
ID zona yang dihosting Amazon Route 53, seperti`Z23YXV4OVPL04A`.

`List<AWS::EC2::AvailabilityZone::Name>`  
Susunan Availability Zone untuk suatu wilayah, seperti `us-west-2a, us-west-2b`.

`List<AWS::EC2::Image::Id>`  
Array gambar Amazon EC2 IDs, seperti. `ami-0ff8a91507f77f867, ami-0a584ac55a7631c0c` Perhatikan bahwa CloudFormation konsol tidak menampilkan daftar drop-down nilai untuk jenis parameter ini.

`List<AWS::EC2::Instance::Id>`  
Array instans Amazon EC2 IDs, seperti. `i-1e731a32, i-1e731a34`

`List<AWS::EC2::SecurityGroup::GroupName>`  
Array nama grup keamanan VPC default, seperti. `my-sg-abc, my-sg-def`

`List<AWS::EC2::SecurityGroup::Id>`  
Sebuah array dari kelompok keamanan IDs, seperti `sg-a123fd85, sg-b456fd85`

`List<AWS::EC2::Subnet::Id>`  
Sebuah array dari subnet IDs, seperti `subnet-123a351e, subnet-456b351e`

`List<AWS::EC2::Volume::Id>`  
Array volume Amazon EBS IDs, seperti`vol-3cdd3f56, vol-4cdd3f56`.

`List<AWS::EC2::VPC::Id>`  
Array VPC IDs, seperti `vpc-a123baa3, vpc-b456baa3`

`List<AWS::Route53::HostedZone::Id>`  
Array zona yang dihosting Amazon Route 53 IDs, seperti`Z23YXV4OVPL04A, Z23YXV4OVPL04B`.

## Jenis parameter Systems Manager yang Didukung
<a name="systems-manager-parameter-types-supported"></a>

CloudFormation mendukung jenis parameter Systems Manager berikut:

`AWS::SSM::Parameter::Name`  
Nama kunci parameter Systems Manager. Gunakan jenis parameter ini hanya untuk memeriksa apakah ada parameter yang diperlukan. CloudFormation tidak akan mengambil nilai aktual yang terkait dengan parameter. 

`AWS::SSM::Parameter::Value<String>`  
Parameter Systems Manager yang nilainya adalah string. Hal ini sesuai dengan `String` tipe parameter di Penyimpanan Parameter.

`AWS::SSM::Parameter::Value<List<String>>` atau `AWS::SSM::Parameter::Value<CommaDelimitedList>`  
Parameter Systems Manager yang nilainya adalah daftar string. Hal ini sesuai dengan `StringList` tipe parameter di Penyimpanan Parameter.

`AWS::SSM::Parameter::Value<AWS-specific parameter type>`  
Parameter Systems Manager yang nilainya adalah tipe parameter AWS-spesifik.   
Sebagai contoh, berikut menentukan `AWS::EC2::KeyPair::KeyName` tipe:  
+ `AWS::SSM::Parameter::Value<AWS::EC2::KeyPair::KeyName>`

`AWS::SSM::Parameter::Value<List<AWS-specific parameter type>>`  
Parameter Systems Manager yang nilainya adalah daftar tipe parameter AWS-spesifik.   
Sebagai contoh, berikut menentukan daftar `AWS::EC2::KeyPair::KeyName` tipe:  
+ `AWS::SSM::Parameter::Value<List<AWS::EC2::KeyPair::KeyName>>`

## Tipe parameter Systems Manager yang tidak didukung
<a name="systems-manager-parameter-types-unsupported"></a>

CloudFormation tidak mendukung tipe parameter Systems Manager berikut:
+ Daftar tipe parameter Systems Manager — misalnya: `List<AWS::SSM::Parameter::Value<String>>`

Selain itu, CloudFormation tidak mendukung mendefinisikan parameter template sebagai tipe parameter `SecureString` Systems Manager. Namun, Anda dapat menentukan string aman sebagai *nilai* parameter untuk sumber daya tertentu. Lihat informasi yang lebih lengkap di [Dapatkan nilai yang disimpan di layanan lain menggunakan referensi dinamis](dynamic-references.md).

# CloudFormation penelusuran
<a name="walkthroughs"></a>

Dokumentasi ini menyediakan kumpulan panduan yang dirancang untuk memberi Anda praktik langsung dengan penerapan tumpukan.
+ [Lihat output sumber daya di tumpukan lain CloudFormation](walkthrough-crossstackref.md)— Panduan ini menunjukkan kepada Anda cara mereferensikan output dari satu CloudFormation tumpukan dalam tumpukan lain. Alih-alih menyertakan semua sumber daya dalam satu tumpukan, Anda dapat membuat AWS sumber daya terkait di tumpukan terpisah untuk membuat templat yang lebih modular dan dapat digunakan kembali.
+ [Menerapkan aplikasi di Amazon EC2](deploying.applications.md)— Pelajari cara menggunakan CloudFormation untuk menginstal, mengonfigurasi, dan memulai aplikasi secara otomatis di EC2 instans Amazon. Dengan cara ini, Anda dapat dengan mudah menduplikasi penerapan dan memperbarui instalasi yang ada tanpa menghubungkan langsung ke instance.
+ [Perbarui CloudFormation tumpukan](updating.stacks.walkthrough.md)— Berjalanlah melalui perkembangan pembaruan sederhana ke tumpukan yang sedang berjalan dengan CloudFormation.
+ [Buat aplikasi yang diskalakan dan diseimbangkan beban](walkthrough-autoscaling.md)— Temukan cara menggunakan CloudFormation untuk membuat aplikasi yang dapat diskalakan dan seimbang beban. Panduan ini mencakup pembuatan grup Auto Scaling, penyeimbang beban, dan sumber daya terkait lainnya untuk memastikan aplikasi Anda dapat menangani berbagai beban lalu lintas dan mempertahankan ketersediaan tinggi.
+ [Rekan dengan VPC di yang lain Akun AWS](peer-with-vpc-in-another-account.md)— Panduan ini memandu Anda melalui proses pembuatan koneksi peering Virtual Private Cloud (VPC) antara dua yang berbeda. VPCs Akun AWS Peering VPC membantu Anda merutekan lalu lintas antara VPCs dan mengakses sumber daya seolah-olah mereka adalah bagian dari jaringan yang sama.
+ [Lakukan blue/green penyebaran ECS melalui penggunaan CodeDeploy CloudFormation](blue-green.md)— Temukan cara menggunakan CloudFormation untuk melakukan AWS CodeDeploy blue/green deployments on Amazon ECS. Blue/green penerapan adalah cara untuk memperbarui aplikasi atau layanan Anda dengan waktu henti minimal.

# Lihat output sumber daya di tumpukan lain CloudFormation
<a name="walkthrough-crossstackref"></a>

Panduan ini menunjukkan kepada Anda cara mereferensikan output dari satu CloudFormation tumpukan dalam tumpukan lain untuk membuat templat yang lebih modular dan dapat digunakan kembali. 

Alih-alih menyertakan semua sumber daya dalam satu tumpukan, Anda membuat AWS sumber daya terkait di tumpukan terpisah. Kemudian, Anda dapat merujuk ke output sumber daya yang diperlukan dari tumpukan lain. Dengan membatasi referensi lintas tumpukan untuk output, Anda mengontrol bagian dari tumpukan yang direferensikan oleh tumpukan lainnya.

Misalnya, Anda mungkin memiliki tumpukan jaringan dengan VPC, grup keamanan, dan subnet untuk aplikasi web publik, dan tumpukan aplikasi web publik terpisah. Untuk memastikan bahwa aplikasi web menggunakan grup keamanan dan subnet dari tumpukan jaringan, Anda membuat referensi lintas tumpukan yang memungkinkan tumpukan aplikasi web untuk mereferensi output sumber daya dari tumpukan jaringan. Dengan referensi lintas tumpukan, pemilik tumpukan aplikasi web tidak perlu membuat atau mempertahankan aturan atau aset jaringan.

Untuk membuat referensi lintas tumpukan, gunakan output bidang `Export` untuk menandai nilai output sumber daya untuk ekspor. Lalu, gunakan fungsi intrinsik `Fn::ImportValue` untuk mengimpor nilai. Untuk informasi selengkapnya, lihat [Dapatkan output yang diekspor dari tumpukan yang diterapkan CloudFormation](using-cfn-stack-exports.md).

**catatan**  
CloudFormation adalah layanan gratis. Namun, Anda dikenakan biaya untuk AWS sumber daya yang Anda sertakan dalam tumpukan Anda dengan tarif saat ini untuk masing-masing. Untuk informasi selengkapnya tentang harga AWS , lihat [halaman detail untuk setiap produk](https://aws.amazon.com/).

**Topics**
+ [Gunakan contoh template untuk membuat tumpukan jaringan](#walkthrough-crossstackref-create-vpc-stack)
+ [Gunakan contoh template untuk membuat tumpukan aplikasi web](#walkthrough-crossstackref-create-ec2-stack)
+ [Verifikasi tumpukan berfungsi seperti yang dirancang](#walkthrough-crossstackref-verify)
+ [Memecahkan masalah kesalahan pemetaan AMI](#walkthrough-crossstackref-troubleshooting-ami)
+ [Bersihkan sumber daya Anda](#walkthrough-crossstackref-clean-up)

## Gunakan contoh template untuk membuat tumpukan jaringan
<a name="walkthrough-crossstackref-create-vpc-stack"></a>

Sebelum Anda memulai panduan ini, periksa apakah Anda memiliki izin IAM untuk menggunakan semua layanan berikut: Amazon VPC, Amazon EC2, dan. CloudFormation

Tumpukan jaringan berisi VPC, grup keamanan, dan subnet yang akan Anda gunakan dalam tumpukan aplikasi web. Selain sumber daya ini, tumpukan jaringan membuat Gateway Internet dan tabel perutean untuk mengaktifkan akses publik.

Anda harus membuat tumpukan ini sebelum membuat tumpukan aplikasi web. Jika Anda membuat tumpukan aplikasi web terlebih dahulu, tumpukan tidak akan memiliki grup keamanan atau subnet.

Template stack tersedia dari URL berikut: [https://s3.amazonaws.com/cloudformation-examples/user- guide/cross-stack/SampleNetworkCrossStack .template.](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template) Untuk melihat sumber daya yang akan membuat tumpukan, pilih tautan, yang membuka templat. Di `Outputs` bagian ini, Anda dapat melihat sumber daya jaringan yang diekspor template sampel. Nama sumber daya yang diekspor diawali dengan nama tumpukan jika Anda mengekspor sumber daya jaringan dari tumpukan lainnya. Ketika mengimpor sumber daya jaringan, pengguna dapat menentukan dari tumpukan mana sumber daya akan diimpor.

**Untuk membuat tumpukan jaringan**

1. Masuk ke Konsol Manajemen AWS dan buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Pada halaman **Stacks**, pilih **Buat tumpukan** di kanan atas, lalu pilih **Dengan sumber daya baru (standar)**.

1. Pilih **Pilih templat yang ada**, dan di bagian **Tentukan templat**, pilih URL **Amazon S3**.

1. Untuk URL **Amazon S3, rekatkan URL** berikut:. **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template**

1. Pilih **Berikutnya**.

1. Untuk **Nama tumpukan**, ketik **SampleNetworkCrossStack**, lalu pilih **Selanjutnya**.
**catatan**  
Catat nama tumpukan ini. Anda akan membutuhkan nama tumpukan saat meluncurkan tumpukan aplikasi web.

1. Pilih **Selanjutnya**. Untuk panduan ini, Anda tidak perlu menambahkan tag atau menentukan pengaturan lanjutan.

1. Pastikan bahwa nama tumpukan dan URL templat sudah benar, lalu pilih **Buat tumpukan**.

   Mungkin perlu beberapa menit CloudFormation untuk membuat tumpukan Anda. Tunggu sampai semua sumber daya telah berhasil dibuat sebelum melanjutkan untuk membuat tumpukan aplikasi web.

1. Untuk memantau kemajuan, tampilkan peristiwa tumpukan. Untuk informasi selengkapnya, lihat [Pantau kemajuan tumpukan](monitor-stack-progress.md).

## Gunakan contoh template untuk membuat tumpukan aplikasi web
<a name="walkthrough-crossstackref-create-ec2-stack"></a>

Tumpukan aplikasi web membuat instans EC2 yang menggunakan grup keamanan dan subnet dari tumpukan jaringan. 

Anda harus membuat tumpukan ini Wilayah AWS sama dengan tumpukan jaringan.

Template stack tersedia dari URL berikut: [https://s3.amazonaws.com/cloudformation-examples/user- guide/cross-stack/SampleWebAppCrossStack .template.](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template) Untuk melihat sumber daya yang akan membuat tumpukan, pilih tautan, yang akan membuka templat. Di `Resources` bagian ini, lihat properti instans EC2. Anda dapat melihat cara sumber daya jaringan diimpor dari tumpukan lain dengan menggunakan fungsi `Fn::ImportValue`.

**Untuk membuat tumpukan aplikasi web**

1. Dari halaman **Stacks**, pilih **Buat tumpukan** di kanan atas, lalu pilih **Dengan sumber daya baru (standar)**.

1. Pilih **Pilih templat yang ada**, dan di bagian **Tentukan templat**, pilih URL **Amazon S3**.

1. Untuk URL **Amazon S3, rekatkan URL** berikut:. **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template**

1. Pilih **Berikutnya**.

1. Untuk **Nama tumpukan**, ketik **SampleWebAppCrossStack**. Di bagian **Parameter**, gunakan nilai default untuk **NetworkStackName**parameter, lalu pilih **Berikutnya**.

   Templat sampel menggunakan nilai parameter untuk menentukan dari tumpukan mana nilai akan diimpor.

1. Pilih **Berikutnya**. Untuk panduan ini, Anda tidak perlu menambahkan tag atau menentukan pengaturan lanjutan.

1. Pastikan bahwa nama tumpukan dan URL templat sudah benar, lalu pilih **Buat tumpukan**.

   Mungkin perlu beberapa menit CloudFormation untuk membuat tumpukan Anda.

## Verifikasi tumpukan berfungsi seperti yang dirancang
<a name="walkthrough-crossstackref-verify"></a>

Setelah tumpukan dibuat, lihat sumber daya dan catat ID instans. Untuk informasi selengkapnya tentang melihat sumber daya tumpukan, lihat [Lihat informasi tumpukan dari CloudFormation konsol](cfn-console-view-stack-data-resources.md).

Untuk memverifikasi grup keamanan instans dan subnet, lihat properti instans di konsol [Amazon EC2](https://console.aws.amazon.com/ec2/). Jika instans menggunakan grup keamanan dan subnet dari tumpukan `SampleNetworkCrossStack`, Anda telah berhasil membuat referensi lintas tumpukan.

Gunakan konsol tersebut untuk melihat output tumpukan dan contoh URL situs web untuk memverifikasi bahwa aplikasi web berjalan. Untuk informasi selengkapnya, lihat [Lihat informasi tumpukan dari CloudFormation konsol](cfn-console-view-stack-data-resources.md).

## Memecahkan masalah kesalahan pemetaan AMI
<a name="walkthrough-crossstackref-troubleshooting-ami"></a>

Jika Anda menerima kesalahan`Template error: Unable to get mapping for AWSRegionArch2AMI::[region]::HVM64`, template tidak menyertakan pemetaan AMI untuk Anda Wilayah AWS. Alih-alih memperbarui pemetaan, sebaiknya gunakan parameter publik Systems Manager untuk mereferensikan yang terbaru secara dinamis: AMIs

1. Unduh `SampleWebAppCrossStack` template ke mesin lokal Anda dari: [https://s3.amazonaws.com/cloudformation-examples/user- guide/cross-stack/SampleWebAppCrossStack .template.](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template)

1. Hapus seluruh bagian `AWSRegionArch2AMI` pemetaan.

1. Tambahkan parameter Systems Manager berikut:

   ```
   "LatestAmiId": {
     "Description": "The latest Amazon Linux 2 AMI from the Parameter Store",
       "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
       "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
     }
   ```

1. Ganti `ImageId` referensi yang ada:

   ```
   "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" } , "HVM64" ] }, 
   ```

   Dengan:

   ```
   "ImageId": { "Ref": "LatestAmiId" },
   ```

   Parameter ini secara otomatis menyelesaikan AMI Amazon Linux 2 terbaru untuk wilayah tempat Anda menyebarkan tumpukan. 

   Untuk distribusi Linux lainnya, gunakan jalur parameter yang sesuai. Untuk informasi selengkapnya, lihat [Menemukan parameter publik di Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) di *Panduan AWS Systems Manager Pengguna*.

1. Unggah template yang dimodifikasi ke bucket S3 di akun Anda:

   ```
   aws s3 cp SampleWebAppCrossStack.template s3://amzn-s3-demo-bucket/
   ```

1. Saat membuat tumpukan, tentukan URL template S3 Anda alih-alih URL contoh.

## Bersihkan sumber daya Anda
<a name="walkthrough-crossstackref-clean-up"></a>

Untuk memastikan bahwa Anda tidak dikenakan biaya untuk layanan yang tidak diinginkan, hapus tumpukan.

**Untuk menghapus tumpukan**

1. Di CloudFormation konsol, pilih `SampleWebAppCrossStack` tumpukan.

1. Pilih **Tindakan**, lalu pilih **Hapus tumpukan**.

1. Pada pesan konfirmasi, pilih **Hapus**.

1. Setelah tumpukan dihapus, ulangi langkah yang sama untuk `SampleNetworkCrossStack` tumpukan.
**catatan**  
Tunggu sampai CloudFormation benar-benar menghapus `SampleWebAppCrossStack` tumpukan. Jika instans EC2 masih berjalan di VPC CloudFormation , tidak akan menghapus VPC di tumpukan. `SampleNetworkCrossStack`

# Menerapkan aplikasi di Amazon EC2
<a name="deploying.applications"></a>

Anda dapat menggunakan CloudFormation untuk menginstal, mengonfigurasi, dan memulai aplikasi secara otomatis di instans Amazon EC2. Melakukan hal ini memungkinkan Anda untuk dengan mudah menduplikasi penyebaran dan memperbarui instalasi yang ada tanpa terhubung langsung ke instans, yang dapat menghemat banyak waktu dan usaha.

CloudFormation termasuk satu set skrip pembantu (`cfn-init`,, `cfn-signal``cfn-get-metadata`, dan`cfn-hup`) yang didasarkan pada. `cloud-init` Anda memanggil skrip pembantu ini dari CloudFormation templat Anda untuk menginstal, mengonfigurasi, dan memperbarui aplikasi di instans Amazon EC2 yang ada di templat yang sama. Untuk informasi selengkapnya, lihat [referensi skrip CloudFormation pembantu di Panduan Referensi CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) *Template*.

Dalam [tutorial memulai](gettingstarted.walkthrough.md), Anda membuat server web sederhana menggunakan `UserData` skrip bash dasar. Meskipun ini berfungsi untuk halaman “Hello World” sederhana, aplikasi nyata seringkali membutuhkan konfigurasi yang lebih canggih, termasuk:
+ Beberapa paket perangkat lunak diinstal dalam urutan yang benar.
+ File konfigurasi kompleks yang dibuat dengan konten tertentu.
+ Layanan dimulai dan dikonfigurasi untuk berjalan secara otomatis.
+ Penanganan kesalahan dan validasi proses penyiapan.

CloudFormationskrip pembantu menyediakan cara yang lebih kuat dan dapat dipelihara untuk mengonfigurasi instance EC2 dibandingkan dengan skrip bash dasar di. `UserData` Skrip `cfn-init` helper membaca data konfigurasi dari metadata template Anda dan menerapkannya secara sistematis ke instance Anda.

Dalam tutorial ini, Anda akan belajar cara menggunakan skrip `cfn-init` helper dan memantau proses bootstrap.

**catatan**  
CloudFormation gratis, tetapi Anda akan dikenakan biaya untuk sumber daya Amazon EC2 yang Anda buat. Namun, jika Anda baru mengenal AWS, Anda dapat memanfaatkan [Tingkat Gratis](https://aws.amazon.com/free/) untuk meminimalkan atau menghilangkan biaya selama proses pembelajaran ini.

**Topics**
+ [Prasyarat](#bootstrapping-tutorial-prerequisites)
+ [Memahami konsep bootstrap](#bootstrapping-tutorial-understand-concepts)
+ [Mulailah dengan contoh bootstrap sederhana](#bootstrapping-tutorial-simple-example)
+ [Menambahkan file dan perintah](#bootstrapping-tutorial-add-complexity)
+ [Menambahkan keamanan jaringan](#bootstrapping-tutorial-security-group)
+ [Template bootstrap lengkap](#bootstrapping-tutorial-complete-template)
+ [Buat tumpukan menggunakan konsol](#bootstrapping-tutorial-create-stack)
+ [Pantau proses bootstrap](#bootstrapping-tutorial-validate-bootstrap)
+ [Uji server web bootstrapped](#bootstrapping-tutorial-test-web-server)
+ [Memecahkan masalah bootstrap](#bootstrapping-tutorial-troubleshooting)
+ [Pembersihan sumber daya](#bootstrapping-tutorial-clean-up)
+ [Langkah selanjutnya](#bootstrapping-tutorial-next-steps)

## Prasyarat
<a name="bootstrapping-tutorial-prerequisites"></a>
+ Anda harus telah menyelesaikan [Membuat tumpukan pertama Anda](gettingstarted.walkthrough.md) tutorial atau memiliki pengalaman yang setara dengan CloudFormation dasar-dasar.
+ Anda harus memiliki akses ke pengguna atau peran IAM yang memiliki izin untuk menggunakan Amazon EC2 CloudFormation dan, atau akses pengguna administratif. Akun AWS 
+ Anda harus memiliki Virtual Private Cloud (VPC) yang memiliki akses ke internet. Template tutorial ini membutuhkan VPC default, yang datang secara otomatis dengan yang lebih baru. Akun AWS Jika Anda tidak memiliki VPC default, atau jika telah dihapus, lihat bagian pemecahan masalah di [Membuat tumpukan pertama Anda](gettingstarted.walkthrough.md) tutorial untuk solusi alternatif.

## Memahami konsep bootstrap
<a name="bootstrapping-tutorial-understand-concepts"></a>

Mari kita pahami konsep kunci yang membuat bootstrapping berfungsi sebelum membuat template.

### `cfn-init`Naskah pembantu
<a name="bootstrapping-tutorial-cfn-init-overview"></a>

CloudFormation menyediakan skrip pembantu Python yang dapat Anda gunakan untuk menginstal perangkat lunak dan memulai layanan pada instans Amazon EC2. `cfn-init`Skrip membaca metadata sumber daya dari template Anda dan menerapkan konfigurasi ke instance Anda.

Prosesnya bekerja sebagai berikut:

1. Anda menentukan konfigurasi di `Metadata` bagian sumber daya EC2 Anda.

1. Anda menelepon `cfn-init` dari `UserData` naskah.

1. `cfn-init`membaca metadata dan menerapkan konfigurasi.

1. Instans Anda dikonfigurasi sesuai dengan spesifikasi Anda.

### Struktur metadata
<a name="bootstrapping-tutorial-metadata-structure"></a>

Konfigurasi didefinisikan dalam struktur tertentu dalam instans EC2 Anda.

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:                       # Metadata section for the resource
      AWS::CloudFormation::Init:    # Required key that cfn-init looks for
        config:                     # Configuration name (you can have multiple)
          packages:                 # Install packages
          files:                    # Create files
          commands:                 # Run commands
          services:                 # Start/stop services
```

`cfn-init`Skrip memproses bagian-bagian ini dalam urutan tertentu: paket, grup, pengguna, sumber, file, perintah, dan kemudian layanan.

## Mulailah dengan contoh bootstrap sederhana
<a name="bootstrapping-tutorial-simple-example"></a>

Mari kita mulai dengan contoh bootstrap minimal yang hanya menginstal dan memulai Apache.

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:                 # Install Apache web server
            yum:
              httpd: []
          services:                 # Start Apache and enable it to start on boot
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      UserData: !Base64             # Script that runs when instance starts
        Fn::Sub: |
          #!/bin/bash
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}
```

Contoh sederhana ini menunjukkan konsep inti:
+ `packages`bagian menginstal `httpd` paket menggunakanyum. Ini berfungsi di Amazon Linux dan distribusi Linux lainnya yang digunakanyum.
+ `services`bagian memastikan `httpd` mulai dan berjalan secara otomatis.
+ `UserData`menginstal alat bootstrap terbaru dan panggilan`cfn-init`.

## Menambahkan file dan perintah
<a name="bootstrapping-tutorial-add-complexity"></a>

Sekarang, mari kita tingkatkan contoh kita dengan menambahkan halaman web khusus dan file log di `/var/log` direktori pada instance EC2.

### Membuat file
<a name="bootstrapping-tutorial-files-section"></a>

`files`Bagian ini memungkinkan Anda untuk membuat file pada instance dengan konten tertentu. Pipa vertikal (`|`) memungkinkan Anda untuk melewati blok teks literal (kode HTML) sebagai konten file (`/var/www/html/index.html`).

```
files:
  /var/www/html/index.html:
    content: |
      <body>
        <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>
      </body>
```

### Menjalankan perintah
<a name="bootstrapping-tutorial-commands-section"></a>

`commands`Bagian ini memungkinkan Anda menjalankan perintah shell selama proses bootstrap. Perintah ini membuat file log di `/var/log/welcome.txt` pada instance EC2. Untuk melihatnya, Anda memerlukan key pair Amazon EC2 untuk digunakan untuk akses SSH dan rentang alamat IP yang dapat digunakan untuk SSH ke instance (tidak dibahas di sini).

```
commands:
  createWelcomeLog:
    command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
```

## Menambahkan keamanan jaringan
<a name="bootstrapping-tutorial-security-group"></a>

Karena kita sedang menyiapkan server web, kita perlu mengizinkan lalu lintas web (HTTP) untuk mencapai instance EC2 kita. Untuk melakukan ini, kami akan membuat grup keamanan yang memungkinkan lalu lintas masuk pada port 80 dari alamat IP Anda. Instans EC2 juga perlu mengirim lalu lintas ke internet, misalnya, untuk menginstal pembaruan paket. Secara default, grup keamanan mengizinkan semua lalu lintas keluar. Kami kemudian akan mengaitkan grup keamanan ini dengan instans EC2 kami menggunakan `SecurityGroupIds` properti.

```
WebServerSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Allow HTTP access from my IP address
    SecurityGroupIngress:
      - IpProtocol: tcp
        Description: HTTP
        FromPort: 80
        ToPort: 80
        CidrIp: !Ref MyIP
```

## Template bootstrap lengkap
<a name="bootstrapping-tutorial-complete-template"></a>

Sekarang, mari kita satukan semua bagian. Berikut adalah template lengkap yang menggabungkan semua konsep yang telah kita bahas.

```
AWSTemplateFormatVersion: 2010-09-09
Description: Bootstrap an EC2 instance with Apache web server using cfn-init

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t3.micro
      - t2.micro
    ConstraintDescription: must be a valid EC2 instance type.

  MyIP:
    Description: Your IP address in CIDR format (e.g. 203.0.113.1/32)
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.

Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP access from my IP address
      SecurityGroupIngress:
        - IpProtocol: tcp
          Description: HTTP
          FromPort: 80
          ToPort: 80
          CidrIp: !Ref MyIP

  WebServer:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          files:
            /var/www/html/index.html:
              content: |
                <body>
                  <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>
                </body>
          commands:
            createWelcomeLog:
              command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData: !Base64
        Fn::Sub: |
          #!/bin/bash
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region}
      Tags:
        - Key: Name
          Value: Bootstrap Tutorial Web Server

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServer.PublicDnsName}'
    Description: EC2 instance public DNS name
```

## Buat tumpukan menggunakan konsol
<a name="bootstrapping-tutorial-create-stack"></a>

Prosedur berikut melibatkan mengunggah template tumpukan sampel dari file. Buka editor teks di mesin lokal Anda dan tambahkan template. Simpan file dengan nama`samplelinux2stack.template`.

**Untuk meluncurkan template tumpukan**

1. Masuk ke Konsol Manajemen AWS dan buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Pilih **Buat tumpukan**, **Dengan sumber daya baru (standar)**.

1. Di bawah **Tentukan templat**, pilih **Unggah file templat**, **Pilih file** untuk mengunggah `samplelinux2stack.template` file. 

1. Pilih **Berikutnya**.

1. Pada halaman **Tentukan detail tumpukan**, ketik **BootstrapTutorialStack** sebagai nama tumpukan.

1. Di bawah **Parameter**, lakukan hal berikut.
   + **LatestAmiId**: Tinggalkan nilai default.
   + **InstanceType**: Pilih salah satu **t2.micro** atau **t3.micro** untuk jenis instans EC2.
   + **MyIP**: Masukkan alamat IP publik Anda dengan akhiran. `/32`

1. Pilih **Berikutnya** dua kali, lalu **Kirim** untuk membuat tumpukan.

## Pantau proses bootstrap
<a name="bootstrapping-tutorial-validate-bootstrap"></a>

Proses Bootstrap membutuhkan waktu lebih lama daripada peluncuran EC2 sederhana karena perangkat lunak tambahan sedang diinstal dan dikonfigurasi.

**Untuk memantau kemajuan bootstrap**

1. Di CloudFormation konsol, pilih tumpukan Anda dan buka tab **Acara**.

1. Perhatikan `WebServer CREATE_IN_PROGRESS` acara tersebut. Proses bootstrap dimulai setelah instance diluncurkan.

1. Proses bootstrap biasanya memakan waktu beberapa menit. Anda akan melihat `WebServer CREATE_COMPLETE` ketika itu selesai.

Jika Anda ingin melihat apa yang terjadi selama proses bootstrap, Anda dapat memeriksa log instance.

**Untuk melihat log bootstrap (opsional)**

1. Buka [konsol EC2](https://console.aws.amazon.com/ec2/) dan temukan instans Anda.

1. Pilih instance, lalu pilih **Actions**, **Monitor dan troubleshoot**, **Dapatkan log sistem** untuk melihat kemajuan bootstrap.

1. Jika Anda tidak segera melihat log, tunggu dan segarkan halaman. 

## Uji server web bootstrapped
<a name="bootstrapping-tutorial-test-web-server"></a>

Saat tumpukan Anda ditampilkan`CREATE_COMPLETE`, uji server web Anda.

**Untuk menguji server web**

1. Di CloudFormation konsol, buka tab **Output** untuk tumpukan Anda.

1. Klik pada nilai **WebsiteUrl** untuk membuka server web Anda di tab baru.

1. Anda akan melihat halaman web kustom Anda dengan pesan`Congratulations, you have successfully launched the AWS CloudFormation sample`.

**catatan**  
Jika halaman tidak segera dimuat, tunggu sebentar dan coba lagi. Proses bootstrap mungkin masih selesai bahkan setelah tumpukan ditampilkan`CREATE_COMPLETE`.

## Memecahkan masalah bootstrap
<a name="bootstrapping-tutorial-troubleshooting"></a>

Jika proses bootstrap Anda gagal atau server web Anda tidak berfungsi, berikut adalah masalah dan solusi umum.

### Masalah umum
<a name="bootstrapping-tutorial-common-issues"></a>
+ **Pembuatan tumpukan gagal** - Periksa tab **Acara** untuk pesan kesalahan tertentu.
+ **Server web tidak dapat diakses** — Verifikasi alamat IP Anda benar dalam `MyIP` parameter. Ingatlah untuk menyertakan `/32` di akhir.
+ **Proses Bootstrap gagal** - Instance mungkin diluncurkan tetapi `cfn-init` gagal. Periksa log sistem seperti yang dijelaskan di bagian pemantauan.

## Pembersihan sumber daya
<a name="bootstrapping-tutorial-clean-up"></a>

Untuk menghindari tagihan yang sedang berlangsung, Anda dapat membersihkan dengan menghapus tumpukan dan sumber dayanya. 

**Untuk menghapus tumpukan dan sumber dayanya**

1. Buka [konsol CloudFormation](https://console.aws.amazon.com/cloudformation/).

1. Pada halaman **Stacks**, pilih opsi di sebelah nama tumpukan yang Anda buat (**BootstrapTutorialStack**) dan kemudian pilih **Hapus**.

1. Saat diminta konfirmasi, pilih **Hapus**.

1. Pantau kemajuan proses penghapusan tumpukan pada tab **Event**. Status untuk **BootstrapTutorialStack** perubahan ke `DELETE_IN_PROGRESS`. Ketika CloudFormation menyelesaikan penghapusan tumpukan, itu menghapus tumpukan dari daftar.

## Langkah selanjutnya
<a name="bootstrapping-tutorial-next-steps"></a>

Selamat\$1 Anda telah berhasil mempelajari cara mem-bootstrap instance EC2 dengan. CloudFormation Anda sekarang mengerti:
+ Cara menggunakan `cfn-init` skrip pembantu
+ Cara menyusun metadata untuk bootstrap
+ Cara menginstal paket, membuat file, menjalankan perintah, dan mengelola layanan
+ Cara memantau masalah bootstrap

Untuk terus belajar:
+ Pelajari cara memperbarui tumpukan yang sedang berjalan dan menggunakan skrip `cfn-hup` helper. Untuk informasi selengkapnya, lihat [Perbarui CloudFormation tumpukan](updating.stacks.walkthrough.md).
+ Pelajari cara mem-bootstrap Windows tumpukan. Untuk informasi selengkapnya, lihat [Tumpukan berbasis bootstrap Windows CloudFormation](cfn-windows-stacks-bootstrapping.md).
+ Jelajahi skenario bootstrap yang lebih kompleks dengan beberapa set konfigurasi. Untuk informasi selengkapnya, lihat [cfn-init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-init.html) dan [AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html)di Panduan *Referensi CloudFormation Template*.
+ Pelajari tentang `cfn-signal` pelaporan status penyelesaian bootstrap. Untuk informasi selengkapnya, lihat [cfn-signal di Panduan](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-signal.html) *Referensi CloudFormation Template*.

# Perbarui CloudFormation tumpukan
<a name="updating.stacks.walkthrough"></a>

**catatan**  
Tutorial ini dibangun di atas konsep-konsep dari [Menerapkan aplikasi di Amazon EC2](deploying.applications.md) tutorial. Jika Anda belum menyelesaikan tutorial itu, kami sarankan melakukannya terlebih dahulu untuk memahami EC2 bootstrap dengan. CloudFormation

Topik ini menunjukkan perkembangan sederhana pembaruan ke tumpukan yang sedang berjalan. Kita akan mengikuti panduan dengan langkah-langkah berikut:

1. **Buat tumpukan awal** — Buat tumpukan menggunakan basis Amazon Linux 2 AMI, instal Apache Web Server dan aplikasi PHP sederhana menggunakan skrip CloudFormation pembantu.

1. **Perbarui aplikasi** — Perbarui salah satu file dalam aplikasi dan gunakan perangkat lunak menggunakan CloudFormation.

1. **Tambahkan key pair** — Tambahkan EC2 key pair Amazon ke instance, lalu perbarui grup keamanan untuk mengizinkan akses SSH ke instance.

1. **Perbarui jenis instans** — Ubah jenis instans instans Amazon EC2 yang mendasarinya.

1. **Perbarui AMI** — Ubah Gambar Mesin Amazon (AMI) untuk EC2 instans Amazon di tumpukan Anda.

**catatan**  
CloudFormation gratis, tetapi Anda akan dikenakan biaya untuk EC2 sumber daya Amazon yang Anda buat. Namun, jika Anda baru mengenal AWS, Anda dapat memanfaatkan [Tingkat Gratis](https://aws.amazon.com/free/) untuk meminimalkan atau menghilangkan biaya selama proses pembelajaran ini.

**Topics**
+ [Langkah 1: Buat tumpukan awal](#update-stack-initial-stack)
+ [Langkah 2: Perbarui aplikasi](#update-stack-update-application)
+ [Langkah 3: Tambahkan akses SSH dengan key pair](#update-stack-add-key-pair)
+ [Langkah 4: Perbarui jenis instans](#update-stack-update-instance-type)
+ [Langkah 5: Perbarui AMI](#update-stack-update-ami)
+ [Pertimbangan ketersediaan dan dampak](#update.walkthrough.impact)
+ [Sumber daya terkait](#update.walkthrough.related)

## Langkah 1: Buat tumpukan awal
<a name="update-stack-initial-stack"></a>

Kita akan mulai dengan membuat tumpukan yang dapat kita gunakan sepanjang sisa topik ini. Kami telah menyediakan template sederhana yang meluncurkan satu contoh aplikasi web PHP yang dihosting di Apache Web Server dan berjalan di Amazon Linux 2 AMI.

PHPApache Web Server, dan aplikasi PHP sederhana semuanya diinstal oleh skrip CloudFormation pembantu yang diinstal secara default di Amazon Linux 2 AMI. Cuplikan template berikut menunjukkan metadata yang menjelaskan paket dan file yang akan diinstal, dalam hal ini infrastruktur Apache Web Server dan PHP dari Yum repositori untuk Amazon Linux 2 AMI. Cuplikan juga menunjukkan `Services` bagian, yang memastikan bahwa Apache Web Server sedang berjalan. 

```
WebServerInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      config:
        packages:
          yum:
            httpd: []
            php: []
        files:
          /var/www/html/index.php:
            content: |
              <?php
              echo '<h1>Hello World!</h1>';
              ?>
            mode: '000644'
            owner: apache
            group: apache
        services:
          systemd:
            httpd:
              enabled: true
              ensureRunning: true
```

Aplikasi itu sendiri adalah contoh “Hello World” yang sepenuhnya didefinisikan dalam template. Untuk aplikasi dunia nyata, file dapat disimpan di Amazon S3 GitHub,, atau repositori lain dan direferensikan dari template. CloudFormation dapat mengunduh paket (seperti RPMs atau RubyGems), dan referensi file individual dan memperluas `.zip` dan `.tar` file untuk membuat artefak aplikasi pada EC2 instance Amazon.

Template mengaktifkan dan mengonfigurasi `cfn-hup` daemon untuk mendengarkan perubahan konfigurasi yang ditentukan dalam metadata untuk instance Amazon. EC2 Dengan menggunakan `cfn-hup` daemon, Anda dapat memperbarui perangkat lunak aplikasi, seperti versi Apache atau PHP, atau Anda dapat memperbarui file aplikasi PHP itu sendiri. CloudFormation Cuplikan berikut dari EC2 sumber daya Amazon yang sama di template menunjukkan potongan yang diperlukan untuk mengonfigurasi `cfn-hup` panggilan `cfn-init` setiap dua menit untuk memperhatikan dan menerapkan pembaruan ke metadata. Jika tidak, `cfn-init` hanya berjalan sekali saat start up.

```
files:
  /etc/cfn/cfn-hup.conf:
    content: !Sub |
      [main]
      stack=${AWS::StackId}
      region=${AWS::Region}
      # The interval used to check for changes to the resource metadata in minutes. Default is 15
      interval=2
    mode: '000400'
    owner: root
    group: root
  /etc/cfn/hooks.d/cfn-auto-reloader.conf:
    content: !Sub |
      [cfn-auto-reloader-hook]
      triggers=post.update
      path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
      action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
      runas=root
services:
  systemd:
    cfn-hup:
      enabled: true
      ensureRunning: true
      files:
        - /etc/cfn/cfn-hup.conf
        - /etc/cfn/hooks.d/cfn-auto-reloader.conf
```

Untuk menyelesaikan tumpukan, di `Properties` bagian definisi EC2 instans Amazon, `UserData` properti berisi `cloud-init` skrip yang memanggil `cfn-init` untuk menginstal paket dan file. Untuk informasi selengkapnya, lihat [referensi skrip CloudFormation pembantu di Panduan Referensi CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) *Template*. Template juga membuat grup EC2 keamanan Amazon.

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          yum update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

**Untuk meluncurkan tumpukan dari template ini**

1. Salin template dan simpan secara lokal di sistem Anda sebagai file teks. Catat lokasinya karena Anda harus menggunakan file di langkah berikutnya.

1. Masuk ke Konsol Manajemen AWS dan buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Pilih **Buat tumpukan, Dengan sumber daya baru (standar)**.

1. Pilih **Pilih template yang sudah ada**.

1. Di bawah **Tentukan templat**, pilih **Unggah file templat** dan telusuri file yang Anda buat pada langkah pertama, lalu pilih **Berikutnya**.

1. Pada halaman **Tentukan detail tumpukan**, masukkan **UpdateTutorial** sebagai nama tumpukan.

1. Di bawah **Parameter**, jaga agar semua parameter tetap sama dan pilih **Berikutnya** dua kali.

1. Pada layar **Tinjau dan buat**, pilih **Kirim**.

Setelah status tumpukan Anda`CREATE_COMPLETE`, tab **Output** akan menampilkan URL situs web Anda. Jika Anda memilih nilai `WebsiteURL` output, Anda akan melihat aplikasi PHP baru Anda bekerja.

## Langkah 2: Perbarui aplikasi
<a name="update-stack-update-application"></a>

Karena kita sudah men-deploy tumpukan, mari kita perbarui aplikasi ini. Kami akan membuat perubahan sederhana pada teks yang dicetak oleh aplikasi. Untuk melakukannya, kita akan menambahkan perintah echo ke file index.php seperti yang ditunjukkan dalam snippet templat ini:

```
files:
  /var/www/html/index.php:
    content: |
      <?php
      echo "<h1>Hello World!</h1>";
      echo "<p>This is an updated version of our application.</p>";
      ?>
    mode: '000644'
    owner: apache
    group: apache
```

Gunakan editor teks untuk secara manual mengedit file templat yang Anda simpan secara lokal.

Sekarang, perbarui tumpukan.

**Untuk memperbarui tumpukan dengan template Anda yang diperbarui**

1. Di CloudFormation konsol, pilih **UpdateTutorial** tumpukan Anda.

1. Pilih **Perbarui, Buat pembaruan langsung**.

1. Pilih **Ganti template yang ada**.

1. Di bawah **Tentukan templat**, pilih **Unggah file templat** dan unggah file templat Anda yang dimodifikasi, lalu pilih **Berikutnya**.

1. Pada halaman **Tentukan detail tumpukan**, jaga agar semua parameter tetap sama dan pilih **Berikutnya** dua kali.

1. Pada halaman **Ulasan**, tinjau perubahannya. Di bawah **Perubahan**, Anda akan melihat bahwa CloudFormation akan memperbarui `WebServerInstance` sumber daya.

1. Pilih **Kirim**.

Ketika tumpukan Anda dalam `UPDATE_COMPLETE` status, Anda dapat memilih nilai `WebsiteURL` output lagi untuk memverifikasi bahwa perubahan pada aplikasi Anda telah berlaku. `cfn-hup`Daemon berjalan setiap 2 menit, jadi mungkin perlu waktu hingga 2 menit agar aplikasi berubah setelah tumpukan diperbarui.

Untuk melihat kumpulan sumber daya yang diperbarui, buka CloudFormation konsol. Di tab **Peristiwa**, llihat peristiwa tumpukan. Dalam kasus khusus ini, metadata untuk EC2 instans Amazon `WebServerInstance` diperbarui, yang CloudFormation menyebabkan juga mengevaluasi kembali resource (`WebServerSecurityGroup`) lainnya untuk memastikan bahwa tidak ada perubahan lain. Tidak ada sumber daya tumpukan lainnya yang dimodifikasi. CloudFormation hanya akan memperbarui sumber daya di tumpukan yang terpengaruh oleh perubahan apa pun pada tumpukan. Perubahan tersebut dapat langsung, seperti properti atau perubahan metadata, atau dapat disebabkan oleh dependensi atau aliran data melalui`Ref`,`GetAtt`, atau fungsi template intrinsik lainnya. Untuk informasi lebih lanjut, lihat Referensi [fungsi intrinsik](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

Pembaruan sederhana ini menggambarkan prosesnya. Namun, Anda dapat membuat perubahan yang jauh lebih kompleks pada file dan paket yang disebarkan ke EC2 instance Amazon Anda. Misalnya, Anda mungkin memutuskan bahwa Anda perlu menambahkan MySQL ke instans, bersama dengan dukungan PHP untuk MySQL. Untuk melakukannya, cukup tambahkan paket dan file tambahan bersama dengan layanan tambahan apa pun ke konfigurasi, lalu perbarui tumpukan untuk menerapkan perubahan.

```
packages:
  yum:
    httpd: []
    php: []
    mysql: []
    php-mysql: []
    mysql-server: []
    mysql-libs: []

  ...

services:
  systemd:
    httpd:
      enabled: true
      ensureRunning: true
    cfn-hup:
      enabled: true
      ensureRunning: true
      files:
        - /etc/cfn/cfn-hup.conf
        - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    mysqld:
      enabled: true
      ensureRunning: true
```

Anda dapat memperbarui CloudFormation metadata untuk memperbarui ke versi baru dari paket yang digunakan oleh aplikasi. Dalam contoh sebelumnya, properti versi untuk setiap paket kosong, menunjukkan bahwa `cfn-init` harus menginstal versi terbaru dari paket.

```
packages:
  yum:
    httpd: []
    php: []
```

Anda dapat secara opsional menentukan string versi untuk paket. Jika Anda mengubah string versi dalam panggilan tumpukan pembaruan berikutnya, versi baru dari paket akan di-deploy. Berikut adalah contoh penggunaan nomor versi untuk RubyGems paket. Setiap paket yang mendukung versioning dapat memiliki versi tertentu.

```
packages:
  rubygems:
    mysql: []
    rubygems-update:
      - "1.6.2"
    rake:
      - "0.8.7"
    rails:
      - "2.3.11"
```

## Langkah 3: Tambahkan akses SSH dengan key pair
<a name="update-stack-add-key-pair"></a>

Anda juga dapat memperbarui sumber daya dalam template untuk menambahkan properti yang awalnya tidak ditentukan dalam template. Untuk mengilustrasikannya, kami akan menambahkan EC2 key pair Amazon ke EC2 instance yang ada dan kemudian membuka port 22 di grup EC2 keamanan Amazon sehingga Anda dapat menggunakan Secure Shell (SSH) untuk mengakses instance.

**Untuk menambahkan akses SSH ke instans Amazon EC2 yang ada**

1. Tambahkan dua parameter tambahan ke template untuk meneruskan nama Amazon EC2 key pair dan lokasi SSH yang ada.

   ```
   Parameters:
     KeyName:
       Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
       Type: AWS::EC2::KeyPair::KeyName
       ConstraintDescription: must be the name of an existing EC2 KeyPair.
   
     SSHLocation:
       Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
       Type: String
       MinLength: 9
       MaxLength: 18
       Default: 0.0.0.0/0
       AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
       ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
   ```

1. Tambahkan `KeyName` properti ke EC2 instance Amazon.

   ```
   WebServerInstance:
     Type: AWS::EC2::Instance
     Properties:
       ImageId: !Ref LatestAmiId
       InstanceType: !Ref InstanceType
       KeyName: !Ref KeyName
       SecurityGroupIds:
         - !Ref WebServerSecurityGroup
   ```

1. Tambahkan port 22 dan lokasi SSH ke aturan masuk untuk grup EC2 keamanan Amazon.

   ```
   WebServerSecurityGroup:
     Type: AWS::EC2::SecurityGroup
     Properties:
       GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
       SecurityGroupIngress:
         - IpProtocol: tcp
           FromPort: 80
           ToPort: 80
           CidrIp: 0.0.0.0/0
         - IpProtocol: tcp
           FromPort: 22
           ToPort: 22
           CidrIp: !Ref SSHLocation
   ```

1. Perbarui tumpukan menggunakan langkah yang sama seperti yang dijelaskan di[Langkah 2: Perbarui aplikasi](#update-stack-update-application).

## Langkah 4: Perbarui jenis instans
<a name="update-stack-update-instance-type"></a>

Sekarang mari kita tunjukkan cara memperbarui infrastruktur yang mendasarinya dengan mengubah jenis instance.

Tumpukan yang kami buat sejauh ini menggunakan instance Amazon EC2 t3.micro. Misalkan situs web Anda yang baru dibuat mendapatkan lebih banyak lalu lintas daripada yang dapat ditangani oleh instans t3.micro, dan sekarang Anda ingin pindah ke jenis instans Amazon EC2 m5.large. Jika arsitektur tipe instance berubah, instance harus dibuat dengan AMI yang berbeda. Namun, baik t3.micro dan m5.large menggunakan arsitektur CPU yang sama dan menjalankan Amazon Linux 2 (x86\$164). AMIs Untuk informasi selengkapnya, lihat [Kompatibilitas untuk mengubah jenis instans](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resize-limitations.html) di *Panduan EC2 Pengguna Amazon*.

Mari kita gunakan template yang kita modifikasi pada langkah sebelumnya untuk mengubah jenis instance. Karena `InstanceType` merupakan parameter input ke template, kita tidak perlu memodifikasi template; kita dapat mengubah nilai parameter pada halaman Specify **stack details**.

**Untuk memperbarui tumpukan dengan nilai parameter baru**

1. Di CloudFormation konsol, pilih **UpdateTutorial** tumpukan Anda.

1. Pilih **Perbarui, Buat pembaruan langsung**.

1. Pilih **Gunakan template yang ada**, lalu pilih **Berikutnya**.

1. Pada halaman **Tentukan detail tumpukan**, ubah nilai kotak **InstanceType**teks dari `t3.micro` menjadi`m5.large`. Kemudian, pilih **Berikutnya** dua kali.

1. Pada halaman **Ulasan**, tinjau perubahannya. Di bawah **Perubahan**, Anda akan melihat bahwa CloudFormation akan memperbarui `WebServerInstance` sumber daya.

1. Pilih **Kirim**.

Anda dapat mengubah jenis instans instans EC2 Amazon yang didukung EBS secara dinamis dengan memulai dan menghentikan instans. CloudFormation mencoba mengoptimalkan perubahan dengan memperbarui jenis instance dan memulai ulang instance, sehingga ID instance tidak berubah. Ketika instans dimulai ulang, tetapi, alamat IP publik dari instans tidak berubah. Untuk memastikan bahwa alamat IP Elastis terikat dengan benar setelah perubahan, juga CloudFormation akan memperbarui alamat IP Elastis. Anda dapat melihat perubahan di CloudFormation konsol pada tab **Acara**.

Untuk memeriksa jenis instance dari Konsol Manajemen AWS, buka EC2 konsol Amazon, dan temukan instance Anda di sana.

## Langkah 5: Perbarui AMI
<a name="update-stack-update-ami"></a>

Sekarang mari kita perbarui tumpukan kita untuk menggunakan Amazon Linux 2023, yang merupakan generasi berikutnya dari Amazon Linux. 

Memperbarui AMI adalah perubahan besar yang memerlukan penggantian instance. Kita tidak bisa begitu saja memulai dan menghentikan instance untuk memodifikasi AMI; CloudFormation menganggap ini sebagai perubahan pada properti sumber daya yang tidak dapat diubah. Untuk membuat perubahan pada properti yang tidak dapat diubah, CloudFormation harus meluncurkan sumber daya pengganti, dalam hal ini EC2 instance Amazon baru yang menjalankan AMI baru. 

Mari kita lihat bagaimana kita dapat memperbarui template stack kita untuk menggunakan Amazon Linux 2023. Perubahan utama termasuk memperbarui parameter AMI dan mengubah dari `yum` ke manajer `dnf` paket.

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2023 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.

  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.

  SSHLocation:
    Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          dnf update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            dnf:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                echo "<p>This is an updated version of our application.</p>";
                echo "<p>Running on Amazon Linux 2023!</p>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

Perbarui tumpukan menggunakan langkah yang sama seperti yang dijelaskan di[Langkah 2: Perbarui aplikasi](#update-stack-update-application).

Setelah instance baru berjalan, CloudFormation perbarui sumber daya lain di tumpukan untuk menunjuk ke sumber daya baru. Ketika semua sumber daya baru dibuat, sumber daya lama dihapus, sebuah proses yang dikenal sebagai`UPDATE_CLEANUP`. Kali ini, Anda akan melihat bahwa ID instans dan URL aplikasi dari instans di dalam tumpukan telah berubah sebagai hasil dari pembaruan. Peristiwa dalam tabel **Peristiwa** berisi deskripsi “Pembaruan yang diminta memiliki perubahan ke properti yang tidak dapat diubah dan karenanya menciptakan sumber daya fisik baru” untuk menunjukkan bahwa sumber daya diganti.

Atau: Jika Anda memiliki kode aplikasi yang ditulis ke dalam AMI yang ingin Anda perbarui, Anda dapat menggunakan mekanisme pembaruan tumpukan yang sama untuk memperbarui AMI untuk memuat aplikasi baru Anda.

**Untuk memperbarui AMI dengan kode aplikasi khusus**

1. Buat AMI baru Anda yang berisi perubahan aplikasi atau sistem operasi Anda. *Untuk informasi selengkapnya, lihat [Membuat AMI yang didukung Amazon EBS-backed di Panduan](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html) Pengguna Amazon. EC2 *

1. Perbarui template Anda untuk memasukkan ID AMI baru.

1. Perbarui tumpukan menggunakan langkah yang sama seperti yang dijelaskan di[Langkah 2: Perbarui aplikasi](#update-stack-update-application).

Saat Anda memperbarui tumpukan, CloudFormation mendeteksi bahwa ID AMI telah berubah, dan kemudian memicu pembaruan tumpukan dengan cara yang sama seperti kami memulai yang di atas.

## Pertimbangan ketersediaan dan dampak
<a name="update.walkthrough.impact"></a>

Properti yang berbeda memiliki dampak yang berbeda pada sumber daya dalam tumpukan. Anda dapat menggunakan CloudFormation untuk memperbarui properti apa pun; tetapi, sebelum Anda membuat perubahan, Anda harus mempertimbangkan pertanyaan-pertanyaan berikut:

1. Bagaimana pembaruan memengaruhi sumber daya itu sendiri? Misalnya, memperbarui ambang batas alarm akan membuat alarm tidak aktif selama pembaruan. Seperti yang telah kita lihat, mengubah jenis instance mengharuskan instance dihentikan dan dimulai ulang. CloudFormation menggunakan tindakan pembaruan atau modifikasi untuk sumber daya yang mendasarinya untuk membuat perubahan pada sumber daya. Untuk memahami dampak pembaruan, Anda harus memeriksa dokumentasi untuk sumber daya tertentu.

1. Apakah perubahan itu dapat berubah atau tidak dapat berubah? Beberapa perubahan pada properti sumber daya, seperti mengubah AMI di EC2 instans Amazon, tidak didukung oleh layanan yang mendasarinya. Dalam kasus perubahan yang bisa berubah, CloudFormation akan menggunakan jenis Update atau Modify APIs untuk sumber daya yang mendasarinya. Untuk perubahan properti yang tidak dapat diubah, CloudFormation akan membuat sumber daya baru dengan properti yang diperbarui dan kemudian menautkannya ke tumpukan sebelum menghapus sumber daya lama. Meskipun CloudFormation mencoba mengurangi waktu henti sumber daya tumpukan, mengganti sumber daya adalah proses multistep, dan itu akan memakan waktu. Selama konfigurasi ulang tumpukan, aplikasi Anda tidak akan beroperasi penuh. Misalnya, aplikasi mungkin tidak dapat melayani permintaan atau mengakses database.

## Sumber daya terkait
<a name="update.walkthrough.related"></a>

Untuk informasi selengkapnya tentang penggunaan CloudFormation untuk memulai aplikasi dan mengintegrasikan dengan layanan konfigurasi dan penyebaran lainnya seperti Puppet danOpscode Chef, lihat whitepaper berikut:
+ [Bootstrapping aplikasi melalui CloudFormation](https://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf)
+ [Integrasi dengan CloudFormation Opscode Chef](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithOpscodeChef.pdf)
+ [Integrasi dengan CloudFormation Puppet](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithPuppet.pdf)

# Buat aplikasi yang diskalakan dan diseimbangkan beban
<a name="walkthrough-autoscaling"></a>

Untuk panduan ini, Anda membuat tumpukan yang membantu Anda mengatur aplikasi yang diskalakan dan seimbang beban. Panduan ini menyediakan contoh template yang Anda gunakan untuk membuat tumpukan. Contoh template menyediakan grup Auto Scaling, Application Load Balancer, grup keamanan yang mengontrol lalu lintas ke penyeimbang beban dan ke grup Auto Scaling, dan konfigurasi notifikasi Amazon SNS untuk mempublikasikan pemberitahuan tentang aktivitas penskalaan. 

Template ini membuat satu atau beberapa instans Amazon EC2 dan Application Load Balancer. Anda akan ditagih untuk sumber daya AWS yang digunakan jika Anda membuat tumpukan dari templat ini. 

## Template tumpukan penuh
<a name="example-templates-autoscaling-full-stack-template"></a>

Mari kita mulai dengan template.

**YAML**

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  InstanceType:
    Description: The EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.micro
      - t3.small
      - t3.medium
  KeyName:
    Description: Name of an existing EC2 key pair to allow SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
  OperatorEmail:
    Description: The email address to notify when there are any scaling activities
    Type: String
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  Subnets:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: At least two public subnets in different Availability Zones in the selected VPC
  VPC:
    Type: AWS::EC2::VPC::Id
    Description: A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet
Resources:
  ELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: EC2 Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        SourceSecurityGroupId:
          Fn::GetAtt:
          - ELBSecurityGroup
          - GroupId
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: !Ref SSHLocation
  EC2TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 15
      HealthyThresholdCount: 5
      Matcher:
        HttpCode: '200'
      Name: EC2TargetGroup
      Port: 80
      Protocol: HTTP
      TargetGroupAttributes:
      - Key: deregistration_delay.timeout_seconds
        Value: '20'
      UnhealthyThresholdCount: 3
      VpcId: !Ref VPC
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref EC2TargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: 80
      Protocol: HTTP
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      Subnets: !Ref Subnets
      SecurityGroups:
        - !GetAtt ELBSecurityGroup.GroupId
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: !Ref LatestAmiId
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        SecurityGroupIds: 
          - !Ref EC2SecurityGroup
        UserData:
          Fn::Base64: !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd
            systemctl start httpd
            systemctl enable httpd
            echo "<h1>Hello World!</h1>" > /var/www/html/index.html
  NotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
  WebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MaxSize: '3'
      MinSize: '1'
      NotificationConfigurations:
        - TopicARN: !Ref NotificationTopic
          NotificationTypes: ['autoscaling:EC2_INSTANCE_LAUNCH', 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR', 'autoscaling:EC2_INSTANCE_TERMINATE', 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR']
      TargetGroupARNs:
        - !Ref EC2TargetGroup
      VPCZoneIdentifier: !Ref Subnets
```

**JSON**

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Parameters":{
    "InstanceType":{
      "Description":"The EC2 instance type",
      "Type":"String",
      "Default":"t3.micro",
      "AllowedValues":[
        "t3.micro",
        "t3.small",
        "t3.medium"
      ]
    },
    "KeyName":{
      "Description":"Name of an existing EC2 key pair to allow SSH access to the instances",
      "Type":"AWS::EC2::KeyPair::KeyName"
    },
    "LatestAmiId":{
      "Description":"The latest Amazon Linux 2 AMI from the Parameter Store",
      "Type":"AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
      "Default":"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    },
    "OperatorEmail":{
      "Description":"The email address to notify when there are any scaling activities",
      "Type":"String"
    },
    "SSHLocation":{
      "Description":"The IP address range that can be used to SSH to the EC2 instances",
      "Type":"String",
      "MinLength":9,
      "MaxLength":18,
      "Default":"0.0.0.0/0",
      "ConstraintDescription":"Must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "Subnets":{
      "Type":"List<AWS::EC2::Subnet::Id>",
      "Description":"At least two public subnets in different Availability Zones in the selected VPC"
    },
    "VPC":{
      "Type":"AWS::EC2::VPC::Id",
      "Description":"A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet"
    }
  },
  "Resources":{
    "ELBSecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"ELB Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
    },
    "EC2SecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"EC2 Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "SourceSecurityGroupId":{
              "Fn::GetAtt":[
                "ELBSecurityGroup",
                "GroupId"
              ]
            }
          },
          {
            "IpProtocol":"tcp",
            "FromPort":22,
            "ToPort":22,
            "CidrIp":{
              "Ref":"SSHLocation"
            }
          }
        ]
      }
    },
    "EC2TargetGroup":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":30,
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":15,
        "HealthyThresholdCount":5,
        "Matcher":{
          "HttpCode":"200"
        },
        "Name":"EC2TargetGroup",
        "Port":80,
        "Protocol":"HTTP",
        "TargetGroupAttributes":[
          {
            "Key":"deregistration_delay.timeout_seconds",
            "Value":"20"
          }
        ],
        "UnhealthyThresholdCount":3,
        "VpcId":{
          "Ref":"VPC"
        }
      }
    },
    "ALBListener":{
      "Type":"AWS::ElasticLoadBalancingV2::Listener",
      "Properties":{
        "DefaultActions":[
          {
            "Type":"forward",
            "TargetGroupArn":{
              "Ref":"EC2TargetGroup"
            }
          }
        ],
        "LoadBalancerArn":{
          "Ref":"ApplicationLoadBalancer"
        },
        "Port":80,
        "Protocol":"HTTP"
      }
    },
    "ApplicationLoadBalancer":{
      "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties":{
        "Scheme":"internet-facing",
        "Subnets":{
          "Ref":"Subnets"
        },
        "SecurityGroups":[
          {
            "Fn::GetAtt":[
              "ELBSecurityGroup",
              "GroupId"
            ]
          }
        ]
      }
    },
    "LaunchTemplate":{
      "Type":"AWS::EC2::LaunchTemplate",
      "Properties":{
        "LaunchTemplateName":{
          "Fn::Sub":"${AWS::StackName}-launch-template"
        },
        "LaunchTemplateData":{
          "ImageId":{
            "Ref":"LatestAmiId"
          },
          "InstanceType":{
            "Ref":"InstanceType"
          },
          "KeyName":{
            "Ref":"KeyName"
          },
          "SecurityGroupIds":[
            {
              "Ref":"EC2SecurityGroup"
            }
          ],
          "UserData":{
            "Fn::Base64":{
              "Fn::Join":[
                "",
                [
                  "#!/bin/bash\n",
                  "yum update -y\n",
                  "yum install -y httpd\n",
                  "systemctl start httpd\n",
                  "systemctl enable httpd\n",
                  "echo \"<h1>Hello World!</h1>\" > /var/www/html/index.html"
                ]
              ]
            }
          }
        }
      }
    },
    "NotificationTopic":{
      "Type":"AWS::SNS::Topic",
      "Properties":{
        "Subscription":[
          {
            "Endpoint":{
              "Ref":"OperatorEmail"
            },
            "Protocol":"email"
          }
        ]
      }
    },
    "WebServerGroup":{
      "Type":"AWS::AutoScaling::AutoScalingGroup",
      "Properties":{
        "LaunchTemplate":{
          "LaunchTemplateId":{
            "Ref":"LaunchTemplate"
          },
          "Version":{
            "Fn::GetAtt":[
              "LaunchTemplate",
              "LatestVersionNumber"
            ]
          }
        },
        "MaxSize":"3",
        "MinSize":"1",
        "NotificationConfigurations":[
          {
            "TopicARN":{
              "Ref":"NotificationTopic"
            },
            "NotificationTypes":[
              "autoscaling:EC2_INSTANCE_LAUNCH",
              "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
              "autoscaling:EC2_INSTANCE_TERMINATE",
              "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
            ]
          }
        ],
        "TargetGroupARNs":[
          {
            "Ref":"EC2TargetGroup"
          }
        ],
        "VPCZoneIdentifier":{
          "Ref":"Subnets"
        }
      }
    }
  }
}
```

## Panduan templat
<a name="example-templates-autoscaling-description"></a>

Bagian pertama dari template ini menentukan. `Parameters` Setiap parameter harus diberi nilai saat runtime CloudFormation agar berhasil menyediakan tumpukan. Sumber daya yang ditentukan kemudian dalam templat mereferensikan nilai-nilai ini dan menggunakan data.
+ `InstanceType`: Jenis instans EC2 yang disediakan Amazon EC2 Auto Scaling. Jika tidak ditentukan, default dari `t3.micro` digunakan.
+ `KeyName`: Sebuah key pair EC2 yang ada untuk memungkinkan akses SSH ke instance.
+ `LatestAmiId`: Amazon Machine Image (AMI) untuk instans. Jika tidak ditentukan, instans Anda diluncurkan dengan Amazon Linux 2 AMI, menggunakan parameter AWS Systems Manager publik yang dikelola oleh AWS. Untuk informasi selengkapnya, lihat [Menemukan parameter publik](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) di *Panduan AWS Systems Manager Pengguna*.
+ `OperatorEmail`: Alamat email tempat Anda ingin mengirim pemberitahuan aktivitas penskalaan.
+ `SSHLocation`: Rentang alamat IP yang dapat digunakan untuk SSH ke instance.
+ `Subnets`: Setidaknya dua subnet publik di Availability Zone yang berbeda. 
+ `VPC`Virtual Private Cloud (VPC) di akun Anda yang memungkinkan sumber daya di subnet publik untuk terhubung ke internet. 
**catatan**  
Anda dapat menggunakan VPC default dan subnet default untuk memungkinkan instance mengakses internet. Jika menggunakan VPC Anda sendiri, pastikan bahwa ia memiliki subnet yang dipetakan ke setiap Availability Zone dari Region tempat Anda bekerja. Minimal, Anda harus memiliki dua subnet publik yang tersedia untuk membuat penyeimbang beban.

Bagian selanjutnya dari template ini menentukan. `Resources` Bagian ini menentukan sumber daya tumpukan dan propertinya.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)sumber daya `ELBSecurityGroup` 
+ `SecurityGroupIngress`berisi aturan masuknya TCP yang memungkinkan akses dari *semua alamat IP* (” CidrIp ": “0.0.0.0/0") pada port 80.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)sumber daya `EC2SecurityGroup` 
+ `SecurityGroupIngress`berisi dua aturan ingress: 1) aturan masuknya TCP yang memungkinkan akses SSH (port 22) dari rentang alamat IP yang Anda berikan untuk parameter `SSHLocation` input dan 2) aturan masuknya TCP yang memungkinkan akses dari penyeimbang beban dengan menentukan grup keamanan penyeimbang beban. [GetAtt](resources-section-structure.md#resource-properties-getatt)Fungsi ini digunakan untuk mendapatkan ID grup keamanan dengan nama logis`ELBSecurityGroup`.

[AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)sumber daya `EC2TargetGroup`
+ `Port`,`Protocol`, dan `HealthCheckProtocol` tentukan port instans EC2 (80) dan protokol (HTTP) yang digunakan lalu lintas `ApplicationLoadBalancer` rute dan Elastic Load Balancing yang digunakan untuk memeriksa kesehatan instans EC2.
+ `HealthCheckIntervalSeconds`menentukan bahwa instans EC2 memiliki interval 30 detik antara pemeriksaan kesehatan. `HealthCheckTimeoutSeconds`Ini didefinisikan sebagai lamanya waktu Elastic Load Balancing menunggu respons dari target pemeriksaan kesehatan (15 detik dalam contoh ini). Setelah periode batas waktu berlalu, Elastic Load Balancing menandai bahwa pemeriksaan kesehatan instans EC2 tidak sehat. Ketika instans EC2 gagal tiga pemeriksaan kesehatan berturut-turut (`UnhealthyThresholdCount`), Elastic Load Balancing menghentikan perutean lalu lintas ke instans EC2 tersebut hingga instance tersebut memiliki lima pemeriksaan kesehatan sehat berturut-turut (). `HealthyThresholdCount` Pada saat itu, Elastic Load Balancing menganggap instance sehat dan mulai merutekan lalu lintas ke instance lagi.
+ `TargetGroupAttributes`memperbarui nilai penundaan deregistrasi grup target menjadi 20 detik. Secara default, Elastic Load Balancing menunggu 300 detik sebelum menyelesaikan proses deregistrasi.

[AWS::ElasticLoadBalancingV2::Listener](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html)sumber daya `ALBListener`
+ `DefaultActions`menentukan port yang didengarkan penyeimbang beban, grup target tempat penyeimbang beban meneruskan permintaan, dan protokol yang digunakan untuk merutekan permintaan.

[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)sumber daya `ApplicationLoadBalancer`
+ `Subnets`mengambil nilai parameter `Subnets` input sebagai daftar subnet publik di mana node penyeimbang beban akan dibuat.
+ `SecurityGroup`mendapatkan ID grup keamanan yang bertindak sebagai firewall virtual untuk node penyeimbang beban Anda untuk mengontrol lalu lintas masuk. [GetAtt](resources-section-structure.md#resource-properties-getatt)Fungsi ini digunakan untuk mendapatkan ID grup keamanan dengan nama logis`ELBSecurityGroup`.

[AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)sumber daya `LaunchTemplate`
+ `ImageId`mengambil nilai parameter `LatestAmiId` input sebagai AMI untuk digunakan.
+ `KeyName`mengambil nilai parameter `KeyName` input sebagai key pair EC2 untuk digunakan.
+ `SecurityGroupIds`mendapatkan ID grup keamanan dengan nama logis `EC2SecurityGroup` yang bertindak sebagai firewall virtual untuk instans EC2 Anda untuk mengontrol lalu lintas masuk.
+ `UserData`adalah skrip konfigurasi yang berjalan setelah instance aktif dan berjalan. Dalam contoh ini, skrip menginstal Apache dan membuat file index.html.

[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html)sumber daya `NotificationTopic`
+ `Subscription`mengambil nilai parameter `OperatorEmail` input sebagai alamat email untuk penerima notifikasi ketika ada aktivitas penskalaan. 

AWS::AutoScaling::AutoScalingSumber daya [grup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) `WebServerGroup`
+ `MinSize`dan `MaxSize` atur jumlah minimum dan maksimum instans EC2 di grup Auto Scaling.
+ `TargetGroupARNs`mengambil ARN dari kelompok target dengan nama logis. `EC2TargetGroup` Saat grup Auto Scaling ini menskalakan, grup Auto Scaling secara otomatis mendaftarkan dan membatalkan pendaftaran instance dengan grup target ini.
+ `VPCZoneIdentifier`mengambil nilai parameter `Subnets` input sebagai daftar subnet publik tempat instans EC2 dapat dibuat.

## Langkah 1: Luncurkan tumpukan
<a name="example-templates-autoscaling-launch-stack"></a>

Sebelum Anda meluncurkan tumpukan, periksa apakah Anda memiliki izin AWS Identity and Access Management (IAM) untuk menggunakan semua layanan berikut: Amazon EC2, Amazon EC2 Auto Scaling,, Elastic Load Balancing AWS Systems Manager, Amazon SNS, dan. CloudFormation

Prosedur berikut melibatkan mengunggah template tumpukan sampel dari file. Buka editor teks di mesin lokal Anda dan tambahkan salah satu templat. Simpan file dengan nama`sampleloadbalancedappstack.template`.

**Untuk meluncurkan template tumpukan**

1. Masuk ke Konsol Manajemen AWS dan buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Pilih **Buat tumpukan**, **Dengan sumber daya baru (standar)**.

1. Di bawah **Tentukan templat**, pilih **Unggah file templat**, **Pilih file** untuk mengunggah `sampleloadbalancedappstack.template` file. 

1. Pilih **Berikutnya**.

1. Pada halaman **Tentukan detail tumpukan**, ketik nama tumpukan (misalnya,**SampleLoadBalancedAppStack**).

1. **Di bawah **Parameter**, tinjau parameter untuk tumpukan dan berikan nilai untuk semua parameter yang tidak memiliki nilai default, termasuk **OperatorEmail**,, **SSHLocation**KeyName****, **VPC**, dan Subnet.**

1. Pilih **Selanjutnya** dua kali.

1. Pada halaman **Ulasan**, tinjau dan konfirmasikan pengaturan.

1. Pilih **Kirim**.

   Anda dapat melihat status tumpukan di CloudFormation konsol di kolom **Status**. Ketika CloudFormation telah berhasil membuat tumpukan, Anda menerima status **CREATE\$1COMPLETE**.
**catatan**  
Setelah Anda membuat tumpukan, Anda harus mengonfirmasi langganan sebelum alamat email dapat mulai menerima pemberitahuan. Untuk informasi selengkapnya, lihat [Mendapatkan notifikasi Amazon SNS saat grup Auto Scaling Anda menskalakan](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-sns-notifications.html) di Panduan Pengguna *Amazon EC2 Auto Scaling*.

## Langkah 2: Bersihkan sumber daya sampel Anda
<a name="example-templates-autoscaling-clean-up"></a>

Untuk memastikan bahwa Anda tidak dikenakan biaya untuk sumber daya sampel yang tidak digunakan, hapus tumpukan.

**Untuk menghapus tumpukan**

1. Di CloudFormation konsol, pilih **SampleLoadBalancedAppStack**tumpukan.

1. Pilih **Hapus**.

1. Dalam pesan konfirmasi, pilih **Hapus tumpukan**.

   Status **SampleLoadBalancedAppStack**perubahan pada **DELETE\$1IN\$1PROGRESS**. Ketika CloudFormation menyelesaikan penghapusan tumpukan, itu menghapus tumpukan dari daftar.

Gunakan contoh template dari panduan ini untuk membangun template tumpukan Anda sendiri. Untuk informasi selengkapnya, lihat [Tutorial: Menyiapkan aplikasi yang diskalakan dan seimbang beban di Panduan Pengguna](https://docs.aws.amazon.com/autoscaling/ec2/userguide/tutorial-ec2-auto-scaling-load-balancer.html) *Amazon EC2 Auto Scaling*.

# Rekan dengan VPC di yang lain Akun AWS
<a name="peer-with-vpc-in-another-account"></a>

Anda dapat mengintip dengan Virtual Private Cloud (VPC) di tempat lain dengan menggunakan. Akun AWS [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html) Ini menciptakan koneksi jaringan antara dua VPCs yang memungkinkan Anda untuk mengarahkan lalu lintas di antara mereka sehingga mereka dapat berkomunikasi seolah-olah mereka berada dalam jaringan yang sama. Koneksi peering VPC dapat membantu memfasilitasi akses data dan transfer data.

Untuk membuat koneksi peering VPC, Anda perlu mengotorisasi dua terpisah Akun AWS dalam satu tumpukan. CloudFormation 

Untuk informasi selengkapnya tentang peering VPC dan batasannya, lihat Panduan Peering [VPC](https://docs.aws.amazon.com/vpc/latest/peering/) Amazon. 

## Prasyarat
<a name="peer-with-vpc-in-another-account-prerequisites"></a>

1. Anda memerlukan ID VPC peer, ID Akun AWS rekan, dan peran [akses lintas akun untuk](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html) koneksi peering. 
**catatan**  
Panduan ini mengacu pada dua akun: Pertama adalah akun yang memungkinkan peering lintas akun (*akun penerima*). Kedua adalah akun yang meminta koneksi peering (*akun peminta*).

1. Untuk menerima koneksi peering VPC, peran akses lintas-akun harus dapat Anda tanggung. Sumber daya berperilaku dengan cara yang sama seperti sumber daya koneksi peering VPC di akun yang sama. *Untuk informasi tentang cara administrator IAM memberikan izin untuk mengambil peran lintas akun, lihat [Memberikan izin pengguna untuk beralih peran dalam Panduan Pengguna](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html) IAM.*

## Langkah 1: Buat VPC dan peran lintas akun
<a name="step-1-create-vpc-and-cross-account-role"></a>

Di langkah ini, Anda akan membuat VPC dan peran dalam *akun penerima*.

**Untuk membuat VPC dan peran akses lintas akun**

1. Masuk ke Konsol Manajemen AWS dan buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Dari halaman **Stacks**, pilih **Buat tumpukan** di kanan atas, lalu pilih **Dengan sumber daya baru (standar)**.

1. **Untuk **Prasyarat - Siapkan templat**, pilih **Pilih templat yang ada** lalu **Unggah file templat, Pilih file**.**

1. Buka editor teks di mesin lokal Anda dan tambahkan salah satu templat berikut. Simpan file dan kembali ke konsol untuk memilihnya sebagai file template.  
**Example JSON**  

   ```
   {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Description": "Create a VPC and an assumable role for cross account VPC peering.",
     "Parameters": {
       "PeerRequesterAccountId": {
         "Type": "String"
       }
     },
     "Resources": {
       "vpc": {
         "Type": "AWS::EC2::VPC",
         "Properties": {
           "CidrBlock": "10.1.0.0/16",
           "EnableDnsSupport": false,
           "EnableDnsHostnames": false,
           "InstanceTenancy": "default"
         }
       },
       "peerRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
           "AssumeRolePolicyDocument": {
             "Statement": [
               {
                 "Principal": {
                   "AWS": {
                     "Ref": "PeerRequesterAccountId"
                   }
                 },
                 "Action": [
                   "sts:AssumeRole"
                 ],
                 "Effect": "Allow"
               }
             ]
           },
           "Path": "/",
           "Policies": [
             {
               "PolicyName": "root",
               "PolicyDocument": {
                 "Version": "2012-10-17",		 	 	 
                 "Statement": [
                   {
                     "Effect": "Allow",
                     "Action": "ec2:AcceptVpcPeeringConnection",
                     "Resource": "*"
                   }
                 ]
               }
             }
           ]
         }
       }
     },
     "Outputs": {
       "VPCId": {
         "Value": {
           "Ref": "vpc"
         }
       },
       "RoleARN": {
         "Value": {
           "Fn::GetAtt": [
             "peerRole",
             "Arn"
           ]
         }
       }
     }
   }
   ```  
**Example YAML**  

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Description: Create a VPC and an assumable role for cross account VPC peering.
   Parameters:
     PeerRequesterAccountId:
       Type: String
   Resources:
     vpc:
       Type: AWS::EC2::VPC
       Properties:
         CidrBlock: 10.1.0.0/16
         EnableDnsSupport: false
         EnableDnsHostnames: false
         InstanceTenancy: default
     peerRole:
       Type: AWS::IAM::Role
       Properties:
         AssumeRolePolicyDocument:
           Statement:
             - Principal:
                 AWS: !Ref PeerRequesterAccountId
               Action:
                 - 'sts:AssumeRole'
               Effect: Allow
         Path: /
         Policies:
           - PolicyName: root
             PolicyDocument:
               Version: 2012-10-17 		 	 	 
               Statement:
                 - Effect: Allow
                   Action: 'ec2:AcceptVpcPeeringConnection'
                   Resource: '*'
   Outputs:
     VPCId:
       Value: !Ref vpc
     RoleARN:
       Value: !GetAtt 
         - peerRole
         - Arn
   ```

1. Pilih **Berikutnya**.

1. Beri nama tumpukan (misalnya,**VPC-owner**), lalu masukkan Akun AWS ID *akun pemohon* di **PeerRequesterAccountId**bidang.

1. Terima default, dan kemudian pilih **Selanjutnya**.

1. Pilih **Saya mengakui yang CloudFormation mungkin membuat sumber daya IAM**, lalu pilih **Buat** tumpukan.

## Langkah 2: Buat templat yang mencakup `AWS::EC2::VPCPeeringConnection`
<a name="step-2-create-template-for-vpc-peering-connection-owner"></a>

*Sekarang setelah Anda membuat VPC dan peran lintas akun, Anda dapat mengintip VPC menggunakan yang lain Akun AWS (akun pemohon).*

**Untuk membuat template yang menyertakan sumber daya [AWS: :EC2:: VPCPeering](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html) Connection**

1. Kembali ke halaman beranda CloudFormation konsol.

1. Dari halaman **Stacks**, pilih **Buat tumpukan** di kanan atas, lalu pilih **Dengan sumber daya baru (standar)**.

1. **Untuk **Prasyarat - Siapkan templat**, pilih **Pilih templat yang ada** lalu **Unggah file templat, Pilih file**.**

1. Buka editor teks di mesin lokal Anda dan tambahkan salah satu templat berikut. Simpan file dan kembali ke konsol untuk memilihnya sebagai file template.  
**Example JSON**  

   ```
   {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Description": "Create a VPC and a VPC Peering connection using the PeerRole to accept.",
     "Parameters": {
       "PeerVPCAccountId": {
         "Type": "String"
       },
       "PeerVPCId": {
         "Type": "String"
       },
       "PeerRoleArn": {
         "Type": "String"
       }
     },
     "Resources": {
       "vpc": {
         "Type": "AWS::EC2::VPC",
         "Properties": {
           "CidrBlock": "10.2.0.0/16",
           "EnableDnsSupport": false,
           "EnableDnsHostnames": false,
           "InstanceTenancy": "default"
         }
       },
       "vpcPeeringConnection": {
         "Type": "AWS::EC2::VPCPeeringConnection",
         "Properties": {
           "VpcId": {
             "Ref": "vpc"
           },
           "PeerVpcId": {
             "Ref": "PeerVPCId"
           },
           "PeerOwnerId": {
             "Ref": "PeerVPCAccountId"
           },
           "PeerRoleArn": {
             "Ref": "PeerRoleArn"
           }
         }
       }
     },
     "Outputs": {
       "VPCId": {
         "Value": {
           "Ref": "vpc"
         }
       },
       "VPCPeeringConnectionId": {
         "Value": {
           "Ref": "vpcPeeringConnection"
         }
       }
     }
   }
   ```  
**Example YAML**  

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Description: Create a VPC and a VPC Peering connection using the PeerRole to accept.
   Parameters:
     PeerVPCAccountId:
       Type: String
     PeerVPCId:
       Type: String
     PeerRoleArn:
       Type: String
   Resources:
     vpc:
       Type: AWS::EC2::VPC
       Properties:
         CidrBlock: 10.2.0.0/16
         EnableDnsSupport: false
         EnableDnsHostnames: false
         InstanceTenancy: default
     vpcPeeringConnection:
       Type: AWS::EC2::VPCPeeringConnection
       Properties:
         VpcId: !Ref vpc
         PeerVpcId: !Ref PeerVPCId
         PeerOwnerId: !Ref PeerVPCAccountId
         PeerRoleArn: !Ref PeerRoleArn
   Outputs:
     VPCId:
       Value: !Ref vpc
     VPCPeeringConnectionId:
       Value: !Ref vpcPeeringConnection
   ```

1. Pilih **Berikutnya**.

1. Beri nama tumpukan (misalnya, **VPC-peering-connection**).

1. Terima default, dan kemudian pilih **Selanjutnya**.

1. Pilih **Saya mengakui yang CloudFormation mungkin membuat sumber daya IAM**, lalu pilih **Buat** tumpukan.

## Buat template dengan kebijakan yang sangat ketat
<a name="create-template-with-highly-restrictive-policy"></a>

Anda mungkin ingin membuat kebijakan yang sangat ketat untuk mengintip VPC Anda dengan yang lain. Akun AWS

Contoh templat berikut menunjukkan bagaimana mengubah templat pemilik peer VPC (*akun penerima* yang dibuat di Langkah 1 di atas) sehingga lebih ketat.

**Example JSON**  

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Description":"Create a VPC and an assumable role for cross account VPC peering.",
  "Parameters":{
    "PeerRequesterAccountId":{
      "Type":"String"
    }
  },
  "Resources":{
    "peerRole":{
      "Type":"AWS::IAM::Role",
      "Properties":{
        "AssumeRolePolicyDocument":{
          "Statement":[
            {
              "Action":[
                "sts:AssumeRole"
              ],
              "Effect":"Allow",
              "Principal":{
                "AWS":{
                  "Ref":"PeerRequesterAccountId"
                }
              }
            }
          ]
        },
        "Path":"/",
        "Policies":[
          {
            "PolicyDocument":{
              "Statement":[
                {
                  "Action":"ec2:acceptVpcPeeringConnection",
                  "Effect":"Allow",
                  "Resource":{
                    "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}"
                  }
                },
                {
                  "Action":"ec2:acceptVpcPeeringConnection",
                  "Condition":{
                    "StringEquals":{
                      "ec2:AccepterVpc":{
                        "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}"
                      }
                    }
                  },
                  "Effect":"Allow",
                  "Resource":{
                    "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc-peering-connection/*"
                  }
                }
              ],
              "Version":"2012-10-17" 		 	 	 
            },
            "PolicyName":"root"
          }
        ]
      }
    },
    "vpc":{
      "Type":"AWS::EC2::VPC",
      "Properties":{
        "CidrBlock":"10.1.0.0/16",
        "EnableDnsHostnames":false,
        "EnableDnsSupport":false,
        "InstanceTenancy":"default"
      }
    }
  },
  "Outputs":{
    "RoleARN":{
      "Value":{
        "Fn::GetAtt":[
          "peerRole",
          "Arn"
        ]
      }
    },
    "VPCId":{
      "Value":{
        "Ref":"vpc"
      }
    }
  }
}
```

**Example YAML**  

```
AWSTemplateFormatVersion: 2010-09-09
Description: Create a VPC and an assumable role for cross account VPC peering.
Parameters:
  PeerRequesterAccountId:
    Type: String
Resources:
  peerRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - 'sts:AssumeRole'
            Effect: Allow
            Principal:
              AWS:
                Ref: PeerRequesterAccountId
      Path: /
      Policies:
        - PolicyDocument:
            Statement:
              - Action: 'ec2:acceptVpcPeeringConnection'
                Effect: Allow
                Resource:
                  'Fn::Sub': 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
              - Action: 'ec2:acceptVpcPeeringConnection'
                Condition:
                  StringEquals:
                    'ec2:AccepterVpc':
                      'Fn::Sub': 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
                Effect: Allow
                Resource:
                  'Fn::Sub': >-
                    arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc-peering-connection/*
            Version: 2012-10-17 		 	 	 
          PolicyName: root
  vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.1.0.0/16
      EnableDnsHostnames: false
      EnableDnsSupport: false
      InstanceTenancy: default
Outputs:
  RoleARN:
    Value:
      'Fn::GetAtt':
        - peerRole
        - Arn
  VPCId:
    Value:
      Ref: vpc
```

Untuk mengakses VPC, Anda dapat menggunakan templat peminta yang sama seperti pada Langkah 2 di atas.

Untuk informasi selengkapnya, lihat [Identitas dan manajemen akses untuk mengintip VPC di Panduan Peering](https://docs.aws.amazon.com/vpc/latest/peering/security-iam.html) *VPC* Amazon.

# Lakukan blue/green penyebaran ECS melalui penggunaan CodeDeploy CloudFormation
<a name="blue-green"></a>

Untuk memperbarui aplikasi yang berjalan di Amazon Elastic Container Service (Amazon ECS), Anda dapat menggunakan CodeDeploy strategi penyebaran biru/hijau. Strategi ini membantu meminimalkan gangguan yang disebabkan oleh perubahan versi aplikasi. 

Dalam blue/green penerapan, Anda membuat lingkungan aplikasi baru (disebut *hijau*) di samping lingkungan hidup Anda saat ini (disebut sebagai *biru*). Ini memungkinkan Anda untuk memantau dan menguji lingkungan hijau sebelum merutekan lalu lintas langsung dari lingkungan biru ke lingkungan hijau. Setelah lingkungan hijau melayani lalu lintas langsung, Anda dapat dengan aman menghentikan lingkungan biru.

Untuk melakukan penerapan CodeDeploy biru/hijau pada ECS menggunakan CloudFormation, Anda menyertakan informasi berikut dalam template tumpukan Anda:
+ `Hooks`Bagian yang menggambarkan `AWS::CodeDeploy::BlueGreen` kail.
+  `Transform`Bagian yang menentukan `AWS::CodeDeployBlueGreen` transformasi.

Topik berikut memandu Anda melalui pengaturan CloudFormation template untuk penyebaran biru/hijau di ECS.

**Topics**
+ [Tentang blue/green penerapan](about-blue-green-deployments.md)
+ [Pertimbangan saat mengelola penerapan ECS menggunakan blue/green CloudFormation](blue-green-considerations.md)
+ [`AWS::CodeDeploy::BlueGreen`sintaks hook](blue-green-hook-syntax.md)
+ [Contoh template penerapan biru/hijau](blue-green-template-example.md)

# Tentang blue/green penerapan
<a name="about-blue-green-deployments"></a>

Topik ini memberikan ikhtisar tentang cara melakukan blue/green penerapan dengan CloudFormation pekerjaan. Ini juga menjelaskan bagaimana mempersiapkan CloudFormation template Anda untuk penerapan biru/hijau.

**Topics**
+ [Cara kerjanya](#blue-green-how-it-works)
+ [Pembaruan sumber daya yang memulai penerapan hijau](#blue-green-resources)
+ [Menyiapkantemplat](#blue-green-setup)
+ [Memodelkan blue/green penerapan Anda](#blue-green-required)
+ [Set perubahan](#blue-green-changesets)
+ [Memantau peristiwa tumpukan](#blue-green-events)
+ [Izin IAM](#blue-green-iam)

## Cara kerjanya
<a name="blue-green-how-it-works"></a>

Saat menggunakan CloudFormation untuk melakukan blue/green penerapan ECS CodeDeploy, Anda mulai dengan membuat template tumpukan yang menentukan sumber daya untuk lingkungan aplikasi biru dan hijau Anda, termasuk menentukan pengaturan perutean lalu lintas dan stabilisasi yang akan digunakan. Selanjutnya, Anda membuat tumpukan dari template itu. Ini menghasilkan aplikasi biru (saat ini) Anda. CloudFormation hanya membuat sumber daya biru selama pembuatan tumpukan. Sumber daya untuk deployment hijau tidak dibuat hingga diperlukan.

Kemudian, jika di update stack future Anda memperbarui definisi tugas atau sumber daya set tugas dalam aplikasi biru Anda, CloudFormation lakukan hal berikut:
+ Menghasilkan semua sumber daya lingkungan aplikasi hijau yang diperlukan
+ Menggeser lalu lintas berdasarkan parameter perutean lalu lintas yang ditentukan
+ Menghapus sumber daya biru

Jika kesalahan terjadi pada titik mana pun sebelum deployment hijau berhasil dan diselesaikan, CloudFormation menggulung tumpukan kembali ke statusnya sebelum seluruh deployment hijau dimulai.

## Pembaruan sumber daya yang memulai penerapan hijau
<a name="blue-green-resources"></a>

Saat Anda melakukan pembaruan tumpukan yang memperbarui properti tertentu dari sumber daya ECS tertentu, CloudFormation memulai proses penerapan hijau. Sumber daya yang memulai proses ini adalah:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html) 

Namun, jika pembaruan sumber daya ini tidak melibatkan perubahan properti yang memerlukan penggantian, penerapan hijau tidak akan dimulai. Untuk informasi selengkapnya, lihat [Memahami perilaku pembaruan sumber daya tumpukan](using-cfn-updating-stacks-update-behaviors.md).

Penting untuk dicatat bahwa Anda tidak dapat menggabungkan pembaruan ke sumber daya di atas dengan pembaruan ke sumber daya lain dalam operasi pembaruan tumpukan yang sama. Jika Anda perlu memperbarui sumber daya yang terdaftar dan sumber daya lain dalam tumpukan yang sama, Anda memiliki dua opsi:
+ Lakukan dua operasi pembaruan tumpukan terpisah: satu yang hanya mencakup pembaruan ke sumber daya di atas, dan pembaruan tumpukan terpisah yang mencakup perubahan pada sumber daya lainnya.
+ Hapus `Transform` dan `Hooks` bagian dari templat Anda dan kemudian lakukan pembaruan tumpukan. Dalam hal ini, CloudFormation tidak akan melakukan penerapan hijau.

## Mempersiapkan template Anda untuk melakukan penyebaran ECS blue/green
<a name="blue-green-setup"></a>

Untuk mengaktifkan blue/green penerapan pada tumpukan Anda, sertakan bagian berikut dalam template tumpukan Anda sebelum melakukan pembaruan tumpukan.
+ Tambahkan referensi ke `AWS::CodeDeployBlueGreen` ubah ke templat anda:

  ```
  "Transform": [
    "AWS::CodeDeployBlueGreen"
  ],
  ```
+ Tambahkan `Hooks` bagian yang menjalankan `AWS::CodeDeploy::BlueGreen` dan menentukan properti untuk deployment Anda. Untuk informasi selengkapnya, lihat [`AWS::CodeDeploy::BlueGreen`sintaks hook](blue-green-hook-syntax.md).
+ Di bagian `Resources`, tentukan sumber daya biru dan hijau untuk deployment Anda.

Anda dapat menambahkan bagian ini ketika pertama kali membuat templat (yaitu, sebelum membuat tumpukan itu sendiri), atau Anda dapat menambahkannya ke templat yang ada sebelum melakukan pembaruan tumpukan. Jika Anda menentukan blue/green penerapan untuk tumpukan baru, CloudFormation hanya membuat sumber daya biru selama pembuatan tumpukan — sumber daya untuk penerapan hijau tidak dibuat sampai diperlukan selama pembaruan tumpukan.

## Memodelkan blue/green penerapan Anda menggunakan sumber daya CloudFormation
<a name="blue-green-required"></a>

Untuk melakukan penerapan CodeDeploy biru/hijau di ECS, CloudFormation template Anda harus menyertakan sumber daya yang memodelkan penerapan Anda, seperti layanan Amazon ECS dan penyeimbang beban. Untuk rincian lebih lanjut tentang apa yang diwakili sumber daya ini, lihat [Sebelum Anda memulai deployment Amazon ECS](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-steps-ecs.html#deployment-steps-prerequisites-ecs) dalam *AWS CodeDeploy Panduan Pengguna*.


| Persyaratan | Sumber daya | Diperlukan/Opsional | Memulai blue/green penerapan jika diganti? | 
| --- | --- | --- | --- | 
| Kluster Amazon ECS | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html) | Tidak wajib. Klaster default dapat digunakan. | Tidak | 
| Layanan Amazon ECS | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html) | Wajib. | Tidak | 
| Penyeimbang Beban Jaringan atau Aplikasi | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html) | Wajib. | Tidak | 
| Listener produksi | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | Wajib. | Tidak | 
| Uji listener  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | Tidak wajib. | Tidak | 
| Dua grup target | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) | Wajib. | Tidak | 
| Definisi tugas Amazon ECS  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html) | Wajib. | Ya | 
| Wadah untuk aplikasi Amazon ECS Anda | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name) | Wajib. | Tidak | 
| Port untuk set tugas pengganti Anda | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport) | Wajib. | Tidak | 

## Set perubahan
<a name="blue-green-changesets"></a>

Kami sangat menyarankan Anda utnuk membuat perubahan yang ditetapkan sebelum melakukan pembaruan tumpukan yang akan memulai deployment hijau. Ini memungkinkan Anda untuk melihat perubahan aktual yang akan dilakukan pada tumpukan Anda sebelum melakukan pembaruan tumpukan. Sadarilah bahwa perubahan sumber daya mungkin tidak tercantum dalam urutan yang akan dilakukan selama pembaruan tumpukan. Untuk informasi selengkapnya, lihat [Perbarui CloudFormation tumpukan menggunakan set perubahan](using-cfn-updating-stacks-changesets.md).

## Memantau peristiwa tumpukan
<a name="blue-green-events"></a>

Anda dapat melihat peristiwa tumpukan yang dihasilkan pada setiap langkah deployment ECS pada tab **Peristiwa** dari halamn **Tumpukan**, dan menggunakan AWS CLI. Untuk informasi selengkapnya, lihat [Pantau kemajuan tumpukan](monitor-stack-progress.md).

## Izin IAM untuk penerapan blue/green
<a name="blue-green-iam"></a>

Agar berhasil CloudFormation melakukan penerapan biru-hijau, Anda harus memiliki izin berikut: CodeDeploy 
+ `codedeploy:Get*`
+ `codedeploy:CreateCloudFormationDeployment`

Untuk informasi selengkapnya, lihat [Kunci tindakan, sumber daya, dan kondisi CodeDeploy](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awscodedeploy.html) di *Referensi Otorisasi Layanan*.

# Pertimbangan saat mengelola penerapan ECS menggunakan blue/green CloudFormation
<a name="blue-green-considerations"></a>

Proses penggunaan CloudFormation untuk melakukan penyebaran ECS Anda berbeda dari blue/green penerapan CodeDeploy ECS standar yang hanya menggunakan. CodeDeploy *Untuk pemahaman mendetail tentang perbedaan-perbedaan ini, lihat [Perbedaan antara blue/green penerapan Amazon ECS melalui CodeDeploy dan CloudFormation di Panduan](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments-create-ecs-cfn.html#differences-ecs-bg-cfn) Pengguna.AWS CodeDeploy * 

Saat mengelola blue/green penerapan Anda menggunakan CloudFormation, ada batasan dan pertimbangan tertentu yang perlu diingat:
+ Hanya pembaruan ke sumber daya tertentu yang akan memulai penerapan hijau. Untuk informasi selengkapnya, lihat [Pembaruan sumber daya yang memulai penerapan hijau](about-blue-green-deployments.md#blue-green-resources).
+ Anda tidak dapat menyertakan pembaruan ke sumber daya yang memulai penerapan hijau dan pembaruan ke sumber daya lain dalam pembaruan tumpukan yang sama. Untuk informasi selengkapnya, lihat [Pembaruan sumber daya yang memulai penerapan hijau](about-blue-green-deployments.md#blue-green-resources).
+ Anda hanya dapat menentukan layanan ECS tunggal sebagai target deployment.
+ Parameter yang nilainya dikaburkan oleh tidak CloudFormation dapat diperbarui CodeDeploy selama penerapan hijau, dan akan menyebabkan kesalahan dan kegagalan pembaruan tumpukan. Ini termasuk:
  + Parameter didefinisikan dengan `NoEcho` atribut.
  + Parameter yang menggunakan referensi dinamis untuk mengambil nilai-nilainya dari layanan eksternal. Untuk informasi selengkapnya tentang referensi dinamis, lihat[Dapatkan nilai yang disimpan di layanan lain menggunakan referensi dinamis](dynamic-references.md).
+ Untuk membatalkan penerapan hijau yang masih berlangsung, batalkan pembaruan tumpukan di CloudFormation, bukan CodeDeploy atau ECS. Untuk informasi selengkapnya, lihat [Batalkan pembaruan tumpukan](using-cfn-stack-update-cancel.md). Setelah pembaruan selesai, Anda tidak dapat membatalkannya. Namun, Anda dapat memperbarui tumpukan lagi dengan pengaturan sebelumnya.
+  CloudFormation Fitur-fitur berikut saat ini tidak didukung untuk template yang menentukan blue/green penerapan ECS:
  + Mendeklarasikan [output](outputs-section-structure.md) atau menggunakan [Fn:: ImportValue](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html) untuk mengimpor nilai dari tumpukan lain.
  + Mengimpor sumber daya. Untuk informasi selengkapnya tentang mengimpor sumber daya, lihat[Impor AWS sumber daya ke CloudFormation tumpukan](import-resources.md).
  + Menggunakan `AWS::CodeDeploy::BlueGreen` hook dalam template yang menyertakan sumber daya tumpukan bersarang. Untuk informasi lebih lanjut tentang tumpukan bersarang, lihat. [Pisahkan template menjadi potongan-potongan yang dapat digunakan kembali menggunakan tumpukan bersarang](using-cfn-nested-stacks.md)
  + Menggunakan `AWS::CodeDeploy::BlueGreen` hook di tumpukan bersarang.

# `AWS::CodeDeploy::BlueGreen`sintaks hook
<a name="blue-green-hook-syntax"></a>

Sintaks berikut menjelaskan struktur `AWS::CodeDeploy::BlueGreen` hook untuk penyebaran ECS. blue/green 

## Sintaksis
<a name="cfn-blue-green-hook-syntax"></a>

```
"Hooks": {
  "Logical ID": {
    "Type": "AWS::CodeDeploy::BlueGreen",
    "Properties": {
      "TrafficRoutingConfig": {
        "Type": "Traffic routing type",
        "TimeBasedCanary": {
          "StepPercentage": Integer,
          "BakeTimeMins": Integer
        },
        "TimeBasedLinear": {
          "StepPercentage": Integer,
          "BakeTimeMins": Integer
        }
      },
      "AdditionalOptions": {"TerminationWaitTimeInMinutes": Integer},
      "LifecycleEventHooks": {
        "BeforeInstall": "FunctionName",
        "AfterInstall": "FunctionName",
        "AfterAllowTestTraffic": "FunctionName",
        "BeforeAllowTraffic": "FunctionName",
        "AfterAllowTraffic": "FunctionName"
      },
      "ServiceRole": "CodeDeployServiceRoleName",
      "Applications": [
        {
          "Target": {
            "Type": "AWS::ECS::Service",
            "LogicalID": "Logical ID of AWS::ECS::Service"
          },
          "ECSAttributes": {
            "TaskDefinitions": [
              "Logical ID of AWS::ECS::TaskDefinition (Blue)",
              "Logical ID of AWS::ECS::TaskDefinition (Green)"
            ],
            "TaskSets": [
              "Logical ID of AWS::ECS::TaskSet (Blue)",
              "Logical ID of AWS::ECS::TaskSet (Green)"
            ],
            "TrafficRouting": {
              "ProdTrafficRoute": {
                "Type": "AWS::ElasticLoadBalancingV2::Listener",
                "LogicalID": "Logical ID of AWS::ElasticLoadBalancingV2::Listener (Production)"
              },
              "TestTrafficRoute": {
                "Type": "AWS::ElasticLoadBalancingV2::Listener",
                "LogicalID": "Logical ID of AWS::ElasticLoadBalancingV2::Listener (Test)"
              },
              "TargetGroups": [
                "Logical ID of AWS::ElasticLoadBalancingV2::TargetGroup (Blue)",
                "Logical ID of AWS::ElasticLoadBalancingV2::TargetGroup (Green)"
              ]
            }
          }
        }
      ]
    }
  }
}
```

## Sifat-sifat
<a name="cfn-blue-green-hook-properties"></a>

Logical ID (juga disebut *nama logis*)  
ID logis dari hook dideklarasikan di `Hooks` bagian template. ID logis harus berupa alfanumerik (A-Za-z0-9) dan unik dalam templat.  
*Wajib*: Ya    
`Type`  
Jenis kait. `AWS::CodeDeploy::BlueGreen`  
*Wajib*: Ya  
`Properties`  
Properti kait.  
*Wajib*: Ya    
`TrafficRoutingConfig`  
Pengaturan konfigurasi perutean lalu lintas.  
*Wajib*: Tidak  
Konfigurasi default adalah pergeseran lalu lintas Canary berbasis waktu, dengan persentase langkah 15% dan waktu menanam lima menit.    
`Type`  
Jenis pergeseran lalu lintas yang digunakan oleh konfigurasi deployment.  
Nilai yang valid: AllAtOnce \$1 TimeBasedCanary \$1 TimeBasedLinear  
*Wajib*: Ya    
`TimeBasedCanary`  
Menentukan konfigurasi yang menggeser lalu lintas dari satu versi deployment ke versi lain dalam dua tambahan.  
*Wajib*: Bersyarat: Jika Anda menentukan `TimeBasedCanary` sebagai jenis perutean lalu lintas, Anda harus menyertakan parameter. `TimeBasedCanary`    
`StepPercentage`  
Persentase lalu lintas bergeser dalam tambahan pertama `TimeBasedCanary` deployment. Persentase langkah harus 14% atau lebih besar.  
*Wajib*: Tidak  
`BakeTimeMins`  
Jumlah menit antara pergeseran lalu lintas pertama dan kedua dari `TimeBasedCanary` deployment.  
*Wajib*: Tidak  
`TimeBasedLinear`  
Menentukan konfigurasi yang menggeser lalu lintas dari satu versi deployment ke versi lain dalam dua tambahan, dengan jumlah menit yang sama antara setiap tambahan.  
*Wajib*: Bersyarat: Jika Anda menentukan `TimeBasedLinear` sebagai jenis perutean lalu lintas, Anda harus menyertakan parameter. `TimeBasedLinear`    
`StepPercentage`  
Persentase lalu lintas yang bergeser pada awal setiap tambahan `TimeBasedLinear` deployment. Persentase langkah harus 14% atau lebih besar.  
*Wajib*: Tidak  
`BakeTimeMins`  
Jumlah menit antara setiap pergeseran lalu lintas tambahan `TimeBasedLinear` deployment.  
*Wajib*: Tidak  
`AdditionalOptions`  
Opsi tambahan untuk blue/green penyebaran.  
*Wajib*: Tidak    
`TerminationWaitTimeInMinutes`  
Menentukan waktu tunggu, dalam hitungan menit, sebelum mengakhiri sumber daya biru.  
*Wajib*: Tidak  
`LifecycleEventHooks`  
Gunakan kait peristiwa siklus hidup untuk menentukan fungsi Lambda yang CodeDeploy dapat memanggil untuk memvalidasi penerapan. Anda dapat menggunakan fungsi yang sama atau yang berbeda untuk peristiwa deployment siklus hidup. Setelah menyelesaikan tes validasi, fungsi `AfterAllowTraffic` Lambda memanggil CodeDeploy kembali dan memberikan hasil dari atau. `Succeeded` `Failed` Untuk informasi selengkapnya, lihat [bagian AppSpec 'kait'](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html) di *Panduan AWS CodeDeploy Pengguna*.  
*Wajib*: Tidak    
`BeforeInstall`  
Fungsi yang digunakan untuk menjalankan tugas sebelum set tugas pengganti dibuat.  
*Wajib*: Tidak  
`AfterInstall`  
Fungsi yang digunakan untuk menjalankan tugas setelah set tugas pengganti dibuat dan salah satu grup target terkait dengan itu.  
*Wajib*: Tidak  
`AfterAllowTestTraffic`  
Fungsi yang diigunakan untuk menjalankan tugas setelah listener tes melayani lalu lintas ke set tugas pengganti.  
*Wajib*: Tidak  
`BeforeAllowTraffic`  
Fungsi yang digunakan untuk menjalankan tugas setelah grup target kedua dikaitkan dengan set tugas pengganti, tapi sebelum lalu lintas bergeser ke set tugas pengganti.  
*Wajib*: Tidak  
`AfterAllowTraffic`  
Fungsi yang digunakan untuk menjalankan tugas setelah grup target kedua melayani lalu lintas ke set tugas pengganti.  
*Wajib*: Tidak  
`ServiceRole`  
Peran eksekusi untuk digunakan CloudFormation untuk melakukan penyebaran biru-hijau. Untuk daftar izin yang diperlukan, lihat[Izin IAM untuk penerapan blue/green](about-blue-green-deployments.md#blue-green-iam).  
*Wajib*: Tidak  
`Applications`  
Menentukan properti aplikasi Amazon ECS.  
*Wajib*: Ya    
`Target`  
  
*Wajib*: Ya    
`Type`  
Jenis sumber daya.  
*Wajib*: Ya  
`LogicalID`  
ID logis sumber daya.  
*Wajib*: Ya  
`ECSAttributes`  
Sumber daya yang mewakili berbagai persyaratan deployment aplikasi Amazon ECS Anda.  
*Wajib*: Ya    
`TaskDefinitions`  
ID logis [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html) sumber daya untuk menjalankan kontainer Docker yang berisi aplikasi Amazon ECS Anda.  
*Wajib*: Ya  
`TaskSets`  
Logika IDs sumber [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html)daya untuk digunakan sebagai set tugas untuk aplikasi.  
*Wajib*: Ya  
`TrafficRouting`  
Menentukan sumber daya yang digunakan untuk perutean lalu lintas.  
*Wajib*: Ya    
`ProdTrafficRoute`  
Listener yang akan digunakan oleh penyeimbangan beban Anda untuk mengarahkan lalu lintas ke grup target Anda.  
*Wajib*: Ya    
`Type`  
Jenis sumber daya. `AWS::ElasticLoadBalancingV2::Listener`  
*Wajib*: Ya  
`LogicalID`  
ID logis sumber daya.  
*Wajib*: Ya  
`TestTrafficRoute`  
Listener yang akan digunakan oleh penyeimbangan beban Anda untuk mengarahkan lalu lintas ke grup target Anda.  
*Wajib*: Ya    
`Type`  
Jenis sumber daya. `AWS::ElasticLoadBalancingV2::Listener`  
*Wajib*: Ya  
`LogicalID`  
ID logis sumber daya.  
*Wajib*: Tidak  
`TargetGroups`  
ID logis sumber daya yang digunakan sebagai grup target untuk merutekan lalu lintas ke target terdaftar.  
*Wajib*: Ya

# Contoh template penerapan biru/hijau
<a name="blue-green-template-example"></a>

Contoh template berikut menyiapkan penyebaran CodeDeploy biru/hijau di ECS, dengan kemajuan perutean lalu lintas 15 persen per langkah dan periode stabilisasi 5 menit antara setiap langkah. 

Membuat tumpukan dengan template akan menyediakan konfigurasi awal penerapan. Jika Anda kemudian membuat perubahan pada properti di `BlueTaskSet` sumber daya yang mengharuskan sumber daya diganti, maka CloudFormation akan memulai penerapan hijau sebagai bagian dari pembaruan tumpukan.

## JSON
<a name="blue-green-template-example.json"></a>

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Parameters":{
    "Vpc":{ "Type":"AWS::EC2::VPC::Id" },
    "Subnet1":{ "Type":"AWS::EC2::Subnet::Id" },
    "Subnet2":{ "Type":"AWS::EC2::Subnet::Id" }
  },
  "Transform":[ "AWS::CodeDeployBlueGreen" ],
  "Hooks":{
    "CodeDeployBlueGreenHook":{
      "Type":"AWS::CodeDeploy::BlueGreen",
      "Properties":{
        "TrafficRoutingConfig":{
          "Type":"TimeBasedCanary",
          "TimeBasedCanary":{
            "StepPercentage":15,
            "BakeTimeMins":5
          }
        },
        "Applications":[
          {
            "Target":{
              "Type":"AWS::ECS::Service",
              "LogicalID":"ECSDemoService"
            },
            "ECSAttributes":{
              "TaskDefinitions":[ "BlueTaskDefinition","GreenTaskDefinition" ],
              "TaskSets":[ "BlueTaskSet","GreenTaskSet" ],
              "TrafficRouting":{
                "ProdTrafficRoute":{
                  "Type":"AWS::ElasticLoadBalancingV2::Listener",
                  "LogicalID":"ALBListenerProdTraffic"
                },
                "TargetGroups":[ "ALBTargetGroupBlue","ALBTargetGroupGreen" ]
              }
            }
          }
        ]
      }
    }
  },
  "Resources":{
    "ExampleSecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"Security group for ec2 access",
        "VpcId":{ "Ref":"Vpc" },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "CidrIp":"0.0.0.0/0"
          },
          {
            "IpProtocol":"tcp",
            "FromPort":8080,
            "ToPort":8080,
            "CidrIp":"0.0.0.0/0"
          },
          {
            "IpProtocol":"tcp",
            "FromPort":22,
            "ToPort":22,
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
    },
    "ALBTargetGroupBlue":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":5,
        "HealthCheckPath":"/",
        "HealthCheckPort":"80",
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":2,
        "HealthyThresholdCount":2,
        "Matcher":{ "HttpCode":"200" },
        "Port":80,
        "Protocol":"HTTP",
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "TargetType":"ip",
        "UnhealthyThresholdCount":4,
        "VpcId":{ "Ref":"Vpc" }
      }
    },
    "ALBTargetGroupGreen":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":5,
        "HealthCheckPath":"/",
        "HealthCheckPort":"80",
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":2,
        "HealthyThresholdCount":2,
        "Matcher":{ "HttpCode":"200" },
        "Port":80,
        "Protocol":"HTTP",
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "TargetType":"ip",
        "UnhealthyThresholdCount":4,
        "VpcId":{ "Ref":"Vpc" }
      }
    },
    "ExampleALB":{
      "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties":{
        "Scheme":"internet-facing",
        "SecurityGroups":[{ "Ref":"ExampleSecurityGroup" }],
        "Subnets":[{ "Ref":"Subnet1" },{ "Ref":"Subnet2" }],
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "Type":"application",
        "IpAddressType":"ipv4"
      }
    },
    "ALBListenerProdTraffic":{
      "Type":"AWS::ElasticLoadBalancingV2::Listener",
      "Properties":{
        "DefaultActions":[
          {
            "Type":"forward",
            "ForwardConfig":{
              "TargetGroups":[
                {
                  "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" },
                  "Weight":1
                }
              ]
            }
          }
        ],
        "LoadBalancerArn":{ "Ref":"ExampleALB" },
        "Port":80,
        "Protocol":"HTTP"
      }
    },
    "ALBListenerProdRule":{
      "Type":"AWS::ElasticLoadBalancingV2::ListenerRule",
      "Properties":{
        "Actions":[
          {
            "Type":"forward",
            "ForwardConfig":{
              "TargetGroups":[
                {
                  "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" },
                  "Weight":1
                }
              ]
            }
          }
        ],
        "Conditions":[
          {
            "Field":"http-header",
            "HttpHeaderConfig":{
              "HttpHeaderName":"User-Agent",
              "Values":[ "Mozilla" ]
            }
          }
        ],
        "ListenerArn":{ "Ref":"ALBListenerProdTraffic" },
        "Priority":1
      }
    },
    "ECSTaskExecutionRole":{
      "Type":"AWS::IAM::Role",
      "Properties":{
        "AssumeRolePolicyDocument":{
          "Version": "2012-10-17",		 	 	 
          "Statement":[
            {
              "Sid":"",
              "Effect":"Allow",
              "Principal":{
                "Service":"ecs-tasks.amazonaws.com"
              },
              "Action":"sts:AssumeRole"
            }
          ]
        },
        "ManagedPolicyArns":[ "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" ]
      }
    },
    "BlueTaskDefinition":{
      "Type":"AWS::ECS::TaskDefinition",
      "Properties":{
        "ExecutionRoleArn":{
          "Fn::GetAtt":[ "ECSTaskExecutionRole","Arn" ]
        },
        "ContainerDefinitions":[
          {
            "Name":"DemoApp",
            "Image":"nginxdemos/hello:latest",
            "Essential":true,
            "PortMappings":[
              {
                "HostPort":80,
                "Protocol":"tcp",
                "ContainerPort":80
              }
            ]
          }
        ],
        "RequiresCompatibilities":[ "FARGATE" ],
        "NetworkMode":"awsvpc",
        "Cpu":"256",
        "Memory":"512",
        "Family":"ecs-demo"
      }
    },
    "ECSDemoCluster":{
      "Type":"AWS::ECS::Cluster",
      "Properties":{}
    },
    "ECSDemoService":{
      "Type":"AWS::ECS::Service",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "DesiredCount":1,
        "DeploymentController":{ "Type":"EXTERNAL" }
      }
    },
    "BlueTaskSet":{
      "Type":"AWS::ECS::TaskSet",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "LaunchType":"FARGATE",
        "NetworkConfiguration":{
          "AwsVpcConfiguration":{
            "AssignPublicIp":"ENABLED",
            "SecurityGroups":[{ "Ref":"ExampleSecurityGroup" }],
            "Subnets":[{ "Ref":"Subnet1" },{ "Ref":"Subnet2" }]
          }
        },
        "PlatformVersion":"1.4.0",
        "Scale":{
          "Unit":"PERCENT",
          "Value":100
        },
        "Service":{ "Ref":"ECSDemoService"},
        "TaskDefinition":{ "Ref":"BlueTaskDefinition" },
        "LoadBalancers":[
          {
            "ContainerName":"DemoApp",
            "ContainerPort":80,
            "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" }
          }
        ]
      }
    },
    "PrimaryTaskSet":{
      "Type":"AWS::ECS::PrimaryTaskSet",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "Service":{ "Ref":"ECSDemoService" },
        "TaskSetId":{ "Fn::GetAtt":[ "BlueTaskSet","Id" ]
        }
      }
    }
  }
}
```

## YAML
<a name="blue-green-template-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  Vpc:
    Type: AWS::EC2::VPC::Id
  Subnet1:
    Type: AWS::EC2::Subnet::Id
  Subnet2:
    Type: AWS::EC2::Subnet::Id
Transform:
  - 'AWS::CodeDeployBlueGreen'
Hooks:
  CodeDeployBlueGreenHook:
    Type: AWS::CodeDeploy::BlueGreen
    Properties:
      TrafficRoutingConfig:
        Type: TimeBasedCanary
        TimeBasedCanary:
          StepPercentage: 15
          BakeTimeMins: 5
      Applications:
        - Target:
            Type: AWS::ECS::Service
            LogicalID: ECSDemoService
          ECSAttributes:
            TaskDefinitions:
              - BlueTaskDefinition
              - GreenTaskDefinition
            TaskSets:
              - BlueTaskSet
              - GreenTaskSet
            TrafficRouting:
              ProdTrafficRoute:
                Type: AWS::ElasticLoadBalancingV2::Listener
                LogicalID: ALBListenerProdTraffic
              TargetGroups:
                - ALBTargetGroupBlue
                - ALBTargetGroupGreen
Resources:
  ExampleSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for ec2 access
      VpcId: !Ref Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 8080
          ToPort: 8080
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  ALBTargetGroupBlue:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 5
      HealthCheckPath: /
      HealthCheckPort: '80'
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 2
      HealthyThresholdCount: 2
      Matcher:
        HttpCode: '200'
      Port: 80
      Protocol: HTTP
      Tags:
        - Key: Group
          Value: Example
      TargetType: ip
      UnhealthyThresholdCount: 4
      VpcId: !Ref Vpc
  ALBTargetGroupGreen:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 5
      HealthCheckPath: /
      HealthCheckPort: '80'
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 2
      HealthyThresholdCount: 2
      Matcher:
        HttpCode: '200'
      Port: 80
      Protocol: HTTP
      Tags:
        - Key: Group
          Value: Example
      TargetType: ip
      UnhealthyThresholdCount: 4
      VpcId: !Ref Vpc
  ExampleALB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      SecurityGroups:
        - !Ref ExampleSecurityGroup
      Subnets:
        - !Ref Subnet1
        - !Ref Subnet2
      Tags:
        - Key: Group
          Value: Example
      Type: application
      IpAddressType: ipv4
  ALBListenerProdTraffic:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ALBTargetGroupBlue
                Weight: 1
      LoadBalancerArn: !Ref ExampleALB
      Port: 80
      Protocol: HTTP
  ALBListenerProdRule:
    Type: AWS::ElasticLoadBalancingV2::ListenerRule
    Properties:
      Actions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ALBTargetGroupBlue
                Weight: 1
      Conditions:
        - Field: http-header
          HttpHeaderConfig:
            HttpHeaderName: User-Agent
            Values:
              - Mozilla
      ListenerArn: !Ref ALBListenerProdTraffic
      Priority: 1
  ECSTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: ''
            Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'
  BlueTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ExecutionRoleArn: !GetAtt 
        - ECSTaskExecutionRole
        - Arn
      ContainerDefinitions:
        - Name: DemoApp
          Image: 'nginxdemos/hello:latest'
          Essential: true
          PortMappings:
            - HostPort: 80
              Protocol: tcp
              ContainerPort: 80
      RequiresCompatibilities:
        - FARGATE
      NetworkMode: awsvpc
      Cpu: '256'
      Memory: '512'
      Family: ecs-demo
  ECSDemoCluster:
    Type: AWS::ECS::Cluster
    Properties: {}
  ECSDemoService:
    Type: AWS::ECS::Service
    Properties:
      Cluster: !Ref ECSDemoCluster
      DesiredCount: 1
      DeploymentController:
        Type: EXTERNAL
  BlueTaskSet:
    Type: AWS::ECS::TaskSet
    Properties:
      Cluster: !Ref ECSDemoCluster
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsVpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - !Ref ExampleSecurityGroup
          Subnets:
            - !Ref Subnet1
            - !Ref Subnet2
      PlatformVersion: 1.4.0
      Scale:
        Unit: PERCENT
        Value: 100
      Service: !Ref ECSDemoService
      TaskDefinition: !Ref BlueTaskDefinition
      LoadBalancers:
        - ContainerName: DemoApp
          ContainerPort: 80
          TargetGroupArn: !Ref ALBTargetGroupBlue
  PrimaryTaskSet:
    Type: AWS::ECS::PrimaryTaskSet
    Properties:
      Cluster: !Ref ECSDemoCluster
      Service: !Ref ECSDemoService
      TaskSetId: !GetAtt 
        - BlueTaskSet
        - Id
```

# CloudFormation cuplikan template
<a name="template-snippets"></a>

Bagian ini menyediakan sejumlah contoh skenario yang dapat Anda gunakan untuk memahami cara menyatakan berbagai bagian templat CloudFormation . Anda juga dapat menggunakan cuplikan sebagai titik awal untuk bagian templat kustom Anda.

**Topics**
+ [Snippet templat umum](quickref-general.md)
+ [Cuplikan CloudFormation templat penskalaan otomatis](quickref-autoscaling.md)
+ [AWS Cuplikan templat Konsol Penagihan](quickref-billingconductor.md)
+ [CloudFormation cuplikan template](quickref-cloudformation.md)
+ [Cuplikan CloudFront template Amazon](quickref-cloudfront.md)
+ [Cuplikan CloudWatch template Amazon](quickref-cloudwatch.md)
+ [Cuplikan templat Amazon CloudWatch Log](quickref-cloudwatchlogs.md)
+ [Cuplikan template Amazon DynamoDB](quickref-dynamodb.md)
+ [Cuplikan EC2 CloudFormation template Amazon](quickref-ec2.md)
+ [Templat contoh Layanan Kontainer Elastis Amazon](quickref-ecs.md)
+ [Templat Contoh Sistem File Elastis Amazon](quickref-efs.md)
+ [Cuplikan templat Elastic Beanstalk](quickref-elasticbeanstalk.md)
+ [Cuplikan templat Elastic Load Balancing](quickref-elb.md)
+ [AWS Identity and Access Management cuplikan template](quickref-iam.md)
+ [AWS Lambda Template](quickref-lambda.md)
+ [Cuplikan template Amazon Redshift](quickref-redshift.md)
+ [Cuplikan template Amazon RDS](quickref-rds.md)
+ [Cuplikan templat Route 53](quickref-route53.md)
+ [Cuplikan template Amazon S3](quickref-s3.md)
+ [Cuplikan template Amazon SNS](quickref-sns.md)
+ [Cuplikan template Amazon SQS](scenario-sqs-queue.md)
+ [Cuplikan template Amazon Timestream](scenario-timestream-queue.md)

# Snippet templat umum
<a name="quickref-general"></a>

Contoh berikut menunjukkan fitur CloudFormation template berbeda yang tidak spesifik untuk AWS layanan.

**Topics**
+ [Base64properti dikodekan UserData](#scenario-userdata-base64)
+ [Base64UserDataproperti yang dikodekan dengan dan AccessKey SecretKey](#scenario-userdata-base64-with-keys)
+ [Parametersbagian dengan satu parameter string literal](#scenario-one-string-parameter)
+ [Parametersbagian dengan parameter string dengan kendala ekspresi reguler](#scenario-constraint-string-parameter)
+ [Parametersbagian dengan parameter angka dengan MinValue dan MaxValue kendala](#scenario-one-number-min-parameter)
+ [Parametersbagian dengan parameter angka dengan AllowedValues kendala](#scenario-one-number-parameter)
+ [Parametersbagian dengan satu CommaDelimitedList parameter literal](#scenario-one-list-parameter)
+ [Parametersbagian dengan nilai parameter berdasarkan parameter semu](#scenario-one-pseudo-parameter)
+ [Mappingbagian dengan tiga pemetaan](#scenario-mapping-with-four-maps)
+ [Descriptionberdasarkan string literal](#scenario-description-from-literal-string)
+ [Outputsbagian dengan satu output string literal](#scenario-output-with-literal-string)
+ [Outputsbagian dengan satu referensi sumber daya dan satu output referensi semu](#scenario-output-with-ref-and-pseudo-ref)
+ [Outputsbagian dengan output berdasarkan fungsi, string literal, referensi, dan parameter semu](#scenario-output-with-complex-spec)
+ [Versi format templat](#scenario-format-version)
+ [AWS Tagsproperti](#scenario-format-aws-tag)

## Base64properti dikodekan UserData
<a name="scenario-userdata-base64"></a>

Contoh ini menunjukkan perakitan `UserData` properti menggunakan `Fn::Base64` dan `Fn::Join` fungsi. Referensi `MyValue` dan `MyName` merupakan parameter yang harus ditentukan di `Parameters` bagian template. String literal `Hello World` hanyalah nilai lain yang diberikan contoh ini sebagai bagian dari `UserData`.

### JSON
<a name="quickref-general-example-1.json"></a>

```
1. "UserData" : {
2.     "Fn::Base64" : {
3.         "Fn::Join" : [ ",", [
4.             { "Ref" : "MyValue" },
5.             { "Ref" : "MyName" },
6.             "Hello World" ] ]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-1.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      Ref: MyValue
4.      Ref: MyName
5.      Hello World
```

## Base64UserDataproperti yang dikodekan dengan dan AccessKey SecretKey
<a name="scenario-userdata-base64-with-keys"></a>

Contoh ini menunjukkan perakitan `UserData` properti menggunakan `Fn::Base64` dan `Fn::Join` fungsi. Ini menyertakan informasi `AccessKey` dan `SecretKey`. Referensi `AccessKey` dan `SecretKey` adalah parameter yang harus ditentukan di bagian Parameter dari templat.

### JSON
<a name="quickref-general-example-2.json"></a>

```
1. "UserData" : {
2.     "Fn::Base64" : {
3.         "Fn::Join" : [ "", [
4.             "ACCESS_KEY=", { "Ref" : "AccessKey" },
5.             "SECRET_KEY=", { "Ref" : "SecretKey" } ]
6.         ]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-2.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      ACCESS_KEY=${AccessKey}
4.      SECRET_KEY=${SecretKey}
```

## Parametersbagian dengan satu parameter string literal
<a name="scenario-one-string-parameter"></a>

Contoh berikut menggambarkan pernyataan bagian Parameter yang valid di mana parameter tipe `String` tunggal dinyatakan.

### JSON
<a name="quickref-general-example-3.json"></a>

```
1. "Parameters" : {
2.     "UserName" : {
3.         "Type" : "String",
4.         "Default" : "nonadmin",
5.         "Description" : "Assume a vanilla user if no command-line spec provided"
6.     }
7. }
```

### YAML
<a name="quickref-general-example-3.yaml"></a>

```
1. Parameters:
2.   UserName:
3.     Type: String
4.     Default: nonadmin
5.     Description: Assume a vanilla user if no command-line spec provided
```

## Parametersbagian dengan parameter string dengan kendala ekspresi reguler
<a name="scenario-constraint-string-parameter"></a>

Contoh berikut menggambarkan pernyataan bagian Parameter yang valid di mana parameter tipe `String` tunggal dinyatakan. `AdminUserAccount`Parameter memiliki default`admin`. Nilai parameter harus memiliki panjang minimum 1, panjang maksimum 16, dan berisi karakter abjad dan angka tetapi harus dimulai dengan karakter abjad.

### JSON
<a name="quickref-general-example-4.json"></a>

```
 1. "Parameters" : {
 2.     "AdminUserAccount": {
 3.       "Default": "admin",
 4.       "NoEcho": "true",
 5.       "Description" : "The admin account user name",
 6.       "Type": "String",
 7.       "MinLength": "1",
 8.       "MaxLength": "16",
 9.       "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*"
10.     }
11. }
```

### YAML
<a name="quickref-general-example-4.yaml"></a>

```
1. Parameters:
2.   AdminUserAccount:
3.     Default: admin
4.     NoEcho: true
5.     Description: The admin account user name
6.     Type: String
7.     MinLength: 1
8.     MaxLength: 16
9.     AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
```

## Parametersbagian dengan parameter angka dengan MinValue dan MaxValue kendala
<a name="scenario-one-number-min-parameter"></a>

Contoh berikut menggambarkan pernyataan bagian Parameter yang valid di mana parameter tipe `Number` tunggal dinyatakan. `WebServerPort`Parameter memiliki default 80 dan nilai minimum 1 dan nilai maksimum 65535.

### JSON
<a name="quickref-general-example-5.json"></a>

```
1. "Parameters" : {
2.     "WebServerPort": {
3.       "Default": "80",
4.       "Description" : "TCP/IP port for the web server",
5.       "Type": "Number",
6.       "MinValue": "1",
7.       "MaxValue": "65535"
8.     }
9. }
```

### YAML
<a name="quickref-general-example-5.yaml"></a>

```
1. Parameters:
2.   WebServerPort:
3.     Default: 80
4.     Description: TCP/IP port for the web server
5.     Type: Number
6.     MinValue: 1
7.     MaxValue: 65535
```

## Parametersbagian dengan parameter angka dengan AllowedValues kendala
<a name="scenario-one-number-parameter"></a>

Contoh berikut menggambarkan pernyataan bagian Parameter yang valid di mana parameter tipe `Number` tunggal dinyatakan. `WebServerPort`Parameter memiliki default 80 dan hanya memungkinkan nilai 80 dan 8888.

### JSON
<a name="quickref-general-example-6.json"></a>

```
1. "Parameters" : {
2.     "WebServerPortLimited": {
3.       "Default": "80",
4.       "Description" : "TCP/IP port for the web server",
5.       "Type": "Number",
6.       "AllowedValues" : ["80", "8888"]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-6.yaml"></a>

```
1. Parameters:
2.   WebServerPortLimited:
3.     Default: 80
4.     Description: TCP/IP port for the web server
5.     Type: Number
6.     AllowedValues:
7.     - 80
8.     - 8888
```

## Parametersbagian dengan satu CommaDelimitedList parameter literal
<a name="scenario-one-list-parameter"></a>

Contoh berikut menggambarkan deklarasi `Parameters` bagian yang valid di mana parameter `CommaDelimitedList` tipe tunggal dideklarasikan. `NoEcho`Properti diatur ke`TRUE`, yang akan menutupi nilainya dengan tanda bintang (\$1\$1\$1\$1\$1) dalam **describe-stacks** output, kecuali untuk informasi yang disimpan di lokasi yang ditentukan di bawah ini.

**penting**  
Menggunakan `NoEcho` atribut tidak menutupi informasi apa pun yang disimpan sebagai berikut:  
Bagian `Metadata` template. CloudFormation tidak mengubah, memodifikasi, atau menyunting informasi apa pun yang Anda sertakan di `Metadata` bagian ini. Untuk informasi selengkapnya, lihat [Metadata](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
Bagian `Outputs` template. Untuk informasi lebih lanjut, lihat [Output](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
`Metadata`Atribut definisi sumber daya. Untuk informasi lebih lanjut, lihat [Atribut `Metadata`](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Kami sangat menyarankan Anda untuk tidak menggunakan mekanisme ini untuk memasukkan informasi sensitif, seperti kata sandi atau rahasia.

**penting**  
Daripada menyematkan informasi sensitif secara langsung di CloudFormation template Anda, kami sarankan Anda menggunakan parameter dinamis dalam template tumpukan untuk mereferensikan informasi sensitif yang disimpan dan dikelola di luar CloudFormation, seperti di AWS Systems Manager Parameter Store atau AWS Secrets Manager.  
Untuk informasi selengkapnya, lihat Do [not embed credentials dalam praktik terbaik template Anda](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).

### JSON
<a name="quickref-general-example-7.json"></a>

```
1. "Parameters" : {
2.     "UserRoles" : {
3.         "Type" : "CommaDelimitedList",
4.         "Default" : "guest,newhire",
5.         "NoEcho" : "TRUE"
6.     }
7. }
```

### YAML
<a name="quickref-general-example-7.yaml"></a>

```
1. Parameters:
2.   UserRoles:
3.     Type: CommaDelimitedList
4.     Default: "guest,newhire"
5.     NoEcho: true
```

## Parametersbagian dengan nilai parameter berdasarkan parameter semu
<a name="scenario-one-pseudo-parameter"></a>

Contoh berikut menunjukkan perintah dalam data pengguna EC2 yang menggunakan `AWS::StackName` dan `AWS::Region` parameter semu. Untuk informasi selengkapnya tentang parameter semu, lihat[Dapatkan AWS nilai menggunakan parameter semu](pseudo-parameter-reference.md).

### JSON
<a name="quickref-general-example-10.json"></a>

```
 1.           "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
 2.              "#!/bin/bash -xe\n",
 3.              "yum install -y aws-cfn-bootstrap\n",
 4. 
 5.              "/opt/aws/bin/cfn-init -v ",
 6.              "         --stack ", { "Ref" : "AWS::StackName" },
 7.              "         --resource LaunchConfig ",
 8.              "         --region ", { "Ref" : "AWS::Region" }, "\n",
 9. 
10.              "/opt/aws/bin/cfn-signal -e $? ",
11.              "         --stack ", { "Ref" : "AWS::StackName" },
12.              "         --resource WebServerGroup ",
13.              "         --region ", { "Ref" : "AWS::Region" }, "\n"
14.         ]]}}
15.       }
```

### YAML
<a name="quickref-general-example-10.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      #!/bin/bash -xe
4.      yum update -y aws-cfn-bootstrap
5.      /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --region ${AWS::Region}
6.      /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
```

## Mappingbagian dengan tiga pemetaan
<a name="scenario-mapping-with-four-maps"></a>

Contoh berikut menggambarkan deklarasi `Mapping` bagian yang valid yang berisi tiga pemetaan. Peta tersebut, ketika dicocokkan dengan kunci pemetaan `Stop`, `SlowDown`, atau `Go`, menyediakan nilai-nilai RGB yang ditetapkan untuk atribut `RGBColor` terkait.

### JSON
<a name="quickref-general-example-11.json"></a>

```
 1. "Mappings" : {
 2.     "LightColor" : {
 3.         "Stop" : {
 4.             "Description" : "red",
 5.             "RGBColor" : "RED 255 GREEN 0 BLUE 0"
 6.         },
 7.         "SlowDown" : {
 8.             "Description" : "yellow",
 9.             "RGBColor" : "RED 255 GREEN 255 BLUE 0"
10.         },
11.         "Go" : {
12.             "Description" : "green",
13.             "RGBColor" : "RED 0 GREEN 128 BLUE 0"
14.         }
15.     }
16. }
```

### YAML
<a name="quickref-general-example-11.yaml"></a>

```
 1. Mappings:
 2.   LightColor:
 3.     Stop:
 4.       Description: red
 5.       RGBColor: "RED 255 GREEN 0 BLUE 0"
 6.     SlowDown:
 7.       Description: yellow
 8.       RGBColor: "RED 255 GREEN 255 BLUE 0"
 9.     Go:
10.       Description: green
11.       RGBColor: "RED 0 GREEN 128 BLUE 0"
```

## Descriptionberdasarkan string literal
<a name="scenario-description-from-literal-string"></a>

Contoh berikut menggambarkan deklarasi `Description` bagian yang valid di mana nilai didasarkan pada string literal. Snippet ini bisa untuk templat, parameter, sumber daya, properti, atau output.

### JSON
<a name="quickref-general-example-8.json"></a>

```
1. "Description" : "Replace this value"
```

### YAML
<a name="quickref-general-example-8.yaml"></a>

```
1. Description: "Replace this value"
```

## Outputsbagian dengan satu output string literal
<a name="scenario-output-with-literal-string"></a>

Contoh ini menunjukkan tugas output berdasarkan string literal.

### JSON
<a name="quickref-general-example-12.json"></a>

```
1. "Outputs" : {
2.     "MyPhone" : {
3.         "Value" : "Please call 555-5555",
4.         "Description" : "A random message for aws cloudformation describe-stacks"
5.     }
6. }
```

### YAML
<a name="quickref-general-example-12.yaml"></a>

```
1. Outputs:
2.   MyPhone:
3.     Value: Please call 555-5555
4.     Description: A random message for aws cloudformation describe-stacks
```

## Outputsbagian dengan satu referensi sumber daya dan satu output referensi semu
<a name="scenario-output-with-ref-and-pseudo-ref"></a>

Contoh ini menunjukkan `Outputs` bagian dengan dua tugas keluaran. Salah satunya didasarkan pada sumber daya, dan yang lainnya didasarkan pada referensi semu.

### JSON
<a name="quickref-general-example-13.json"></a>

```
1. "Outputs" : {
2.    "SNSTopic" : { "Value" : { "Ref" : "MyNotificationTopic" } },
3.    "StackName" : { "Value" : { "Ref" : "AWS::StackName" } }
4. }
```

### YAML
<a name="quickref-general-example-13.yaml"></a>

```
1. Outputs:
2.   SNSTopic:
3.     Value: !Ref MyNotificationTopic
4.   StackName:
5.     Value: !Ref AWS::StackName
```

## Outputsbagian dengan output berdasarkan fungsi, string literal, referensi, dan parameter semu
<a name="scenario-output-with-complex-spec"></a>

Contoh ini menunjukkan bagian Output dengan satu tugas output. Fungsi Join digunakan untuk menggabungkan nilai, menggunakan tanda persen sebagai pembatas.

### JSON
<a name="quickref-general-example-14.json"></a>

```
1. "Outputs" : {
2.     "MyOutput" : {
3.         "Value" : { "Fn::Join" :
4.             [ "%", [ "A-string", {"Ref" : "AWS::StackName" } ] ]
5.         }
6.     }
7. }
```

### YAML
<a name="quickref-general-example-14.yaml"></a>

```
1. Outputs:
2.   MyOutput:
3.     Value: !Join [ %, [ 'A-string', !Ref 'AWS::StackName' ]]
```

## Versi format templat
<a name="scenario-format-version"></a>

Cuplikan berikut menggambarkan deklarasi bagian yang valid`AWSTemplateFormatVersion`.

### JSON
<a name="quickref-general-example-9.json"></a>

```
1. "AWSTemplateFormatVersion" : "2010-09-09"
```

### YAML
<a name="quickref-general-example-9.yaml"></a>

```
1. AWSTemplateFormatVersion: '2010-09-09'
```

## AWS Tagsproperti
<a name="scenario-format-aws-tag"></a>

Contoh ini menunjukkan AWS `Tags` properti. Anda akan menentukan properti ini di dalam bagian Properti dari sumber daya. Ketika sumber daya dibuat, sumber daya tersebut akan ditandai dengan tanda yang Anda nyatakan.

### JSON
<a name="quickref-general-example-15.json"></a>

```
 1. "Tags" : [
 2.       {
 3.         "Key" : "keyname1",
 4.         "Value" : "value1"
 5.       },
 6.       {
 7.         "Key" : "keyname2",
 8.         "Value" : "value2"
 9.       }
10.     ]
```

### YAML
<a name="quickref-general-example-15.yaml"></a>

```
1. Tags: 
2.   - 
3.     Key: "keyname1"
4.     Value: "value1"
5.   - 
6.     Key: "keyname2"
7.     Value: "value2"
```

# Cuplikan CloudFormation templat penskalaan otomatis
<a name="quickref-autoscaling"></a>

Dengan Amazon EC2 Auto Scaling, Anda dapat secara otomatis menskalakan EC2 instans Amazon, baik dengan kebijakan penskalaan atau dengan penskalaan terjadwal. Grup Auto Scaling adalah kumpulan EC2 instans Amazon yang memungkinkan penskalaan otomatis dan fitur pengelolaan armada, seperti kebijakan penskalaan, tindakan terjadwal, pemeriksaan kesehatan, kait siklus hidup, dan penyeimbangan beban. 

Application Auto Scaling menyediakan penskalaan otomatis berbagai sumber daya di luar Amazon EC2, baik dengan kebijakan penskalaan atau dengan penskalaan terjadwal.

Anda dapat membuat dan mengonfigurasi grup Auto Scaling, kebijakan penskalaan, tindakan terjadwal, dan sumber daya penskalaan otomatis lainnya sebagai bagian dari infrastruktur menggunakan templat. CloudFormation Template memudahkan pengelolaan dan otomatisasi penyebaran sumber daya penskalaan otomatis secara berulang dan konsisten. 

Contoh cuplikan template berikut menjelaskan CloudFormation sumber daya atau komponen untuk Amazon Auto EC2 Scaling dan Application Auto Scaling. Cuplikan ini dirancang untuk diintegrasikan ke dalam template dan tidak dimaksudkan untuk dijalankan secara independen.

**Topics**
+ [Konfigurasikan sumber daya Amazon EC2 Auto Scaling](quickref-ec2-auto-scaling.md)
+ [Konfigurasikan sumber daya Application Auto Scaling](quickref-application-auto-scaling.md)

# Konfigurasikan sumber daya Amazon EC2 Auto Scaling dengan CloudFormation
<a name="quickref-ec2-auto-scaling"></a>

Contoh berikut menunjukkan cuplikan berbeda untuk disertakan dalam templat untuk digunakan dengan Amazon EC2 Auto Scaling.

**Topics**
+ [Buat satu contoh grup Auto Scaling](#scenario-single-instance-as-group)
+ [Buat grup Auto Scaling dengan penyeimbang beban terlampir](#scenario-as-group)
+ [Buat grup Auto Scaling dengan notifikasi](#scenario-as-notification)
+ [Buat grup Auto Scaling yang menggunakan a dan `CreationPolicy` `UpdatePolicy`](#scenario-as-updatepolicy)
+ [Membuat kebijakan penskalaan langkah](#scenario-step-scaling-policy)
+ [Contoh kelompok contoh campuran](#scenario-mixed-instances-group-template-examples)
+ [Luncurkan contoh konfigurasi](#scenario-launch-config-template-examples)

## Buat satu contoh grup Auto Scaling
<a name="scenario-single-instance-as-group"></a>

Contoh ini menunjukkan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)sumber daya dengan satu instance untuk membantu Anda memulai. `VPCZoneIdentifier`Properti grup Auto Scaling menentukan daftar subnet yang ada di tiga Availability Zone yang berbeda. Anda harus menentukan subnet yang berlaku IDs dari akun Anda sebelum Anda membuat tumpukan Anda. `LaunchTemplate`Properti mereferensikan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)sumber daya dengan nama logis `myLaunchTemplate` yang didefinisikan di tempat lain dalam template Anda.

**catatan**  
Untuk contoh templat peluncuran, lihat [Buat template peluncuran dengan CloudFormation](quickref-ec2-launch-templates.md) di bagian cuplikan Amazon EC2 dan bagian [Contoh di sumber daya](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples). `AWS::EC2::LaunchTemplate`

### JSON
<a name="quickref-autoscaling-example-1.json"></a>

```
 1. "myASG" : {
 2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.    "Properties" : {
 4.       "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
 5.       "LaunchTemplate" : {
 6.         "LaunchTemplateId" : {
 7.           "Ref" : "myLaunchTemplate"
 8.         },
 9.         "Version" : {
10.           "Fn::GetAtt" : [
11.             "myLaunchTemplate",
12.             "LatestVersionNumber"
13.           ]
14.         }
15.       },
16.       "MaxSize" : "1",
17.       "MinSize" : "1"
18.    }
19. }
```

### YAML
<a name="quickref-autoscaling-example-1.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - subnetIdAz1
 6.       - subnetIdAz2
 7.       - subnetIdAz3
 8.     LaunchTemplate:
 9.       LaunchTemplateId: !Ref myLaunchTemplate
10.       Version: !GetAtt myLaunchTemplate.LatestVersionNumber
11.     MaxSize: '1'
12.     MinSize: '1'
```

## Buat grup Auto Scaling dengan penyeimbang beban terlampir
<a name="scenario-as-group"></a>

Contoh ini menunjukkan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)sumber daya untuk load balancing melalui beberapa server. Ini menentukan nama logis AWS sumber daya yang dinyatakan di tempat lain dalam template yang sama.

1. `VPCZoneIdentifier`Properti menentukan nama logis dari dua [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html)sumber daya tempat instans EC2 grup Auto Scaling akan dibuat: dan. `myPublicSubnet1` `myPublicSubnet2`

1. `LaunchTemplate`Properti menentukan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)sumber daya dengan nama `myLaunchTemplate` logis.

1. `TargetGroupARNs`Properti mencantumkan grup target untuk Application Load Balancer atau Network Load Balancer yang digunakan untuk merutekan lalu lintas ke grup Auto Scaling. Dalam contoh ini, satu kelompok target ditentukan, [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)sumber daya dengan nama logis`myTargetGroup`.

### JSON
<a name="quickref-autoscaling-example-2.json"></a>

```
 1. "myServerGroup" : {
 2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.    "Properties" : {
 4.       "VPCZoneIdentifier" : [ { "Ref" : "myPublicSubnet1" }, { "Ref" : "myPublicSubnet2" } ],
 5.       "LaunchTemplate" : {
 6.         "LaunchTemplateId" : {
 7.           "Ref" : "myLaunchTemplate"
 8.         },
 9.         "Version" : {
10.           "Fn::GetAtt" : [
11.             "myLaunchTemplate",
12.             "LatestVersionNumber"
13.           ]
14.         }
15.       },
16.       "MaxSize" : "5",
17.       "MinSize" : "1",
18.       "TargetGroupARNs" : [ { "Ref" : "myTargetGroup" } ]
19.    }
20. }
```

### YAML
<a name="quickref-autoscaling-example-2.yaml"></a>

```
 1. myServerGroup:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - !Ref myPublicSubnet1
 6.       - !Ref myPublicSubnet2
 7.     LaunchTemplate:
 8.       LaunchTemplateId: !Ref myLaunchTemplate
 9.       Version: !GetAtt myLaunchTemplate.LatestVersionNumber
10.     MaxSize: '5'
11.     MinSize: '1'
12.     TargetGroupARNs:
13.       - !Ref myTargetGroup
```

### Lihat juga
<a name="scenario-as-group-see-also"></a>

[Untuk contoh mendetail yang membuat grup Auto Scaling dengan kebijakan penskalaan pelacakan target berdasarkan metrik yang `ALBRequestCountPerTarget` telah ditentukan untuk Application Load Balancer, lihat bagian Contoh di sumber daya.](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples) `AWS::AutoScaling::ScalingPolicy`

## Buat grup Auto Scaling dengan notifikasi
<a name="scenario-as-notification"></a>

Contoh ini menunjukkan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)sumber daya yang mengirimkan notifikasi Amazon SNS saat peristiwa yang ditentukan berlangsung. `NotificationConfigurations`Properti menentukan topik SNS di mana CloudFormation mengirimkan pemberitahuan dan peristiwa yang akan menyebabkan CloudFormation untuk mengirim pemberitahuan. Ketika peristiwa yang ditentukan oleh `NotificationTypes` terjadi, CloudFormation akan mengirim pemberitahuan ke topik SNS yang ditentukan oleh`TopicARN`. Saat Anda meluncurkan tumpukan, CloudFormation buat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html)resource (`snsTopicForAutoScalingGroup`) yang dideklarasikan dalam template yang sama.

`VPCZoneIdentifier`Properti grup Auto Scaling menentukan daftar subnet yang ada di tiga Availability Zone yang berbeda. Anda harus menentukan subnet yang berlaku IDs dari akun Anda sebelum Anda membuat tumpukan Anda. `LaunchTemplate`Properti mereferensikan nama logis dari [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)sumber daya yang dideklarasikan di tempat lain dalam template yang sama.

### JSON
<a name="quickref-autoscaling-example-3.json"></a>

```
 1. "myASG" : {
 2.   "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.   "DependsOn": [
 4.     "snsTopicForAutoScalingGroup"
 5.   ],
 6.   "Properties" : {
 7.     "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
 8.     "LaunchTemplate" : {
 9.       "LaunchTemplateId" : {
10.         "Ref" : "logicalName"
11.       },
12.       "Version" : {
13.         "Fn::GetAtt" : [
14.           "logicalName",
15.           "LatestVersionNumber"
16.         ]
17.       }
18.     },
19.     "MaxSize" : "5",
20.     "MinSize" : "1",
21.     "NotificationConfigurations" : [
22.       {
23.         "TopicARN" : { "Ref" : "snsTopicForAutoScalingGroup" },
24.         "NotificationTypes" : [
25.           "autoscaling:EC2_INSTANCE_LAUNCH",
26.           "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
27.           "autoscaling:EC2_INSTANCE_TERMINATE",
28.           "autoscaling:EC2_INSTANCE_TERMINATE_ERROR",
29.           "autoscaling:TEST_NOTIFICATION"
30.         ]
31.       }
32.     ]
33.   }
34. }
```

### YAML
<a name="quickref-autoscaling-example-3.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   DependsOn:
 4.     - snsTopicForAutoScalingGroup
 5.   Properties:
 6.     VPCZoneIdentifier:
 7.       - subnetIdAz1
 8.       - subnetIdAz2
 9.       - subnetIdAz3
10.     LaunchTemplate:
11.       LaunchTemplateId: !Ref logicalName
12.       Version: !GetAtt logicalName.LatestVersionNumber
13.     MaxSize: '5'
14.     MinSize: '1'
15.     NotificationConfigurations:
16.       - TopicARN: !Ref snsTopicForAutoScalingGroup
17.         NotificationTypes:
18.           - autoscaling:EC2_INSTANCE_LAUNCH
19.           - autoscaling:EC2_INSTANCE_LAUNCH_ERROR
20.           - autoscaling:EC2_INSTANCE_TERMINATE
21.           - autoscaling:EC2_INSTANCE_TERMINATE_ERROR
22.           - autoscaling:TEST_NOTIFICATION
```

## Buat grup Auto Scaling yang menggunakan a dan `CreationPolicy` `UpdatePolicy`
<a name="scenario-as-updatepolicy"></a>

Contoh berikut menunjukkan cara menambahkan `CreationPolicy` dan `UpdatePolicy` atribut ke [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)sumber daya.

Kebijakan pembuatan sampel mencegah grup Auto Scaling mencapai `CREATE_COMPLETE` status hingga CloudFormation menerima `Count` sejumlah sinyal keberhasilan saat grup siap. Untuk memberi sinyal bahwa grup Auto Scaling sudah siap, skrip `cfn-signal` helper yang ditambahkan ke data pengguna template peluncuran (tidak ditampilkan) dijalankan pada instance. Jika instance tidak mengirim sinyal dalam yang ditentukan`Timeout`, CloudFormation mengasumsikan bahwa instance tidak dibuat, pembuatan sumber daya gagal, dan CloudFormation memutar tumpukan kembali.

Kebijakan pembaruan sampel menginstruksikan CloudFormation untuk melakukan pembaruan bergulir menggunakan `AutoScalingRollingUpdate` properti. Pembaruan bergulir membuat perubahan pada grup Auto Scaling dalam batch kecil (untuk contoh ini, instance demi instance) berdasarkan `MaxBatchSize` dan waktu jeda antara kumpulan pembaruan berdasarkan. `PauseTime` `MinInstancesInService`Atribut menentukan jumlah minimum instance yang harus dalam layanan dalam grup Auto Scaling CloudFormation sementara memperbarui instance lama.

Atribut `WaitOnResourceSignals` diatur menjadi `true`. CloudFormation harus menerima sinyal dari setiap instans baru dalam `PauseTime` yang ditentukan sebelum melanjutkan pembaruan. Sementara pembaruan tumpukan sedang berlangsung, proses EC2 Auto Scaling berikut ditangguhkan: `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification`, dan `ScheduledActions`. Catatan: Jangan menangguhkan jenis proses`Launch`,`Terminate`, atau `AddToLoadBalancer` (jika grup Auto Scaling digunakan dengan Elastic Load Balancing) karena hal itu dapat mencegah pembaruan bergulir berfungsi dengan baik.

`VPCZoneIdentifier`Properti grup Auto Scaling menentukan daftar subnet yang ada di tiga Availability Zone yang berbeda. Anda harus menentukan subnet yang berlaku IDs dari akun Anda sebelum Anda membuat tumpukan Anda. `LaunchTemplate`Properti mereferensikan nama logis dari [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)sumber daya yang dideklarasikan di tempat lain dalam template yang sama.

Untuk informasi selengkapnya tentang `UpdatePolicy` atribut `CreationPolicy` dan, lihat [Referensi atribut sumber daya](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html).

### JSON
<a name="quickref-autoscaling-example-4.json"></a>

```
{
  "Resources":{
    "myASG":{
      "CreationPolicy":{
        "ResourceSignal":{
          "Count":"3",
          "Timeout":"PT15M"
        }
      },
      "UpdatePolicy":{
        "AutoScalingRollingUpdate":{
          "MinInstancesInService":"3",
          "MaxBatchSize":"1",
          "PauseTime":"PT12M5S",
          "WaitOnResourceSignals":"true",
          "SuspendProcesses":[
            "HealthCheck",
            "ReplaceUnhealthy",
            "AZRebalance",
            "AlarmNotification",
            "ScheduledActions",
            "InstanceRefresh"
          ]
        }
      },
      "Type":"AWS::AutoScaling::AutoScalingGroup",
      "Properties":{
        "VPCZoneIdentifier":[ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
        "LaunchTemplate":{
          "LaunchTemplateId":{
            "Ref":"logicalName"
          },
          "Version":{
            "Fn::GetAtt":[
              "logicalName",
              "LatestVersionNumber"
            ]
          }
        },
        "MaxSize":"5",
        "MinSize":"3"
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-4.yaml"></a>

```
---
Resources:
  myASG:
    CreationPolicy:
      ResourceSignal:
        Count: '3'
        Timeout: PT15M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: '3'
        MaxBatchSize: '1'
        PauseTime: PT12M5S
        WaitOnResourceSignals: true
        SuspendProcesses:
          - HealthCheck
          - ReplaceUnhealthy
          - AZRebalance
          - AlarmNotification
          - ScheduledActions
          - InstanceRefresh
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier:
        - subnetIdAz1
        - subnetIdAz2
        - subnetIdAz3
      LaunchTemplate:
        LaunchTemplateId: !Ref logicalName
        Version: !GetAtt logicalName.LatestVersionNumber
      MaxSize: '5'
      MinSize: '3'
```

## Membuat kebijakan penskalaan langkah
<a name="scenario-step-scaling-policy"></a>

Contoh ini menunjukkan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html)sumber daya yang menskalakan grup Auto Scaling menggunakan kebijakan penskalaan langkah. Properti `AdjustmentType` menentukan `ChangeInCapacity`, yang berarti bahwa `ScalingAdjustment` mewakili jumlah instans untuk ditambahkan (jika `ScalingAdjustment` positif) atau dihapus (jika negatif). Dalam contoh ini, `ScalingAdjustment` adalah 1; oleh karena itu, kebijakan tersebut menambah jumlah instans EC2 dalam grup sebanyak 1 ketika ambang batas alarm dilanggar.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudwatch-alarm.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudwatch-alarm.html)Sumber daya `CPUAlarmHigh` menentukan kebijakan penskalaan `ASGScalingPolicyHigh` sebagai tindakan yang akan dijalankan saat alarm berada dalam status ALARM ()`AlarmActions`. `Dimensions`Properti mereferensikan nama logis dari [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)sumber daya yang dideklarasikan di tempat lain dalam template yang sama.

### JSON
<a name="quickref-autoscaling-example-5.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "ASGScalingPolicyHigh":{
 4.       "Type":"AWS::AutoScaling::ScalingPolicy",
 5.       "Properties":{
 6.         "AutoScalingGroupName":{ "Ref":"logicalName" },
 7.         "PolicyType":"StepScaling",
 8.         "AdjustmentType":"ChangeInCapacity",
 9.         "StepAdjustments":[
10.           {
11.             "MetricIntervalLowerBound":0,
12.             "ScalingAdjustment":1
13.           }
14.         ]
15.       }
16.     },
17.     "CPUAlarmHigh":{
18.       "Type":"AWS::CloudWatch::Alarm",
19.       "Properties":{
20.         "EvaluationPeriods":"2",
21.         "Statistic":"Average",
22.         "Threshold":"90",
23.         "AlarmDescription":"Scale out if CPU > 90% for 2 minutes",
24.         "Period":"60",
25.         "AlarmActions":[ { "Ref":"ASGScalingPolicyHigh" } ],
26.         "Namespace":"AWS/EC2",
27.         "Dimensions":[
28.           {
29.             "Name":"AutoScalingGroupName",
30.             "Value":{ "Ref":"logicalName" }
31.           }
32.         ],
33.         "ComparisonOperator":"GreaterThanThreshold",
34.         "MetricName":"CPUUtilization"
35.       }
36.     }
37.   }
38. }
```

### YAML
<a name="quickref-autoscaling-example-5.yaml"></a>

```
 1. ---
 2. Resources:
 3.   ASGScalingPolicyHigh:
 4.     Type: AWS::AutoScaling::ScalingPolicy
 5.     Properties:
 6.       AutoScalingGroupName: !Ref logicalName
 7.       PolicyType: StepScaling
 8.       AdjustmentType: ChangeInCapacity
 9.       StepAdjustments: 
10.         - MetricIntervalLowerBound: 0
11.           ScalingAdjustment: 1
12.   CPUAlarmHigh:
13.     Type: AWS::CloudWatch::Alarm
14.     Properties:
15.       EvaluationPeriods: 2
16.       Statistic: Average
17.       Threshold: 90
18.       AlarmDescription: 'Scale out if CPU > 90% for 2 minutes'
19.       Period: 60
20.       AlarmActions:
21.         - !Ref ASGScalingPolicyHigh
22.       Namespace: AWS/EC2
23.       Dimensions:
24.         - Name: AutoScalingGroupName
25.           Value:
26.             !Ref logicalName
27.       ComparisonOperator: GreaterThanThreshold
28.       MetricName: CPUUtilization
```

### Lihat juga
<a name="scenario-as-policy-see-also"></a>

Untuk contoh templat lainnya untuk kebijakan penskalaan, lihat bagian [Contoh](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples) di `AWS::AutoScaling::ScalingPolicy` sumber daya.

## Contoh kelompok contoh campuran
<a name="scenario-mixed-instances-group-template-examples"></a>

### Membuat grup Auto Scaling menggunakan pemilihan tipe instans berbasis atribut
<a name="scenario-mixed-instances-group-instance-requirements"></a>

Contoh ini menunjukkan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)sumber daya yang berisi informasi untuk meluncurkan grup instance campuran menggunakan pemilihan tipe instans berbasis atribut. Anda menentukan nilai minimum dan maksimum untuk `VCpuCount` properti dan nilai minimum untuk `MemoryMiB` properti. Tipe instans apa pun yang digunakan oleh grup Auto Scaling harus sesuai dengan atribut instance yang diperlukan. 

`VPCZoneIdentifier`Properti grup Auto Scaling menentukan daftar subnet yang ada di tiga Availability Zone yang berbeda. Anda harus menentukan subnet yang berlaku IDs dari akun Anda sebelum Anda membuat tumpukan Anda. `LaunchTemplate`Properti mereferensikan nama logis dari [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)sumber daya yang dideklarasikan di tempat lain dalam template yang sama.

#### JSON
<a name="quickref-mixed-instances-group-example-2.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "myASG":{
 4.       "Type":"AWS::AutoScaling::AutoScalingGroup",
 5.       "Properties":{
 6.         "VPCZoneIdentifier":[
 7.           "subnetIdAz1",
 8.           "subnetIdAz2",
 9.           "subnetIdAz3"
10.         ],
11.         "MixedInstancesPolicy":{
12.           "LaunchTemplate":{
13.             "LaunchTemplateSpecification":{
14.               "LaunchTemplateId":{
15.                 "Ref":"logicalName"
16.               },
17.               "Version":{
18.                 "Fn::GetAtt":[
19.                   "logicalName",
20.                   "LatestVersionNumber"
21.                 ]
22.               }
23.             },
24.             "Overrides":[
25.               {
26.                 "InstanceRequirements":{
27.                   "VCpuCount":{
28.                     "Min":2,
29.                     "Max":4
30.                   },
31.                   "MemoryMiB":{
32.                     "Min":2048
33.                   }
34.                 }
35.               }
36.             ]
37.           }
38.         },
39.         "MaxSize":"5",
40.         "MinSize":"1"
41.       }
42.     }
43.   }
44. }
```

#### YAML
<a name="quickref-mixed-instances-group-example-1.yaml"></a>

```
 1. ---
 2. Resources:
 3.   myASG:
 4.     Type: AWS::AutoScaling::AutoScalingGroup
 5.     Properties:
 6.       VPCZoneIdentifier:
 7.         - subnetIdAz1
 8.         - subnetIdAz2
 9.         - subnetIdAz3
10.       MixedInstancesPolicy:
11.         LaunchTemplate:
12.           LaunchTemplateSpecification:
13.             LaunchTemplateId: !Ref logicalName
14.             Version: !GetAtt logicalName.LatestVersionNumber
15.           Overrides:
16.             - InstanceRequirements:
17.                 VCpuCount:
18.                   Min: 2
19.                   Max: 4
20.                 MemoryMiB:
21.                   Min: 2048
22.       MaxSize: '5'
23.       MinSize: '1'
```

## Luncurkan contoh konfigurasi
<a name="scenario-launch-config-template-examples"></a>

### Buat konfigurasi peluncuran
<a name="scenario-as-launch-config"></a>

Contoh ini menunjukkan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html)sumber daya untuk grup Auto Scaling tempat Anda menentukan nilai untuk`ImageId`,`InstanceType`, dan `SecurityGroups` properti. `SecurityGroups`Properti menentukan nama logis dari [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)sumber daya yang ditentukan di tempat lain dalam template, dan grup keamanan EC2 yang ada bernama. `myExistingEC2SecurityGroup`

#### JSON
<a name="quickref-launch-config-example-1.json"></a>

```
1. "mySimpleConfig" : {
2.    "Type" : "AWS::AutoScaling::LaunchConfiguration",
3.    "Properties" : {
4.       "ImageId" : "ami-02354e95b3example",
5.       "InstanceType" : "t3.micro",
6.       "SecurityGroups" : [ { "Ref" : "logicalName" }, "myExistingEC2SecurityGroup" ]
7.    }
8. }
```

#### YAML
<a name="quickref-launch-config-example-1.yaml"></a>

```
1. mySimpleConfig:
2.   Type: AWS::AutoScaling::LaunchConfiguration
3.   Properties:
4.     ImageId: ami-02354e95b3example
5.     InstanceType: t3.micro
6.     SecurityGroups:
7.       - !Ref logicalName
8.       - myExistingEC2SecurityGroup
```

### Membuat grup Auto Scaling yang menggunakan konfigurasi peluncuran
<a name="scenario-single-instance-as-group-launch-configuration"></a>

Contoh ini menunjukkan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)sumber daya dengan satu contoh. `VPCZoneIdentifier`Properti grup Auto Scaling menentukan daftar subnet yang ada di tiga Availability Zone yang berbeda. Anda harus menentukan subnet yang berlaku IDs dari akun Anda sebelum Anda membuat tumpukan Anda. `LaunchConfigurationName`Properti mereferensikan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html)sumber daya dengan nama logis `mySimpleConfig` yang didefinisikan dalam template Anda.

#### JSON
<a name="quickref-launch-config-example-2.json"></a>

```
1. "myASG" : {
2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
3.    "Properties" : {
4.       "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
5.       "LaunchConfigurationName" : { "Ref" : "mySimpleConfig" },
6.       "MaxSize" : "1",
7.       "MinSize" : "1"
8.    }
9. }
```

#### YAML
<a name="quickref-launch-config-example-2.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - subnetIdAz1
 6.       - subnetIdAz2
 7.       - subnetIdAz3
 8.     LaunchConfigurationName: !Ref mySimpleConfig
 9.     MaxSize: '1'
10.     MinSize: '1'
```

# Konfigurasikan sumber daya Application Auto Scaling dengan CloudFormation
<a name="quickref-application-auto-scaling"></a>

Bagian ini memberikan contoh CloudFormation templat untuk kebijakan penskalaan Application Auto Scaling dan tindakan terjadwal untuk sumber daya yang berbeda. AWS 

**penting**  
Ketika cuplikan Application Auto Scaling disertakan dalam template, Anda mungkin perlu mendeklarasikan dependensi pada sumber daya tertentu yang dapat diskalakan yang dibuat melalui template menggunakan atribut. `DependsOn` Ini menimpa paralelisme default dan mengarahkan CloudFormation untuk beroperasi pada sumber daya dalam urutan tertentu. Jika tidak, konfigurasi penskalaan mungkin diterapkan sebelum sumber daya telah disiapkan sepenuhnya.  
Untuk informasi lebih lanjut, lihat [Atribut DependsOn](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html).

**Topics**
+ [Membuat kebijakan penskalaan untuk armada AppStream](#w2aac11c41c15c19b9)
+ [Buat kebijakan penskalaan untuk klaster Aurora DB](#w2aac11c41c15c19c11)
+ [Membuat kebijakan penskalaan untuk tabel DynamoDB](#w2aac11c41c15c19c13)
+ [Membuat kebijakan penskalaan untuk layanan Amazon ECS (metrik: CPU dan memori rata-rata)](#w2aac11c41c15c19c15)
+ [Membuat kebijakan penskalaan untuk layanan Amazon ECS (metrik: jumlah permintaan rata-rata per target)](#w2aac11c41c15c19c17)
+ [Buat tindakan terjadwal dengan ekspresi cron untuk fungsi Lambda](#w2aac11c41c15c19c19)
+ [Membuat tindakan terjadwal dengan `at` ekspresi untuk Armada Spot](#w2aac11c41c15c19c21)

## Membuat kebijakan penskalaan untuk armada AppStream
<a name="w2aac11c41c15c19b9"></a>

Cuplikan ini menunjukkan cara membuat kebijakan dan menerapkannya ke [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-appstream-fleet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-appstream-fleet.html)sumber daya menggunakan sumber daya. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html) [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html)Sumber daya mendeklarasikan target yang dapat diskalakan tempat kebijakan ini diterapkan. Application Auto Scaling dapat menskalakan jumlah instance armada minimal 1 instans dan maksimal 20 instans. Kebijakan tersebut menjaga pemanfaatan kapasitas rata-rata armada pada 75 persen, dengan periode cooldown scale-out dan scale-in 300 detik (5 menit).

Ini menggunakan fungsi `Fn::Join` dan `Rev` intrinsik untuk membangun `ResourceId` properti dengan nama logis dari `AWS::AppStream::Fleet` sumber daya yang ditentukan dalam template yang sama. Untuk informasi lebih lanjut, lihat Referensi [fungsi intrinsik](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-6.json"></a>

```
{
  "Resources" : {
    "ScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 20,
        "MinCapacity" : 1,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet" },
        "ServiceNamespace" : "appstream",
        "ScalableDimension" : "appstream:fleet:DesiredCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "fleet",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        }
      }
    },
    "ScalingPolicyAppStreamFleet" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu75" },
        "PolicyType" : "TargetTrackingScaling",
        "ServiceNamespace" : "appstream",
        "ScalableDimension" : "appstream:fleet:DesiredCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "fleet",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 75,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "AppStreamAverageCapacityUtilization"
          },
          "ScaleInCooldown" : 300,
          "ScaleOutCooldown" : 300
        }
      }
    } 
  }
}
```

### YAML
<a name="quickref-autoscaling-example-6.yaml"></a>

```
---
Resources:
  ScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 20
      MinCapacity: 1
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet'
      ServiceNamespace: appstream
      ScalableDimension: appstream:fleet:DesiredCapacity
      ResourceId: !Join
        - /
        - - fleet
          - !Ref logicalName
  ScalingPolicyAppStreamFleet:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu75
      PolicyType: TargetTrackingScaling
      ServiceNamespace: appstream
      ScalableDimension: appstream:fleet:DesiredCapacity
      ResourceId: !Join
        - /
        - - fleet
          - !Ref logicalName
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 75
        PredefinedMetricSpecification:
          PredefinedMetricType: AppStreamAverageCapacityUtilization
        ScaleInCooldown: 300
        ScaleOutCooldown: 300
```

## Buat kebijakan penskalaan untuk klaster Aurora DB
<a name="w2aac11c41c15c19c11"></a>

Dalam cuplikan ini, Anda mendaftarkan sumber daya. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html) [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html)Sumber daya menunjukkan bahwa cluster DB harus diskalakan secara dinamis untuk memiliki dari satu hingga delapan Replika Aurora. Anda juga menerapkan kebijakan penskalaan pelacakan target ke klaster menggunakan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html)sumber daya.

Dalam konfigurasi ini, metrik standar `RDSReaderAverageCPUUtilization` digunakan untuk menyesuaikan klaster DB Aurora berdasarkan pemanfaatan CPU rata-rata sebesar 40 persen di seluruh Replika Aurora dalam klaster DB Aurora tersebut. Konfigurasi ini menyediakan periode pendinginan penskalaan ke dalam selama 10 menit dan periode pendinginan penskalaan ke luar selama 5 menit.

Contoh ini menggunakan fungsi `Fn::Sub` intrinsik untuk membangun `ResourceId` properti dengan nama logis `AWS::RDS::DBCluster` sumber daya yang ditentukan dalam template yang sama. Untuk informasi lebih lanjut, lihat Referensi [fungsi intrinsik](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-7.json"></a>

```
{
  "Resources" : {
    "ScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 8,
        "MinCapacity" : 1,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster" },
        "ServiceNamespace" : "rds",
        "ScalableDimension" : "rds:cluster:ReadReplicaCount",
        "ResourceId" : { "Fn::Sub" : "cluster:${logicalName}" }
      }
    },
    "ScalingPolicyDBCluster" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu40" },
        "PolicyType" : "TargetTrackingScaling",
        "ServiceNamespace" : "rds",
        "ScalableDimension" : "rds:cluster:ReadReplicaCount",
        "ResourceId" : { "Fn::Sub" : "cluster:${logicalName}" }, 
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 40,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "RDSReaderAverageCPUUtilization"
          },
          "ScaleInCooldown" : 600,
          "ScaleOutCooldown" : 300
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-7.yaml"></a>

```
---
Resources:
  ScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 8
      MinCapacity: 1
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster'
      ServiceNamespace: rds
      ScalableDimension: rds:cluster:ReadReplicaCount
      ResourceId: !Sub cluster:${logicalName}
  ScalingPolicyDBCluster:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu40
      PolicyType: TargetTrackingScaling
      ServiceNamespace: rds
      ScalableDimension: rds:cluster:ReadReplicaCount
      ResourceId: !Sub cluster:${logicalName}
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 40
        PredefinedMetricSpecification:
          PredefinedMetricType: RDSReaderAverageCPUUtilization
        ScaleInCooldown: 600
        ScaleOutCooldown: 300
```

## Membuat kebijakan penskalaan untuk tabel DynamoDB
<a name="w2aac11c41c15c19c13"></a>

Cuplikan ini menunjukkan cara membuat kebijakan dengan tipe `TargetTrackingScaling` kebijakan dan menerapkannya ke [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html)sumber daya menggunakan sumber daya. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html) [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html)Sumber daya menyatakan target yang dapat diskalakan yang diterapkan kebijakan ini, dengan minimal lima unit kapasitas tulis dan maksimum 15. Kebijakan penskalaan menskalakan throughput kapasitas tulis tabel untuk mempertahankan pemanfaatan target pada 50 persen berdasarkan metrik `DynamoDBWriteCapacityUtilization` yang sudah ditentukan sebelumnya.

Ini menggunakan fungsi `Fn::Join` dan `Ref` intrinsik untuk membangun `ResourceId` properti dengan nama logis dari `AWS::DynamoDB::Table` sumber daya yang ditentukan dalam template yang sama. Untuk informasi lebih lanjut, lihat Referensi [fungsi intrinsik](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**catatan**  
Untuk informasi selengkapnya tentang cara membuat CloudFormation template untuk sumber daya DynamoDB, lihat [posting blog Cara menggunakan untuk mengonfigurasi penskalaan otomatis CloudFormation untuk tabel dan indeks Amazon DynamoDB di Blog Database](https://aws.amazon.com/blogs/database/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/). AWS 

### JSON
<a name="quickref-autoscaling-example-8.json"></a>

```
{
  "Resources" : {
    "WriteCapacityScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 15,
        "MinCapacity" : 5,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable" },
        "ServiceNamespace" : "dynamodb",
        "ScalableDimension" : "dynamodb:table:WriteCapacityUnits",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "table",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        }
      }
    },
    "WriteScalingPolicy" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : "WriteScalingPolicy",
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "WriteCapacityScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 50.0,
          "ScaleInCooldown" : 60,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "DynamoDBWriteCapacityUtilization"
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-8.yaml"></a>

```
---
Resources:
  WriteCapacityScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 15
      MinCapacity: 5
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
      ServiceNamespace: dynamodb
      ScalableDimension: dynamodb:table:WriteCapacityUnits
      ResourceId: !Join
        - /
        - - table
          - !Ref logicalName
  WriteScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: WriteScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref WriteCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 50.0
        ScaleInCooldown: 60
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBWriteCapacityUtilization
```

## Membuat kebijakan penskalaan untuk layanan Amazon ECS (metrik: CPU dan memori rata-rata)
<a name="w2aac11c41c15c19c15"></a>

Cuplikan ini menunjukkan cara membuat kebijakan dan menerapkannya ke [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html)sumber daya menggunakan sumber daya. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html) [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html)Sumber daya mendeklarasikan target yang dapat diskalakan tempat kebijakan ini diterapkan. Application Auto Scaling dapat menskalakan jumlah tugas minimal 1 tugas dan maksimal 6.

Hal itu membuat dua kebijakan penskalaan dengan jenis kebijakan `TargetTrackingScaling`. Kebijakan yang digunakan untuk menskalakan layanan ECS berdasarkan penggunaan rata-rata CPU dan memori layanan. Ini menggunakan fungsi `Fn::Join` dan `Ref` intrinsik untuk membangun `ResourceId` properti dengan nama logis dari [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html)(`myContainerCluster`) dan `AWS::ECS::Service` (`myService`) sumber daya yang ditentukan dalam template yang sama. Untuk informasi lebih lanjut, lihat Referensi [fungsi intrinsik](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-9.json"></a>

```
{
  "Resources" : {
    "ECSScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : "6",
        "MinCapacity" : "1",
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" },
        "ServiceNamespace" : "ecs",
        "ScalableDimension" : "ecs:service:DesiredCount",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "service",
              {
                "Ref" : "myContainerCluster"
              },
              {
                "Fn::GetAtt" : [
                  "myService",
                  "Name"
                ]
              }
            ]
          ]
        }
      }
    },
    "ServiceScalingPolicyCPU" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu70" },
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 70.0,
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ECSServiceAverageCPUUtilization"
          }
        }
      }
    },
    "ServiceScalingPolicyMem" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-mem90" },
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 90.0,
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ECSServiceAverageMemoryUtilization"
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-9.yaml"></a>

```
---
Resources:
  ECSScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 6
      MinCapacity: 1  
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService'
      ServiceNamespace: ecs
      ScalableDimension: 'ecs:service:DesiredCount'
      ResourceId: !Join 
        - /
        - - service
          - !Ref myContainerCluster
          - !GetAtt myService.Name
  ServiceScalingPolicyCPU:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu70
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 70.0
        ScaleInCooldown: 180
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: ECSServiceAverageCPUUtilization
  ServiceScalingPolicyMem:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-mem90
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 90.0
        ScaleInCooldown: 180
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: ECSServiceAverageMemoryUtilization
```

## Membuat kebijakan penskalaan untuk layanan Amazon ECS (metrik: jumlah permintaan rata-rata per target)
<a name="w2aac11c41c15c19c17"></a>

Contoh berikut menerapkan kebijakan penskalaan pelacakan target dengan metrik `ALBRequestCountPerTarget` yang telah ditetapkan ke layanan ECS. Kebijakan ini digunakan untuk menambah kapasitas layanan ECS ketika jumlah permintaan per target (per menit) melebihi nilai target. Karena nilai `DisableScaleIn` diatur menjadi `true`, kebijakan pelacakan target tidak akan menghapus kapasitas dari target yang dapat diskalakan.

Ini menggunakan fungsi `Fn::Join` dan `Fn::GetAtt` intrinsik untuk membangun `ResourceLabel` properti dengan nama logis dari [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)(`myLoadBalancer`) dan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)(`myTargetGroup`) sumber daya yang ditentukan dalam template yang sama. Untuk informasi lebih lanjut, lihat Referensi [fungsi intrinsik](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

Properti `MaxCapacity` dan `MinCapacity` pada target yang dapat diskalakan dan properti `TargetValue` nilai parameter referensi kebijakan penskalaan yang Anda teruskan ke templat saat membuat atau memperbarui tumpukan.

### JSON
<a name="quickref-autoscaling-example-10.json"></a>

```
{
  "Resources" : {
    "ECSScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : { "Ref" : "MaxCount" },
        "MinCapacity" : { "Ref" : "MinCount" },
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" },
        "ServiceNamespace" : "ecs",
        "ScalableDimension" : "ecs:service:DesiredCount",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "service",
              {
                "Ref" : "myContainerCluster"
              },
              {
                "Fn::GetAtt" : [
                  "myService",
                  "Name"
                ]
              }
            ]
          ]
        }
      }
    },
    "ServiceScalingPolicyALB" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : "alb-requests-per-target-per-minute",
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : { "Ref" : "ALBPolicyTargetValue" },
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 30,
          "DisableScaleIn" : true,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ALBRequestCountPerTarget",
            "ResourceLabel" : {
              "Fn::Join" : [
                "/",
                [
                  {
                    "Fn::GetAtt" : [
                      "myLoadBalancer",
                      "LoadBalancerFullName"
                    ]
                  },
                  {
                    "Fn::GetAtt" : [
                      "myTargetGroup",
                      "TargetGroupFullName"
                    ]
                  }
                ]
              ]
            }
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-10.yaml"></a>

```
---
Resources:
  ECSScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: !Ref MaxCount
      MinCapacity: !Ref MinCount  
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService'
      ServiceNamespace: ecs
      ScalableDimension: 'ecs:service:DesiredCount'
      ResourceId: !Join 
        - /
        - - service
          - !Ref myContainerCluster
          - !GetAtt myService.Name
  ServiceScalingPolicyALB:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: alb-requests-per-target-per-minute
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: !Ref ALBPolicyTargetValue
        ScaleInCooldown: 180
        ScaleOutCooldown: 30
        DisableScaleIn: true
        PredefinedMetricSpecification:
          PredefinedMetricType: ALBRequestCountPerTarget
          ResourceLabel: !Join 
            - '/' 
            - - !GetAtt myLoadBalancer.LoadBalancerFullName
              - !GetAtt myTargetGroup.TargetGroupFullName
```

## Buat tindakan terjadwal dengan ekspresi cron untuk fungsi Lambda
<a name="w2aac11c41c15c19c19"></a>

Cuplikan ini mendaftarkan konkurensi yang disediakan untuk fungsi alias () bernama menggunakan sumber daya. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html) Hal itu juga membuat tindakan terjadwal dengan jadwal berulang menggunakan ekspresi cron. Zona waktu untuk jadwal berulang adalah UTC.

Ini menggunakan fungsi `Ref` intrinsik `Fn::Join` dan intrinsik di `RoleARN` properti untuk menentukan ARN dari peran terkait layanan. Ini menggunakan fungsi `Fn::Sub` intrinsik untuk membangun `ResourceId` properti dengan nama logis dari [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)atau [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)sumber daya yang ditentukan dalam template yang sama. Untuk informasi lebih lanjut, lihat Referensi [fungsi intrinsik](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**catatan**  
Anda tidak dapat mengalokasikan konkurensi yang disediakan pada alias yang menunjuk ke versi () yang tidak dipublikasikan. `$LATEST`  
Untuk informasi selengkapnya tentang cara membuat CloudFormation template untuk sumber daya Lambda, lihat posting blog [Menjadwalkan Konkurensi Penyediaan AWS Lambda untuk](https://aws.amazon.com/blogs/compute/scheduling-aws-lambda-provisioned-concurrency-for-recurring-peak-usage/) penggunaan puncak berulang di Blog Komputasi. AWS 

### JSON
<a name="quickref-autoscaling-example-11.json"></a>

```
{
  "ScalableTarget" : {
    "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
    "Properties" : {
      "MaxCapacity" : 250,
      "MinCapacity" : 0,
      "RoleARN" : {
        "Fn::Join" : [
          ":",
          [
            "arn:aws:iam:",
            {
              "Ref" : "AWS::AccountId"
            },
            "role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency"
          ]
        ]
      },
      "ServiceNamespace" : "lambda",
      "ScalableDimension" : "lambda:function:ProvisionedConcurrency",
      "ResourceId" : { "Fn::Sub" : "function:${logicalName}:BLUE" },
      "ScheduledActions" : [
        {
          "ScalableTargetAction" : {
            "MinCapacity" : "250"
          },
          "ScheduledActionName" : "my-scale-out-scheduled-action",
          "Schedule" : "cron(0 18 * * ? *)",
          "EndTime" : "2022-12-31T12:00:00.000Z"
        }
      ]
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-11.yaml"></a>

```
ScalableTarget:
  Type: AWS::ApplicationAutoScaling::ScalableTarget
  Properties:
    MaxCapacity: 250
    MinCapacity: 0
    RoleARN: !Join 
      - ':'
      - - 'arn:aws:iam:'
        - !Ref 'AWS::AccountId'
        - role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency
    ServiceNamespace: lambda
    ScalableDimension: lambda:function:ProvisionedConcurrency
    ResourceId: !Sub function:${logicalName}:BLUE
    ScheduledActions:
      - ScalableTargetAction:
          MinCapacity: 250
        ScheduledActionName: my-scale-out-scheduled-action
        Schedule: 'cron(0 18 * * ? *)'
        EndTime: '2022-12-31T12:00:00.000Z'
```

## Membuat tindakan terjadwal dengan `at` ekspresi untuk Armada Spot
<a name="w2aac11c41c15c19c21"></a>

Cuplikan ini menunjukkan cara membuat dua tindakan terjadwal yang terjadi hanya sekali untuk [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-spotfleet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-spotfleet.html)sumber daya yang menggunakan sumber daya. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) Zona waktu untuk setiap tindakan terjadwal satu kali adalah UTC.

Ini menggunakan fungsi `Fn::Join` dan `Ref` intrinsik untuk membangun `ResourceId` properti dengan nama logis dari `AWS::EC2::SpotFleet` sumber daya yang ditentukan dalam template yang sama. Untuk informasi lebih lanjut, lihat Referensi [fungsi intrinsik](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**catatan**  
Permintaan Armada Spot harus memiliki jenis permintaan `maintain`. Penskalaan otomatis tidak didukung untuk permintaan tipe , atau blok Spot.

### JSON
<a name="quickref-autoscaling-example-12.json"></a>

```
{
  "Resources" : {
    "SpotFleetScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 0,
        "MinCapacity" : 0,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest" },
        "ServiceNamespace" : "ec2",
        "ScalableDimension" : "ec2:spot-fleet-request:TargetCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "spot-fleet-request",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        },
        "ScheduledActions" : [
          {
            "ScalableTargetAction" : {
              "MaxCapacity" : "10",
              "MinCapacity" : "10"
            },
            "ScheduledActionName" : "my-scale-out-scheduled-action",
            "Schedule" : "at(2022-05-20T13:00:00)"
          },
          {
            "ScalableTargetAction" : {
              "MaxCapacity" : "0",
              "MinCapacity" : "0"
            },
            "ScheduledActionName" : "my-scale-in-scheduled-action",
            "Schedule" : "at(2022-05-20T21:00:00)"
          }
        ]
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-12.yaml"></a>

```
---
Resources:
  SpotFleetScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 0
      MinCapacity: 0
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest'
      ServiceNamespace: ec2
      ScalableDimension: 'ec2:spot-fleet-request:TargetCapacity'
      ResourceId: !Join 
        - /
        - - spot-fleet-request
          - !Ref logicalName
      ScheduledActions:
        - ScalableTargetAction:
            MaxCapacity: 10
            MinCapacity: 10
          ScheduledActionName: my-scale-out-scheduled-action
          Schedule: 'at(2022-05-20T13:00:00)'
        - ScalableTargetAction:
            MaxCapacity: 0
            MinCapacity: 0
          ScheduledActionName: my-scale-in-scheduled-action
          Schedule: 'at(2022-05-20T21:00:00)'
```

# AWS Cuplikan templat Konsol Penagihan
<a name="quickref-billingconductor"></a>

Contoh ini membuat satu paket harga dengan aturan harga markup global 10%. Paket harga ini dilampirkan ke grup penagihan. Grup penagihan juga memiliki dua item baris khusus yang menerapkan biaya \$110 dan biaya 10% di atas total biaya grup penagihan.

## JSON
<a name="quickref-billingconductor-example-1.json"></a>

```
 1. {
 2.    "Parameters": {
 3.       "LinkedAccountIds": {
 4.          "Type": "ListNumber"
 5.       },
 6.       "PrimaryAccountId": {
 7.          "Type": "Number"
 8.       }
 9.    },
10.    "Resources": {
11.       "TestPricingRule": {
12.          "Type": "AWS::BillingConductor::PricingRule",
13.          "Properties": {
14.             "Name": "TestPricingRule",
15.             "Description": "Test pricing rule created through Cloudformation. Mark everything by 10%.",
16.             "Type": "MARKUP",
17.             "Scope": "GLOBAL",
18.             "ModifierPercentage": 10
19.          }
20.       },
21.       "TestPricingPlan": {
22.          "Type": "AWS::BillingConductor::PricingPlan",
23.          "Properties": {
24.             "Name": "TestPricingPlan",
25.             "Description": "Test pricing plan created through Cloudformation.",
26.             "PricingRuleArns": [
27.                {"Fn::GetAtt": ["TestPricingRule", "Arn"]}
28.             ]
29.          }
30.       },
31.       "TestBillingGroup": {
32.          "Type": "AWS::BillingConductor::BillingGroup",
33.          "Properties": {
34.             "Name": "TestBillingGroup",
35.             "Description": "Test billing group created through Cloudformation with 1 linked account. The linked account is also the primary account.",
36.             "PrimaryAccountId": {
37.                "Ref": "PrimaryAccountId"
38.             },
39.             "AccountGrouping": {
40.                "LinkedAccountIds": null
41.             },
42.             "ComputationPreference": {
43.                "PricingPlanArn": {
44.                  "Fn::GetAtt": ["TestPricingPlan", "Arn"]
45.                }
46.             }
47.          }
48.       },
49.       "TestFlatCustomLineItem": {
50.          "Type": "AWS::BillingConductor::CustomLineItem",
51.          "Properties": {
52.             "Name": "TestFlatCustomLineItem",
53.             "Description": "Test flat custom line item created through Cloudformation for a $10 charge.",
54.             "BillingGroupArn": {
55.               "Fn::GetAtt": ["TestBillingGroup", "Arn"]
56.             },
57.             "CustomLineItemChargeDetails": {
58.                "Flat": {
59.                   "ChargeValue": 10
60.                },
61.                "Type": "FEE"
62.             }
63.          }
64.       },
65.       "TestPercentageCustomLineItem": {
66.          "Type": "AWS::BillingConductor::CustomLineItem",
67.          "Properties": {
68.             "Name": "TestPercentageCustomLineItem",
69.             "Description": "Test percentage custom line item created through Cloudformation for a %10 additional charge on the overall total bill of the billing group.",
70.             "BillingGroupArn": {
71.               "Fn::GetAtt": ["TestBillingGroup", "Arn"]
72.             },
73.             "CustomLineItemChargeDetails": {
74.                "Percentage": {
75.                   "PercentageValue": 10,
76.                   "ChildAssociatedResources": [
77.                      {"Fn::GetAtt": ["TestBillingGroup", "Arn"]}
78.                   ]
79.                },
80.                "Type": "FEE"
81.             }
82.          }
83.       }
84.    }
85. }
```

## YAML
<a name="quickref-billingconductor-example-1.yaml"></a>

```
 1. Parameters:
 2.   LinkedAccountIds:
 3.     Type: ListNumber
 4.   PrimaryAccountId:
 5.     Type: Number
 6. Resources:
 7.   TestPricingRule:
 8.     Type: AWS::BillingConductor::PricingRule
 9.     Properties:
10.       Name: 'TestPricingRule'
11.       Description: 'Test pricing rule created through Cloudformation. Mark everything by 10%.'
12.       Type: 'MARKUP'
13.       Scope: 'GLOBAL'
14.       ModifierPercentage: 10
15.   TestPricingPlan:
16.     Type: AWS::BillingConductor::PricingPlan
17.     Properties:
18.       Name: 'TestPricingPlan'
19.       Description: 'Test pricing plan created through Cloudformation.'
20.       PricingRuleArns:
21.         - !GetAtt TestPricingRule.Arn
22.   TestBillingGroup:
23.     Type: AWS::BillingConductor::BillingGroup
24.     Properties:
25.       Name: 'TestBillingGroup'
26.       Description: 'Test billing group created through Cloudformation with 1 linked account. The linked account is also the primary account.'
27.       PrimaryAccountId: !Ref PrimaryAccountId
28.       AccountGrouping:
29.         LinkedAccountIds: !Ref LinkedAccountIds
30.       ComputationPreference:
31.         PricingPlanArn: !GetAtt TestPricingPlan.Arn
32.   TestFlatCustomLineItem:
33.     Type: AWS::BillingConductor::CustomLineItem
34.     Properties:
35.       Name: 'TestFlatCustomLineItem'
36.       Description: 'Test flat custom line item created through Cloudformation for a $10 charge.'
37.       BillingGroupArn: !GetAtt TestBillingGroup.Arn
38.       CustomLineItemChargeDetails:
39.         Flat:
40.           ChargeValue: 10
41.         Type: 'FEE'
42.   TestPercentageCustomLineItem:
43.     Type: AWS::BillingConductor::CustomLineItem
44.     Properties:
45.       Name: 'TestPercentageCustomLineItem'
46.       Description: 'Test percentage custom line item created through Cloudformation for a %10 additional charge on the overall total bill of the billing group.'
47.       BillingGroupArn: !GetAtt TestBillingGroup.Arn
48.       CustomLineItemChargeDetails:
49.         Percentage:
50.           PercentageValue: 10
51.           ChildAssociatedResources:
52.             - !GetAtt TestBillingGroup.Arn
53.         Type: 'FEE'
```

# CloudFormation cuplikan template
<a name="quickref-cloudformation"></a>

**Topics**
+ [Tumpukan nested](#w2aac11c41c23b5)
+ [Kondisi menunggu](#w2aac11c41c23b7)

## Tumpukan nested
<a name="w2aac11c41c23b5"></a>

### Membuat nest tumpukan dalam templat
<a name="scenario-stack"></a>

Contoh templat ini mengandung sumber daya tumpukan nested yang disebut `myStack`. Ketika CloudFormation membuat tumpukan dari template, itu menciptakan`myStack`, yang templatnya ditentukan dalam `TemplateURL` properti. Nilai output `StackRef` mengembalikan ID tumpukan untuk `myStack` dan nilai `OutputFromNestedStack` mengembalikan nilai output `BucketName` dari dalam sumber daya `myStack`. `Outputs.nestedstackoutputname`Format ini dicadangkan untuk menentukan nilai output dari tumpukan bersarang dan dapat digunakan di mana saja dalam template yang berisi.

Untuk informasi selengkapnya, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html).

#### JSON
<a name="quickref-cloudformation-example-1.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myStack" : {
 5. 	       "Type" : "AWS::CloudFormation::Stack",
 6. 	       "Properties" : {
 7. 	        "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-1/S3_Bucket.template",
 8.               "TimeoutInMinutes" : "60"
 9. 	       }
10.         }
11.     },
12.     "Outputs": {
13.        "StackRef": {"Value": { "Ref" : "myStack"}},
14.        "OutputFromNestedStack" : {
15.              "Value" : { "Fn::GetAtt" : [ "myStack", "Outputs.BucketName" ] }
16.        }
17.     }
18. }
```

#### YAML
<a name="quickref-cloudformation-example-1.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myStack:
 4.     Type: AWS::CloudFormation::Stack
 5.     Properties:
 6.       TemplateURL: https://s3.amazonaws.com/cloudformation-templates-us-east-1/S3_Bucket.template
 7.       TimeoutInMinutes: '60'
 8. Outputs:
 9.   StackRef:
10.     Value: !Ref myStack
11.   OutputFromNestedStack:
12.     Value: !GetAtt myStack.Outputs.BucketName
```

### Membuat nest tumpukan dengan parameter input dalam sebuah templat
<a name="scenario-stack-parameters"></a>

Templat contoh ini berisi sumber daya tumpukan yang menentukan parameter input. Saat CloudFormation membuat tumpukan dari template ini, ia menggunakan pasangan nilai yang dideklarasikan dalam `Parameters` properti sebagai parameter input untuk template yang digunakan untuk membuat `myStackWithParams` tumpukan. Dalam contoh ini, parameter `InstanceType` dan `KeyName` ditentukan.

Untuk informasi selengkapnya, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html).

#### JSON
<a name="quickref-cloudformation-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myStackWithParams" : {
 5.   	       "Type" : "AWS::CloudFormation::Stack",
 6. 	       "Properties" : {
 7. 	           "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2ChooseAMI.template",
 8. 	           "Parameters" : {
 9. 	               "InstanceType" : "t2.micro",
10. 	               "KeyName" : "mykey"
11. 	           }
12.    	       }
13.         }
14.     }
15. }
```

#### YAML
<a name="quickref-cloudformation-example-2.yaml"></a>

```
1. AWSTemplateFormatVersion: '2010-09-09'
2. Resources:
3.   myStackWithParams:
4.     Type: AWS::CloudFormation::Stack
5.     Properties:
6.       TemplateURL: https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2ChooseAMI.template
7.       Parameters:
8.         InstanceType: t2.micro
9.         KeyName: mykey
```

## Kondisi menunggu
<a name="w2aac11c41c23b7"></a>

### Menggunakan kondisi tunggu dengan instans Amazon EC2
<a name="scenario-waitcondition"></a>

**penting**  
Untuk sumber daya Amazon EC2 dan Auto Scaling, sebaiknya gunakan atribut alih-alih CreationPolicy kondisi tunggu. Tambahkan CreationPolicy atribut ke sumber daya tersebut, dan gunakan skrip pembantu sinyal cfn untuk memberi sinyal ketika proses pembuatan instance telah berhasil diselesaikan.

Jika Anda tidak dapat menggunakan kebijakan pembuatan, Anda akan melihat contoh template berikut, yang mendeklarasikan instans Amazon EC2 dengan kondisi tunggu. Kondisi `myWaitCondition` tunggu digunakan `myWaitConditionHandle` untuk pensinyalan, menggunakan `DependsOn` atribut untuk menentukan bahwa kondisi tunggu akan dipicu setelah sumber daya instans Amazon EC2 dibuat, dan menggunakan `Timeout` properti untuk menentukan durasi 4500 detik untuk kondisi tunggu. Selain itu, URL yang telah ditetapkan sebelumnya yang memberi sinyal kondisi tunggu diteruskan ke instans Amazon EC2 dengan `UserData` properti sumber daya, sehingga memungkinkan aplikasi atau skrip yang berjalan pada instans Amazon EC2 tersebut untuk mengambil URL yang telah ditetapkan sebelumnya dan menggunakannya untuk memberi sinyal keberhasilan atau kegagalan kondisi tunggu. `Ec2Instance` Anda perlu menggunakan `cfn-signal` atau membuat aplikasi atau skrip yang menandakan kondisi tunggu. Nilai output `ApplicationData` berisi data yang diteruskan kembali dari sinyal kondisi tunggu.

Untuk informasi selengkapnya, lihat [Buat kondisi tunggu di CloudFormation template](using-cfn-waitcondition.md).

#### JSON
<a name="quickref-cloudformation-example-3.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Mappings" : {
 4.         "RegionMap" : {
 5.             "us-east-1" : {
 6.                 "AMI" : "ami-0123456789abcdef0"
 7.             },
 8.             "us-west-1" : {
 9.                 "AMI" : "ami-0987654321fedcba0"
10.             },
11.             "eu-west-1" : {
12.                 "AMI" : "ami-0abcdef123456789a"
13.             },
14.             "ap-northeast-1" : {
15.                 "AMI" : "ami-0fedcba987654321b"
16.             },
17.             "ap-southeast-1" : {
18.                 "AMI" : "ami-0c1d2e3f4a5b6c7d8"
19.             }
20.         }
21.     },
22.     "Resources" : {
23.         "Ec2Instance" : {
24.             "Type" : "AWS::EC2::Instance",
25.             "Properties" : {
26.                 "UserData" : { "Fn::Base64" : {"Ref" : "myWaitHandle"}},
27.                 "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}
28.             }
29.         },
30.         "myWaitHandle" : {
31.             "Type" : "AWS::CloudFormation::WaitConditionHandle",
32.             "Properties" : {
33.             }
34.         },
35.         "myWaitCondition" : {
36.             "Type" : "AWS::CloudFormation::WaitCondition",
37.             "DependsOn" : "Ec2Instance",
38.             "Properties" : {
39.                 "Handle" : { "Ref" : "myWaitHandle" },
40.                 "Timeout" : "4500"
41.             }
42.         }
43.     },
44.     "Outputs" : {
45.         "ApplicationData" : {
46.             "Value" : { "Fn::GetAtt" : [ "myWaitCondition", "Data" ]},
47.             "Description" : "The data passed back as part of signalling the WaitCondition."
48.         }
49.     }
50. }
```

#### YAML
<a name="quickref-cloudformation-example-3.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Mappings:
 3.   RegionMap:
 4.     us-east-1:
 5.       AMI: ami-0123456789abcdef0
 6.     us-west-1:
 7.       AMI: ami-0987654321fedcba0
 8.     eu-west-1:
 9.       AMI: ami-0abcdef123456789a
10.     ap-northeast-1:
11.       AMI: ami-0fedcba987654321b
12.     ap-southeast-1:
13.       AMI: ami-0c1d2e3f4a5b6c7d8
14. Resources:
15.   Ec2Instance:
16.     Type: AWS::EC2::Instance
17.     Properties:
18.       UserData:
19.         Fn::Base64: !Ref myWaitHandle
20.       ImageId:
21.         Fn::FindInMap:
22.         - RegionMap
23.         - Ref: AWS::Region
24.         - AMI
25.   myWaitHandle:
26.     Type: AWS::CloudFormation::WaitConditionHandle
27.     Properties: {}
28.   myWaitCondition:
29.     Type: AWS::CloudFormation::WaitCondition
30.     DependsOn: Ec2Instance
31.     Properties:
32.       Handle: !Ref myWaitHandle
33.       Timeout: '4500'
34. Outputs:
35.   ApplicationData:
36.     Value: !GetAtt myWaitCondition.Data
37.     Description: The data passed back as part of signalling the WaitCondition.
```

### Menggunakan skrip pembantu cfn-signal untuk memberi sinyal kondisi menunggu
<a name="scenario-waitcondition-cfn-signal"></a>

Contoh ini menunjukkan baris `cfn-signal` perintah yang menandakan keberhasilan untuk kondisi menunggu. Anda harus menentukan baris perintah di properti `UserData` instans EC2.

#### JSON
<a name="w2aac11c41c23b7b4b4"></a>

```
"UserData": {
  "Fn::Base64": {
    "Fn::Join": [
      "", 
      [
         "#!/bin/bash -xe\n",
         "/opt/aws/bin/cfn-signal --exit-code 0 '", 
         {
           "Ref": "myWaitHandle"
         },
         "'\n"
      ]   
    ]
  }
}
```

#### YAML
<a name="w2aac11c41c23b7b4b6"></a>

```
UserData:
  Fn::Base64: !Sub |
    #!/bin/bash -xe
    /opt/aws/bin/cfn-signal --exit-code 0 '${myWaitHandle}'
```

### Menggunakan Curl untuk memberikan sinyal kondisi menunggu
<a name="scenario-waitcondition-curl"></a>

Contoh ini menunjukkan baris perintah Curl yang memberikan sinyal berhasil ke kondisi menunggu.

```
1. curl -T /tmp/a "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
```

Tempat file /tmp/a mengandung struktur JSON berikut:

```
1. {
2.   "Status" : "SUCCESS",
3.   "Reason" : "Configuration Complete",
4.   "UniqueId" : "ID1234",
5.   "Data" : "Application has completed configuration."
6. }
```

Contoh ini menunjukkan baris perintah Curl yang mengirimkan sinyal berhasil yang sama tetapi mengirimkan JSON sebagai parameter pada baris perintah.

```
1. curl -X PUT -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
```

# Cuplikan CloudFront template Amazon
<a name="quickref-cloudfront"></a>

Gunakan contoh cuplikan templat ini dengan sumber daya CloudFront distribusi Amazon Anda di. CloudFormation Untuk informasi selengkapnya, lihat [referensi jenis CloudFront sumber daya Amazon](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudFront.html).

**Topics**
+ [Sumber daya CloudFront distribusi Amazon dengan asal Amazon S3](#scenario-cloudfront-s3origin)
+ [Sumber daya CloudFront distribusi Amazon dengan asal kustom](#scenario-cloudfront-customorigin)
+ [CloudFront Distribusi Amazon dengan dukungan multi-asal](#scenario-cloudfront-multiorigin)
+ [CloudFront Distribusi Amazon dengan fungsi Lambda sebagai asal](#scenario-cloudfront-lambda-origin)
+ [Lihat juga](#w2aac11c41c27c15)

## Sumber daya CloudFront distribusi Amazon dengan asal Amazon S3
<a name="scenario-cloudfront-s3origin"></a>

Contoh template berikut menunjukkan CloudFront [Distribusi](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) Amazon menggunakan [S3Origin dan identitas akses asal](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-s3originconfig.html) lama (OAI). Untuk informasi tentang menggunakan kontrol akses asal (OAC) sebagai gantinya, lihat [Membatasi akses ke asal Layanan Penyimpanan Sederhana Amazon di Panduan CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) *Pengembang Amazon*.

### JSON
<a name="quickref-cloudfront-example-1.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myDistribution" : {
 5.             "Type" : "AWS::CloudFront::Distribution",
 6.             "Properties" : {
 7.                 "DistributionConfig" : {
 8.                     "Origins" : [ {
 9.                         "DomainName" : "amzn-s3-demo-bucket.s3.amazonaws.com",
10.                         "Id" : "myS3Origin",
11.                         "S3OriginConfig" : {
12.                             "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
13.                         }
14.                     }],
15.                     "Enabled" : "true",
16.                     "Comment" : "Some comment",
17.                     "DefaultRootObject" : "index.html",
18.                     "Logging" : {
19.                         "IncludeCookies" : "false",
20.                         "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
21.                         "Prefix" : "myprefix"
22.                     },
23.                     "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],
24.                     "DefaultCacheBehavior" : {
25.                         "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
26.                         "TargetOriginId" : "myS3Origin",
27.                         "ForwardedValues" : {
28.                             "QueryString" : "false",
29.                             "Cookies" : { "Forward" : "none" }
30.                         },
31.                         "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
32.                         "ViewerProtocolPolicy" : "allow-all"
33.                     },
34.                    "PriceClass" : "PriceClass_200",
35.                    "Restrictions" : {
36.                        "GeoRestriction" : {
37.                            "RestrictionType" : "whitelist",
38.                            "Locations" : [ "AQ", "CV" ]
39.                        }
40.                    },
41.                    "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }  
42.                 }
43.             }
44.         }
45.     }
46. }
```

### YAML
<a name="quickref-cloudfront-example-1.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myDistribution:
 4.     Type: AWS::CloudFront::Distribution
 5.     Properties:
 6.       DistributionConfig:
 7.         Origins:
 8.         - DomainName: amzn-s3-demo-bucket.s3.amazonaws.com
 9.           Id: myS3Origin
10.           S3OriginConfig:
11.             OriginAccessIdentity: origin-access-identity/cloudfront/E127EXAMPLE51Z
12.         Enabled: 'true'
13.         Comment: Some comment
14.         DefaultRootObject: index.html
15.         Logging:
16.           IncludeCookies: 'false'
17.           Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
18.           Prefix: myprefix
19.         Aliases:
20.         - mysite.example.com
21.         - yoursite.example.com
22.         DefaultCacheBehavior:
23.           AllowedMethods:
24.           - DELETE
25.           - GET
26.           - HEAD
27.           - OPTIONS
28.           - PATCH
29.           - POST
30.           - PUT
31.           TargetOriginId: myS3Origin
32.           ForwardedValues:
33.             QueryString: 'false'
34.             Cookies:
35.               Forward: none
36.           TrustedSigners:
37.           - 1234567890EX
38.           - 1234567891EX
39.           ViewerProtocolPolicy: allow-all
40.         PriceClass: PriceClass_200
41.         Restrictions:
42.           GeoRestriction:
43.             RestrictionType: whitelist
44.             Locations:
45.             - AQ
46.             - CV
47.         ViewerCertificate:
48.           CloudFrontDefaultCertificate: 'true'
```

## Sumber daya CloudFront distribusi Amazon dengan asal kustom
<a name="scenario-cloudfront-customorigin"></a>

Contoh template berikut menunjukkan CloudFront [Distribusi](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) Amazon menggunakan file [CustomOrigin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-customoriginconfig.html).

### JSON
<a name="quickref-cloudfront-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myDistribution" : {
 5.             "Type" : "AWS::CloudFront::Distribution",
 6.             "Properties" : {
 7.                 "DistributionConfig" : {
 8.                     "Origins" : [ {
 9.                             "DomainName" : "www.example.com",
10.                             "Id" : "myCustomOrigin",
11.                             "CustomOriginConfig" : {
12.                                 "HTTPPort" : "80",
13.                                 "HTTPSPort" : "443",
14.                                 "OriginProtocolPolicy" : "http-only"
15.                             }
16.                     } ],
17.                     "Enabled" : "true",
18.                     "Comment" : "Somecomment",
19.                     "DefaultRootObject" : "index.html",
20.                     "Logging" : {
21.                         "IncludeCookies" : "true",
22.                         "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
23.                         "Prefix": "myprefix"
24.                     },
25.                     "Aliases" : [
26.                         "mysite.example.com",
27.                         "*.yoursite.example.com"
28.                     ],
29.                     "DefaultCacheBehavior" : {
30.                         "TargetOriginId" : "myCustomOrigin",
31.                         "SmoothStreaming" : "false",  
32.                         "ForwardedValues" : {
33.                             "QueryString" : "false",
34.                             "Cookies" : { "Forward" : "all" }
35.                         },
36.                         "TrustedSigners" : [
37.                             "1234567890EX",
38.                             "1234567891EX"
39.                         ],
40.                         "ViewerProtocolPolicy" : "allow-all"
41.                     },
42.                     "CustomErrorResponses" : [ {
43.                         "ErrorCode" : "404",
44.                         "ResponsePagePath" : "/error-pages/404.html",
45.                         "ResponseCode" : "200",
46.                         "ErrorCachingMinTTL" : "30"
47.                     } ],
48.                    "PriceClass" : "PriceClass_200",
49.                    "Restrictions" : {
50.                        "GeoRestriction" : {
51.                            "RestrictionType" : "whitelist",
52.                            "Locations" : [ "AQ", "CV" ]
53.                        }
54.                    },
55.                    "ViewerCertificate": { "CloudFrontDefaultCertificate" : "true" }
56.                 }
57.             }
58.         }
59.     }
60. }
```

### YAML
<a name="quickref-cloudfront-example-2.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myDistribution:
 4.     Type: AWS::CloudFront::Distribution
 5.     Properties:
 6.       DistributionConfig:
 7.         Origins:
 8.         - DomainName: www.example.com
 9.           Id: myCustomOrigin
10.           CustomOriginConfig:
11.             HTTPPort: '80'
12.             HTTPSPort: '443'
13.             OriginProtocolPolicy: http-only
14.         Enabled: 'true'
15.         Comment: Somecomment
16.         DefaultRootObject: index.html
17.         Logging:
18.           IncludeCookies: 'true'
19.           Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
20.           Prefix: myprefix
21.         Aliases:
22.         - mysite.example.com
23.         - "*.yoursite.example.com"
24.         DefaultCacheBehavior:
25.           TargetOriginId: myCustomOrigin
26.           SmoothStreaming: 'false'
27.           ForwardedValues:
28.             QueryString: 'false'
29.             Cookies:
30.               Forward: all
31.           TrustedSigners:
32.           - 1234567890EX
33.           - 1234567891EX
34.           ViewerProtocolPolicy: allow-all
35.         CustomErrorResponses:
36.         - ErrorCode: '404'
37.           ResponsePagePath: "/error-pages/404.html"
38.           ResponseCode: '200'
39.           ErrorCachingMinTTL: '30'
40.         PriceClass: PriceClass_200
41.         Restrictions:
42.           GeoRestriction:
43.             RestrictionType: whitelist
44.             Locations:
45.             - AQ
46.             - CV
47.         ViewerCertificate:
48.           CloudFrontDefaultCertificate: 'true'
```

## CloudFront Distribusi Amazon dengan dukungan multi-asal
<a name="scenario-cloudfront-multiorigin"></a>

Contoh template berikut menunjukkan cara mendeklarasikan CloudFront [Distribusi dengan dukungan](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) multi-asal. Dalam [DistributionConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-distributionconfig.html), daftar asal disediakan dan a [DefaultCacheBehavior](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-defaultcachebehavior.html)ditetapkan.

### JSON
<a name="quickref-cloudfront-example-3.json"></a>

```
{
    "AWSTemplateFormatVersion" : "2010-09-09",
    "Resources" : {
        "myDistribution" : {
            "Type" : "AWS::CloudFront::Distribution",
            "Properties" : {
                "DistributionConfig" : {
                    "Origins" : [ {
                        "Id" : "myS3Origin",
                        "DomainName" : "amzn-s3-demo-bucket.s3.amazonaws.com",
                        "S3OriginConfig" : {
                            "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
                        }
                     }, 
                     {
                         "Id" : "myCustomOrigin",
                         "DomainName" : "www.example.com",
                         "CustomOriginConfig" : {
                             "HTTPPort" : "80",
                             "HTTPSPort" : "443",
                             "OriginProtocolPolicy" : "http-only"
                         }
                     }
                   ],
                   "Enabled" : "true",
                   "Comment" : "Some comment",
                   "DefaultRootObject" : "index.html", 
                   "Logging" : {
                       "IncludeCookies" : "true",
                       "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
                       "Prefix" : "myprefix"
                   },            
                   "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],
                   "DefaultCacheBehavior" : {
                       "TargetOriginId" : "myS3Origin",
                       "ForwardedValues" : {
                           "QueryString" : "false",
                           "Cookies" : { "Forward" : "all" }
                        },
                       "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                       "ViewerProtocolPolicy" : "allow-all",
                       "MinTTL" : "100",
                       "SmoothStreaming" : "true"
                   },
                   "CacheBehaviors" : [ {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myS3Origin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images1/*.jpg"
                        }, 
                        {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myCustomOrigin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images2/*.jpg"
                        }
                   ],
                   "CustomErrorResponses" : [ {
                       "ErrorCode" : "404",
                       "ResponsePagePath" : "/error-pages/404.html",
                       "ResponseCode" : "200",
                       "ErrorCachingMinTTL" : "30"
                   } ],
                   "PriceClass" : "PriceClass_All",
                   "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }
                }
            }
        }
    }
}
```

### YAML
<a name="quickref-cloudfront-example-3.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
        - Id: myS3Origin
          DomainName: amzn-s3-demo-bucket.s3.amazonaws.com
          S3OriginConfig:
            OriginAccessIdentity: origin-access-identity/cloudfront/E127EXAMPLE51Z
        - Id: myCustomOrigin
          DomainName: www.example.com
          CustomOriginConfig:
            HTTPPort: '80'
            HTTPSPort: '443'
            OriginProtocolPolicy: http-only
        Enabled: 'true'
        Comment: Some comment
        DefaultRootObject: index.html
        Logging:
          IncludeCookies: 'true'
          Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
          Prefix: myprefix
        Aliases:
        - mysite.example.com
        - yoursite.example.com
        DefaultCacheBehavior:
          TargetOriginId: myS3Origin
          ForwardedValues:
            QueryString: 'false'
            Cookies:
              Forward: all
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '100'
          SmoothStreaming: 'true'
        CacheBehaviors:
        - AllowedMethods:
          - DELETE
          - GET
          - HEAD
          - OPTIONS
          - PATCH
          - POST
          - PUT
          TargetOriginId: myS3Origin
          ForwardedValues:
            QueryString: 'true'
            Cookies:
              Forward: none
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '50'
          PathPattern: images1/*.jpg
        - AllowedMethods:
          - DELETE
          - GET
          - HEAD
          - OPTIONS
          - PATCH
          - POST
          - PUT
          TargetOriginId: myCustomOrigin
          ForwardedValues:
            QueryString: 'true'
            Cookies:
              Forward: none
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '50'
          PathPattern: images2/*.jpg
        CustomErrorResponses:
        - ErrorCode: '404'
          ResponsePagePath: "/error-pages/404.html"
          ResponseCode: '200'
          ErrorCachingMinTTL: '30'
        PriceClass: PriceClass_All
        ViewerCertificate:
          CloudFrontDefaultCertificate: 'true'
```

## CloudFront Distribusi Amazon dengan fungsi Lambda sebagai asal
<a name="scenario-cloudfront-lambda-origin"></a>

Contoh berikut membuat CloudFront distribusi yang menampilkan URL fungsi Lambda tertentu (disediakan sebagai parameter), memungkinkan akses khusus HTTP, caching, kompresi, dan pengiriman global. Ini mengonfigurasi URL Lambda sebagai asal HTTPS khusus dan menerapkan kebijakan caching AWS standar. Distribusi dioptimalkan untuk kinerja dengan HTTP/2 dan IPv6 mendukung dan mengeluarkan nama CloudFront domain, memungkinkan pengguna untuk mengakses fungsi Lambda melalui titik akhir yang aman dan didukung CDN-nya. Untuk informasi selengkapnya, lihat [Menggunakan Amazon CloudFront dengan AWS Lambda sebagai asal untuk mempercepat aplikasi web Anda](https://aws.amazon.com/blogs/networking-and-content-delivery/using-amazon-cloudfront-with-aws-lambda-as-origin-to-accelerate-your-web-applications/) di AWS Blog.

### JSON
<a name="quickref-cloudfront-example-lambda-origin.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "LambdaEndpoint": {
            "Type": "String",
            "Description": "The Lambda function URL endpoint without the 'https://'"
        }
    },
    "Resources": {
        "MyDistribution": {
            "Type": "AWS::CloudFront::Distribution",
            "Properties": {
                "DistributionConfig": {
                    "PriceClass": "PriceClass_All",
                    "HttpVersion": "http2",
                    "IPV6Enabled": true,
                    "Origins": [
                        {
                            "DomainName": {
                                "Ref": "LambdaEndpoint"
                            },
                            "Id": "LambdaOrigin",
                            "CustomOriginConfig": {
                                "HTTPSPort": 443,
                                "OriginProtocolPolicy": "https-only"
                            }
                        }
                    ],
                    "Enabled": "true",
                    "DefaultCacheBehavior": {
                        "TargetOriginId": "LambdaOrigin",
                        "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
                        "ViewerProtocolPolicy": "redirect-to-https",
                        "SmoothStreaming": "false",
                        "Compress": "true"
                    }
                }
            }
        }
    },
    "Outputs": {
        "CloudFrontDomain": {
            "Description": "CloudFront default domain name configured",
            "Value": {
                "Fn::Sub": "https://${MyDistribution.DomainName}/"
            }
        }
    }
}
```

### YAML
<a name="quickref-cloudfront-example-lambda-origin.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  LambdaEndpoint:
    Type: String
    Description: The Lambda function URL endpoint without the 'https://'
Resources:
  MyDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        PriceClass: PriceClass_All
        HttpVersion: http2
        IPV6Enabled: true
        Origins:
        - DomainName: !Ref LambdaEndpoint
          Id: LambdaOrigin
          CustomOriginConfig:
            HTTPSPort: 443
            OriginProtocolPolicy: https-only
        Enabled: 'true'
        DefaultCacheBehavior:
          TargetOriginId: LambdaOrigin
          CachePolicyId: '658327ea-f89d-4fab-a63d-7e88639e58f6'
          ViewerProtocolPolicy: redirect-to-https
          SmoothStreaming: 'false'
          Compress: 'true'
Outputs:
  CloudFrontDomain:
    Description: CloudFront default domain name configured
    Value: !Sub https://${MyDistribution.DomainName}/
```

## Lihat juga
<a name="w2aac11c41c27c15"></a>

Untuk contoh menambahkan alias kustom ke catatan Route 53 untuk membuat nama ramah untuk CloudFront distribusi, lihat[Catatan sumber daya alias ditetapkan untuk distribusi CloudFront](quickref-route53.md#scenario-user-friendly-url-for-cloudfront-distribution).

# Cuplikan CloudWatch template Amazon
<a name="quickref-cloudwatch"></a>

Gunakan contoh cuplikan templat ini untuk membantu mendeskripsikan CloudWatch sumber daya Amazon Anda. CloudFormation Untuk informasi selengkapnya, lihat [referensi jenis CloudWatch sumber daya Amazon](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudWatch.html).

**Topics**
+ [Alarm penagihan](#cloudwatch-sample-billing-alarm)
+ [Alarm penggunaan CPU](#cloudwatch-sample-cpu-utilization-alarm)
+ [Memulihkan instans Amazon Elastic Compute Cloud](#cloudwatch-sample-recover-instance)
+ [Membuat dasbor dasar](#cloudwatch-sample-dashboard-basic)
+ [Buat dasbor dengan side-by-side widget](#cloudwatch-sample-dashboard-sidebyside)

## Alarm penagihan
<a name="cloudwatch-sample-billing-alarm"></a>

Dalam contoh berikut, Amazon CloudWatch mengirimkan pemberitahuan email ketika tagihan ke AWS akun Anda melebihi ambang batas alarm. Untuk menerima notifikasi penggunaan, aktifkan peringatan penagihan. Untuk informasi selengkapnya, lihat [Membuat alarm penagihan untuk memantau perkiraan AWS tagihan Anda](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) di *Panduan CloudWatch Pengguna Amazon*. >

### JSON
<a name="quickref-cloudwatch-example-1.json"></a>

```
"SpendingAlarm": {
  "Type": "AWS::CloudWatch::Alarm",
  "Properties": {
    "AlarmDescription": { "Fn::Join": ["", [
      "Alarm if AWS spending is over $",
      { "Ref": "AlarmThreshold" }
    ]]},
    "Namespace": "AWS/Billing",
    "MetricName": "EstimatedCharges",
    "Dimensions": [{
      "Name": "Currency",
      "Value" : "USD"
    }],
    "Statistic": "Maximum",
    "Period": "21600",
    "EvaluationPeriods": "1",
    "Threshold": { "Ref": "AlarmThreshold" },
    "ComparisonOperator": "GreaterThanThreshold",
    "AlarmActions": [{
      "Ref": "BillingAlarmNotification"
    }],
    "InsufficientDataActions": [{
      "Ref": "BillingAlarmNotification"
    }]
  }
}
```

### YAML
<a name="quickref-cloudwatch-example-1.yaml"></a>

```
SpendingAlarm:
  Type: AWS::CloudWatch::Alarm
  Properties:
    AlarmDescription: 
      'Fn::Join':
        - ''
        - - Alarm if AWS spending is over $
          - !Ref: AlarmThreshold
    Namespace: AWS/Billing
    MetricName: EstimatedCharges
    Dimensions:
    - Name: Currency
      Value: USD
    Statistic: Maximum
    Period: '21600'
    EvaluationPeriods: '1'
    Threshold:
      !Ref: "AlarmThreshold"
    ComparisonOperator: GreaterThanThreshold
    AlarmActions:
    - !Ref: "BillingAlarmNotification"
    InsufficientDataActions:
    - !Ref: "BillingAlarmNotification"
```

## Alarm penggunaan CPU
<a name="cloudwatch-sample-cpu-utilization-alarm"></a>

Contoh cuplikan berikut membuat alarm yang mengirimkan pemberitahuan ketika penggunaan CPU rata-rata instans Amazon EC2 melebihi 90 persen selama lebih dari 60 detik selama tiga periode evaluasi.

### JSON
<a name="quickref-cloudwatch-example-2.json"></a>

```
 1. "CPUAlarm" : {
 2.   "Type" : "AWS::CloudWatch::Alarm",
 3.   "Properties" : {
 4.     "AlarmDescription" : "CPU alarm for my instance",
 5.     "AlarmActions" : [ { "Ref" : "logical name of an AWS::SNS::Topic resource" } ],
 6.     "MetricName" : "CPUUtilization",
 7.     "Namespace" : "AWS/EC2",
 8.     "Statistic" : "Average",
 9.     "Period" : "60",
10.     "EvaluationPeriods" : "3",
11.     "Threshold" : "90",
12.     "ComparisonOperator" : "GreaterThanThreshold",
13.     "Dimensions" : [ {
14.       "Name" : "InstanceId",
15.       "Value" : { "Ref" : "logical name of an AWS::EC2::Instance resource" }
16.     } ]
17.   }
18. }
```

### YAML
<a name="quickref-cloudwatch-example-2.yaml"></a>

```
 1. CPUAlarm:
 2.   Type: AWS::CloudWatch::Alarm
 3.   Properties:
 4.     AlarmDescription: CPU alarm for my instance
 5.     AlarmActions:
 6.     - !Ref: "logical name of an AWS::SNS::Topic resource"
 7.     MetricName: CPUUtilization
 8.     Namespace: AWS/EC2
 9.     Statistic: Average
10.     Period: '60'
11.     EvaluationPeriods: '3'
12.     Threshold: '90'
13.     ComparisonOperator: GreaterThanThreshold
14.     Dimensions:
15.     - Name: InstanceId
16.       Value: !Ref: "logical name of an AWS::EC2::Instance resource"
```

## Memulihkan instans Amazon Elastic Compute Cloud
<a name="cloudwatch-sample-recover-instance"></a>

 CloudWatch Alarm berikut memulihkan instans EC2 ketika mengalami kegagalan pemeriksaan status selama 15 menit berturut-turut. Untuk informasi selengkapnya tentang tindakan alarm, lihat [Membuat alarm untuk menghentikan, menghentikan, mem-boot ulang, atau memulihkan instans EC2 di Panduan](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/UsingAlarmActions.html) Pengguna *Amazon CloudWatch *.

### JSON
<a name="quickref-cloudwatch-example-3.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters" : {
    "RecoveryInstance" : {
      "Description" : "The EC2 instance ID to associate this alarm with.",
      "Type" : "AWS::EC2::Instance::Id"
    }
  },
  "Resources": {
    "RecoveryTestAlarm": {
      "Type": "AWS::CloudWatch::Alarm",
      "Properties": {
        "AlarmDescription": "Trigger a recovery when instance status check fails for 15 consecutive minutes.",
        "Namespace": "AWS/EC2" ,
        "MetricName": "StatusCheckFailed_System",
        "Statistic": "Minimum",
        "Period": "60",
        "EvaluationPeriods": "15",
        "ComparisonOperator": "GreaterThanThreshold",
        "Threshold": "0",
        "AlarmActions": [ {"Fn::Join" : ["", ["arn:aws:automate:", { "Ref" : "AWS::Region" }, ":ec2:recover" ]]} ],
        "Dimensions": [{"Name": "InstanceId","Value": {"Ref": "RecoveryInstance"}}]
      }
    }
  }
}
```

### YAML
<a name="quickref-cloudwatch-example-3.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  RecoveryInstance:
    Description: The EC2 instance ID to associate this alarm with.
    Type: AWS::EC2::Instance::Id
Resources:
  RecoveryTestAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: Trigger a recovery when instance status check fails for 15
        consecutive minutes.
      Namespace: AWS/EC2
      MetricName: StatusCheckFailed_System
      Statistic: Minimum
      Period: '60'
      EvaluationPeriods: '15'
      ComparisonOperator: GreaterThanThreshold
      Threshold: '0'
      AlarmActions: [ !Sub "arn:aws:automate:${AWS::Region}:ec2:recover" ]
      Dimensions:
      - Name: InstanceId
        Value: !Ref: RecoveryInstance
```

## Membuat dasbor dasar
<a name="cloudwatch-sample-dashboard-basic"></a>

Contoh berikut membuat CloudWatch dasbor sederhana dengan satu widget metrik yang menampilkan pemanfaatan CPU, dan satu widget teks menampilkan pesan.

### JSON
<a name="quickref-cloudwatch-sample-dashboard-basic.json"></a>

```
{
    "BasicDashboard": {
        "Type": "AWS::CloudWatch::Dashboard",
        "Properties": {
            "DashboardName": "Dashboard1",
            "DashboardBody": "{\"widgets\":[{\"type\":\"metric\",\"x\":0,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/EC2\",\"CPUUtilization\",\"InstanceId\",\"i-012345\"]],\"period\":300,\"stat\":\"Average\",\"region\":\"us-east-1\",\"title\":\"EC2 Instance CPU\"}},{\"type\":\"text\",\"x\":0,\"y\":7,\"width\":3,\"height\":3,\"properties\":{\"markdown\":\"Hello world\"}}]}"
        }
    }
}
```

### YAML
<a name="quickref-cloudwatch-sample-dashboard-basic.yaml"></a>

```
BasicDashboard:
  Type: AWS::CloudWatch::Dashboard
  Properties:
    DashboardName: Dashboard1
    DashboardBody: '{"widgets":[{"type":"metric","x":0,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-012345"]],"period":300,"stat":"Average","region":"us-east-1","title":"EC2 Instance CPU"}},{"type":"text","x":0,"y":7,"width":3,"height":3,"properties":{"markdown":"Hello world"}}]}'
```

## Buat dasbor dengan side-by-side widget
<a name="cloudwatch-sample-dashboard-sidebyside"></a>

Contoh berikut membuat dasbor dengan dua widget metrik yang muncul berdampingan.

### JSON
<a name="quickref-cloudwatch-sample-dashboard-sidebyside.json"></a>

```
{
    "DashboardSideBySide": {
        "Type": "AWS::CloudWatch::Dashboard",
        "Properties": {
            "DashboardName": "Dashboard1",
            "DashboardBody": "{\"widgets\":[{\"type\":\"metric\",\"x\":0,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/EC2\",\"CPUUtilization\",\"InstanceId\",\"i-012345\"]],\"period\":300,\"stat\":\"Average\",\"region\":\"us-east-1\",\"title\":\"EC2 Instance CPU\"}},{\"type\":\"metric\",\"x\":12,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/S3\",\"BucketSizeBytes\",\"BucketName\",\"amzn-s3-demo-bucket\"]],\"period\":86400,\"stat\":\"Maximum\",\"region\":\"us-east-1\",\"title\":\"amzn-s3-demo-bucket bytes\"}}]}"
        }
    }
}
```

### YAML
<a name="quickref-cloudwatch-sample-dashboard-sidebysidequickref-cloudwatch-sample-dashboard-sidebyside.yaml"></a>

```
DashboardSideBySide:
  Type: AWS::CloudWatch::Dashboard
  Properties:
    DashboardName: Dashboard1
    DashboardBody: '{"widgets":[{"type":"metric","x":0,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-012345"]],"period":300,"stat":"Average","region":"us-east-1","title":"EC2 Instance CPU"}},{"type":"metric","x":12,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/S3","BucketSizeBytes","BucketName","amzn-s3-demo-bucket"]],"period":86400,"stat":"Maximum","region":"us-east-1","title":"amzn-s3-demo-bucket bytes"}}]}'
```

# Cuplikan templat Amazon CloudWatch Log
<a name="quickref-cloudwatchlogs"></a>

Amazon CloudWatch Logs dapat memantau sistem, aplikasi, dan file log kustom Anda dari instans Amazon EC2 atau sumber lain. Anda dapat menggunakan CloudFormation untuk menyediakan dan mengelola grup log dan filter metrik. Untuk informasi selengkapnya tentang CloudWatch Log Amazon, lihat [Panduan Pengguna CloudWatch Log Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html).

**Topics**
+ [Kirim CloudWatch log ke Log dari instance Linux](#quickref-cloudwatchlogs-example1)
+ [Kirim CloudWatch log ke Log dari instance Windows](#quickref-cloudwatchlogs-example2)
+ [Lihat juga](#w2aac11c41c35c11)

## Kirim CloudWatch log ke Log dari instance Linux
<a name="quickref-cloudwatchlogs-example1"></a>

Template berikut menunjukkan cara mengatur server web di Amazon Linux 2023 dengan integrasi CloudWatch Log. Template melakukan tugas-tugas berikut:
+ Menginstal Apache dan PHP.
+ Mengkonfigurasi CloudWatch agen untuk meneruskan log akses Apache ke CloudWatch Log.
+ Menyiapkan peran IAM untuk memungkinkan CloudWatch agen mengirim data log ke CloudWatch Log.
+ Membuat alarm dan notifikasi khusus untuk memantau kesalahan 404 atau penggunaan bandwidth tinggi.

Peristiwa log dari server web menyediakan data metrik untuk CloudWatch alarm. Dua filter metrik menjelaskan bagaimana informasi log diubah menjadi CloudWatch metrik. Metrik 404 menghitung jumlah kejadian 404. Metrik ukuran melacak ukuran permintaan. Kedua CloudWatch alarm akan mengirimkan pemberitahuan jika ada lebih dari dua 404 dalam waktu 2 menit atau jika ukuran permintaan rata-rata lebih dari 3500 KB selama 10 menit.

### JSON
<a name="quickref-cloudwatchlogs-example.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Sample template that sets up and configures CloudWatch Logs on Amazon Linux 2023 instance.",
    "Parameters": {
        "KeyName": {
            "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },
        "SSHLocation": {
            "Description": "The IP address range that can be used to SSH to the EC2 instances",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
            "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
        },
        "OperatorEmail": {
            "Description": "Email address to notify when CloudWatch alarms are triggered (404 errors or high bandwidth usage)",
            "Type": "String"
        }
    },
    "Resources": {
        "LogRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "LogRolePolicy",
                        "PolicyDocument": {
                            "Version": "2012-10-17",		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:PutLogEvents",
                                        "logs:DescribeLogStreams",
                                        "logs:DescribeLogGroups",
                                        "logs:CreateLogGroup",
                                        "logs:CreateLogStream"
                                    ],
                                    "Resource": "*"
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "LogRoleInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Path": "/",
                "Roles": [{"Ref": "LogRole"}]
            }
        },
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable HTTP access via port 80 and SSH access via port 22",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": {"Ref": "SSHLocation"}
                    }
                ]
            }
        },
        "WebServerHost": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "Comment": "Install a simple PHP application on Amazon Linux 2023",
                "AWS::CloudFormation::Init": {
                    "config": {
                        "packages": {
                            "dnf": {
                                "httpd": [],
                                "php": [],
                                "php-fpm": []
                            }
                        },
                        "files": {
                            "/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json": {
                                "content": {
                                    "logs": {
                                        "logs_collected": {
                                            "files": {
                                                "collect_list": [{
                                                    "file_path": "/var/log/httpd/access_log",
                                                    "log_group_name": {"Ref": "WebServerLogGroup"},
                                                    "log_stream_name": "{instance_id}/apache.log",
                                                    "timestamp_format": "%d/%b/%Y:%H:%M:%S %z"
                                                }]
                                            }
                                        }
                                    }
                                },
                                "mode": "000644",
                                "owner": "root",
                                "group": "root"
                            },
                            "/var/www/html/index.php": {
                                "content": "<?php\necho '<h1>AWS CloudFormation sample PHP application on Amazon Linux 2023</h1>';\n?>\n",
                                "mode": "000644",
                                "owner": "apache",
                                "group": "apache"
                            },
                            "/etc/cfn/cfn-hup.conf": {
                                "content":  {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[main]\n",
                                            "stack=",
                                            {"Ref": "AWS::StackId"},
                                            "\n",
                                            "region=",
                                            {"Ref": "AWS::Region"},
                                            "\n"
                                        ]
                                    ]
                                },
                                "mode": "000400",
                                "owner": "root",
                                "group": "root"
                            },
                            "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[cfn-auto-reloader-hook]\n",
                                            "triggers=post.update\n",
                                            "path=Resources.WebServerHost.Metadata.AWS::CloudFormation::Init\n",
                                            "action=/opt/aws/bin/cfn-init -s ",
                                            {"Ref": "AWS::StackId"},
                                            " -r WebServerHost ",
                                            " --region     ",
                                            {"Ref": "AWS::Region"},
                                            "\n",
                                            "runas=root\n"
                                        ]
                                    ]
                                }
                            }
                        },
                        "services": {
                            "systemd": {
                                "httpd": {
                                    "enabled": "true",
                                    "ensureRunning": "true"
                                },
                                "php-fpm": {
                                    "enabled": "true",
                                    "ensureRunning": "true"
                                }
                            }
                        }
                    }
                }
            },
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT5M"
                }
            },
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
                "KeyName": {"Ref": "KeyName"},
                "InstanceType": "t3.micro",
                "SecurityGroupIds": [{"Ref": "WebServerSecurityGroup"}],
                "IamInstanceProfile": {"Ref": "LogRoleInstanceProfile"},
                "UserData": {"Fn::Base64": {"Fn::Join": [ "", [
                    "#!/bin/bash\n",
                    "dnf update -y aws-cfn-bootstrap\n",
                    "dnf install -y amazon-cloudwatch-agent\n",
                    "/opt/aws/bin/cfn-init -v --stack ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, "\n",
                    "\n",
                    "# Verify Apache log directory exists and create if needed\n",
                    "mkdir -p /var/log/httpd\n",
                    "\n",
                    "# Start CloudWatch agent\n",
                    "/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json -s\n",
                    "\n",
                    "# Signal success\n",
                    "/opt/aws/bin/cfn-signal -e $? --stack ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, "\n"
                ]]}}
            }
        },
        "WebServerLogGroup": {
            "Type": "AWS::Logs::LogGroup",
            "DeletionPolicy": "Retain",
            "UpdateReplacePolicy": "Retain",
            "Properties": {
                "RetentionInDays": 7
            }
        },
        "404MetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "WebServerLogGroup"},
                "FilterPattern": "[ip, identity, user_id, timestamp, request, status_code = 404, size, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "1",
                        "MetricNamespace": "test/404s",
                        "MetricName": "test404Count"
                    }
                ]
            }
        },
        "BytesTransferredMetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "WebServerLogGroup"},
                "FilterPattern": "[ip, identity, user_id, timestamp, request, status_code, size, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "$size",
                        "MetricNamespace": "test/BytesTransferred",
                        "MetricName": "testBytesTransferred"
                    }
                ]
            }
        },
        "404Alarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The number of 404s is greater than 2 over 2 minutes",
                "MetricName": "test404Count",
                "Namespace": "test/404s",
                "Statistic": "Sum",
                "Period": "60",
                "EvaluationPeriods": "2",
                "Threshold": "2",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "BandwidthAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The average volume of traffic is greater 3500 KB over 10 minutes",
                "MetricName": "testBytesTransferred",
                "Namespace": "test/BytesTransferred",
                "Statistic": "Average",
                "Period": "300",
                "EvaluationPeriods": "2",
                "Threshold": "3500",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "AlarmNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "Subscription": [{"Endpoint": {"Ref": "OperatorEmail"}, "Protocol": "email"}]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Description": "The instance ID of the web server",
            "Value": {"Ref": "WebServerHost"}
        },
        "WebsiteURL": {
            "Value": {"Fn::Sub": "http://${WebServerHost.PublicDnsName}"},
            "Description": "URL for the web server"
        },
        "PublicIP": {
            "Description": "Public IP address of the web server",
            "Value": {"Fn::GetAtt": ["WebServerHost","PublicIp"]
            }
        },
        "CloudWatchLogGroupName": {
            "Description": "The name of the CloudWatch log group",
            "Value": {"Ref": "WebServerLogGroup"}
        }
    }
}
```

### YAML
<a name="quickref-cloudwatchlogs-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: Sample template that sets up and configures CloudWatch Logs on Amazon Linux 2023 instance.
Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  OperatorEmail:
    Description: Email address to notify when CloudWatch alarms are triggered (404 errors or high bandwidth usage)
    Type: String
Resources:
  LogRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: LogRolePolicy
          PolicyDocument:
            Version: 2012-10-17		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:PutLogEvents'
                  - 'logs:DescribeLogStreams'
                  - 'logs:DescribeLogGroups'
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                Resource: '*'
  LogRoleInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref LogRole
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
  WebServerHost:
    Type: AWS::EC2::Instance
    Metadata:
      Comment: Install a simple PHP application on Amazon Linux 2023
      'AWS::CloudFormation::Init':
        config:
          packages:
            dnf:
              httpd: []
              php: []
              php-fpm: []
          files:
            /etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json:
              content: !Sub |
                {
                  "logs": {
                    "logs_collected": {
                      "files": {
                        "collect_list": [
                          {
                            "file_path": "/var/log/httpd/access_log",
                            "log_group_name": "${WebServerLogGroup}",
                            "log_stream_name": "{instance_id}/apache.log",
                            "timestamp_format": "%d/%b/%Y:%H:%M:%S %z"
                          }
                        ]
                      }
                    }
                  }
                }
              mode: '000644'
              owner: root
              group: root
            /var/www/html/index.php:
              content: |
                <?php echo '<h1>AWS CloudFormation sample PHP application on Amazon Linux 2023</h1>';
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerHost.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerHost --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              php-fpm:
                enabled: 'true'
                ensureRunning: 'true'
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      KeyName: !Ref KeyName
      InstanceType: t3.micro
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      IamInstanceProfile: !Ref LogRoleInstanceProfile
      UserData: !Base64
        Fn::Sub: |
          #!/bin/bash
          dnf update -y aws-cfn-bootstrap
          dnf install -y amazon-cloudwatch-agent
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerHost --region ${AWS::Region}
          
          # Verify Apache log directory exists and create if needed
          mkdir -p /var/log/httpd
          
          # Start CloudWatch agent
          /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json -s
          
          # Signal success
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerHost --region ${AWS::Region}
          echo "Done"
  WebServerLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    Properties:
      RetentionInDays: 7
  404MetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref WebServerLogGroup
      FilterPattern: >-
        [ip, identity, user_id, timestamp, request, status_code = 404, size, ...]
      MetricTransformations:
        - MetricValue: '1'
          MetricNamespace: test/404s
          MetricName: test404Count
  BytesTransferredMetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref WebServerLogGroup
      FilterPattern: '[ip, identity, user_id, timestamp, request, status_code, size, ...]'
      MetricTransformations:
        - MetricValue: $size
          MetricNamespace: test/BytesTransferred
          MetricName: testBytesTransferred
  404Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The number of 404s is greater than 2 over 2 minutes
      MetricName: test404Count
      Namespace: test/404s
      Statistic: Sum
      Period: '60'
      EvaluationPeriods: '2'
      Threshold: '2'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  BandwidthAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The average volume of traffic is greater 3500 KB over 10 minutes
      MetricName: testBytesTransferred
      Namespace: test/BytesTransferred
      Statistic: Average
      Period: '300'
      EvaluationPeriods: '2'
      Threshold: '3500'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  AlarmNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
Outputs:
  InstanceId:
    Description: The instance ID of the web server
    Value: !Ref WebServerHost
  WebsiteURL:
    Value: !Sub 'http://${WebServerHost.PublicDnsName}'
    Description: URL for the web server
  PublicIP:
    Description: Public IP address of the web server
    Value: !GetAtt WebServerHost.PublicIp
  CloudWatchLogGroupName:
    Description: The name of the CloudWatch log group
    Value: !Ref WebServerLogGroup
```

## Kirim CloudWatch log ke Log dari instance Windows
<a name="quickref-cloudwatchlogs-example2"></a>

Template berikut mengkonfigurasi CloudWatch Log untuk instance Windows 2012R2.

Agen CloudWatch Log di Windows (agen SSM di Windows 2012R2 dan Windows 2016 AMIs) hanya mengirim log setelah dimulai, jadi log apa pun yang dihasilkan sebelum startup tidak dikirim. Untuk mengatasi ini, templat membantu untuk memastikan agar agen dimulai sebelum log ditulis oleh:
+ Pengonfigurasian penyiapan agen sebagai item `config` yang pertama dalam `configSets` cfn-init.
+ Penggunaan `waitAfterCompletion` untuk menyisipkan jeda setelah perintah yang memulai agen.

### JSON
<a name="quickref-cloudwatchlogs-example2.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Sample template that sets up and configures CloudWatch Logs on Windows 2012R2 instance.",
    "Parameters": {
        "KeyPair": {
            "Description": "Name of an existing EC2 KeyPair to enable RDP access to the instances",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },
        "RDPLocation": {
            "Description": "The IP address range that can be used to RDP to the EC2 instances",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
            "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
        },
        "OperatorEmail": {
            "Description": "Email address to notify when CloudWatch alarms are triggered (404 errors)",
            "Type": "String"
        }
    },
    "Resources": {
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable HTTP access via port 80 and RDP access via port 3389",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "80",
                        "ToPort": "80",
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {"Ref": "RDPLocation"}
                    }
                ]
            }
        },
        "LogRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
                ],
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "LogRolePolicy",
                        "PolicyDocument": {
                            "Version": "2012-10-17",		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:Create*",
                                        "logs:PutLogEvents",
                                        "s3:GetObject"
                                    ],
                                    "Resource": [
                                        "arn:aws:logs:*:*:*",
                                        "arn:aws:s3:::*"
                                    ]
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "LogRoleInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Path": "/",
                "Roles": [{"Ref": "LogRole"}]
            }
        },
        "WebServerHost": {
            "Type": "AWS::EC2::Instance",
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT15M"
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "config": [
                            "00-ConfigureCWLogs",
                            "01-InstallWebServer",
                            "02-ConfigureApplication",
                            "03-Finalize"
                        ]
                    },
                    "00-ConfigureCWLogs": {
                        "files": {
                            "C:\\Program Files\\Amazon\\SSM\\Plugins\\awsCloudWatch\\AWS.EC2.Windows.CloudWatch.json": {
                                "content": {
                                    "EngineConfiguration": {
                                        "Components": [
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "ApplicationEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "Application"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "SystemEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "System"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "SecurityEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "Security"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "EC2ConfigLog",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "ASCII",
                                                    "Filter": "EC2ConfigLog.txt",
                                                    "LogDirectoryPath": "C:\\Program Files\\Amazon\\Ec2ConfigService\\Logs",
                                                    "TimeZoneKind": "UTC",
                                                    "TimestampFormat": "yyyy-MM-ddTHH:mm:ss.fffZ:"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CfnInitLog",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "ASCII",
                                                    "Filter": "cfn-init.log",
                                                    "LogDirectoryPath": "C:\\cfn\\log",
                                                    "TimeZoneKind": "Local",
                                                    "TimestampFormat": "yyyy-MM-dd HH:mm:ss,fff"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "IISLogs",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "UTF-8",
                                                    "Filter": "",
                                                    "LineCount": "3",
                                                    "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
                                                    "TimeZoneKind": "UTC",
                                                    "TimestampFormat": "yyyy-MM-dd HH:mm:ss"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "MemoryPerformanceCounter",
                                                "Parameters": {
                                                    "CategoryName": "Memory",
                                                    "CounterName": "Available MBytes",
                                                    "DimensionName": "",
                                                    "DimensionValue": "",
                                                    "InstanceName": "",
                                                    "MetricName": "Memory",
                                                    "Unit": "Megabytes"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchApplicationEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/ApplicationEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchSystemEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/SystemEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchSecurityEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/SecurityEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchEC2ConfigLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/EC2ConfigLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchCfnInitLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/CfnInitLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchIISLogs",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/IISLogs",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatch",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "NameSpace": "Windows/Default",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            }
                                        ],
                                        "Flows": {
                                            "Flows": [
                                                "ApplicationEventLog,CloudWatchApplicationEventLog",
                                                "SystemEventLog,CloudWatchSystemEventLog",
                                                "SecurityEventLog,CloudWatchSecurityEventLog",
                                                "EC2ConfigLog,CloudWatchEC2ConfigLog",
                                                "CfnInitLog,CloudWatchCfnInitLog",
                                                "IISLogs,CloudWatchIISLogs",
                                                "MemoryPerformanceCounter,CloudWatch"
                                            ]
                                        },
                                        "PollInterval": "00:00:05"
                                    },
                                    "IsEnabled": true
                                }
                            }
                        },
                        "commands": {
                            "0-enableSSM": {
                                "command": "powershell.exe -Command \"Set-Service -Name AmazonSSMAgent -StartupType Automatic\" ",
                                "waitAfterCompletion": "0"
                            },
                            "1-restartSSM": {
                                "command": "powershell.exe -Command \"Restart-Service AmazonSSMAgent \"",
                                "waitAfterCompletion": "30"
                            }
                        }
                    },
                    "01-InstallWebServer": {
                        "commands": {
                            "01_install_webserver": {
                                "command": "powershell.exe -Command \"Install-WindowsFeature Web-Server  -IncludeAllSubFeature\"",
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "02-ConfigureApplication": {
                        "files": {
                            "c:\\Inetpub\\wwwroot\\index.htm": {
                                "content": "<html> <head> <title>Test Application Page</title> </head> <body> <h1>Congratulations!! Your IIS server is configured.</h1> </body> </html>"
                            }
                        }
                    },
                    "03-Finalize": {
                        "commands": {
                            "00_signal_success": {
                                "command": {
                                    "Fn::Sub": "cfn-signal.exe -e 0 --resource WebServerHost --stack ${AWS::StackName} --region ${AWS::Region}"
                                },
                                "waitAfterCompletion": "0"
                            }
                        }
                    }
                }
            },
            "Properties": {
                "KeyName": {
                    "Ref": "KeyPair"
                },
                "ImageId": "{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-English-64Bit-Base}}",
                "InstanceType": "t2.xlarge",
                "SecurityGroupIds": [{"Ref": "WebServerSecurityGroup"}],
                "IamInstanceProfile": {"Ref": "LogRoleInstanceProfile"},
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "<script>\n",
                                "wmic product where \"description='Amazon SSM Agent' \" uninstall\n",
                                "wmic product where \"description='aws-cfn-bootstrap' \" uninstall \n",
                                "start /wait c:\\Windows\\system32\\msiexec /passive /qn /i https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-win64-latest.msi\n",
                                "powershell.exe -Command \"iwr https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/windows_amd64/AmazonSSMAgentSetup.exe  -UseBasicParsing -OutFile C:\\AmazonSSMAgentSetup.exe\"\n",
                                "start /wait C:\\AmazonSSMAgentSetup.exe /install /quiet\n",
                                "cfn-init.exe -v -c config -s ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, " \n",
                                "</script>\n"
                            ]
                        ]
                    }
                }
            }
        },
        "LogGroup": {
            "Type": "AWS::Logs::LogGroup",
            "Properties": {
                "RetentionInDays": 7
            }
        },
        "404MetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "LogGroup"},
                "FilterPattern": "[timestamps, serverip, method, uri, query, port, dash, clientip, useragent, status_code = 404, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "1",
                        "MetricNamespace": "test/404s",
                        "MetricName": "test404Count"
                    }
                ]
            }
        },
        "404Alarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The number of 404s is greater than 2 over 2 minutes",
                "MetricName": "test404Count",
                "Namespace": "test/404s",
                "Statistic": "Sum",
                "Period": "60",
                "EvaluationPeriods": "2",
                "Threshold": "2",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "AlarmNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "Subscription": [{"Endpoint": {"Ref": "OperatorEmail"}, "Protocol": "email"}]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Description": "The instance ID of the web server",
            "Value": {"Ref": "WebServerHost"}
        },
        "WebsiteURL": {
            "Value": {"Fn::Sub": "http://${WebServerHost.PublicDnsName}"},
            "Description": "URL for the web server"
        },
        "PublicIP": {
            "Description": "Public IP address of the web server",
            "Value": {"Fn::GetAtt": ["WebServerHost","PublicIp"]}
        },
        "CloudWatchLogGroupName": {
            "Description": "The name of the CloudWatch log group",
            "Value": {"Ref": "LogGroup"}
        }
    }
}
```

### YAML
<a name="quickref-cloudwatchlogs-example2.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: >-
  Sample template that sets up and configures CloudWatch Logs on Windows 2012R2 instance.
Parameters:
  KeyPair:
    Description: Name of an existing EC2 KeyPair to enable RDP access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  RDPLocation:
    Description: The IP address range that can be used to RDP to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  OperatorEmail:
    Description: Email address to notify when CloudWatch alarms are triggered (404 errors)
    Type: String
Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and RDP access via port 3389
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: '3389'
          ToPort: '3389'
          CidrIp: !Ref RDPLocation
  LogRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore'
      Path: /
      Policies:
        - PolicyName: LogRolePolicy
          PolicyDocument:
            Version: 2012-10-17		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:Create*'
                  - 'logs:PutLogEvents'
                  - 's3:GetObject'
                Resource:
                  - 'arn:aws:logs:*:*:*'
                  - 'arn:aws:s3:::*'
  LogRoleInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref LogRole
  WebServerHost:
    Type: AWS::EC2::Instance
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
    Metadata:
      'AWS::CloudFormation::Init':
        configSets:
          config:
            - 00-ConfigureCWLogs
            - 01-InstallWebServer
            - 02-ConfigureApplication
            - 03-Finalize
        00-ConfigureCWLogs:
          files:
            'C:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\AWS.EC2.Windows.CloudWatch.json':
              content: !Sub |
                {
                  "EngineConfiguration": {
                      "Components": [
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "ApplicationEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "Application"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "SystemEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "System"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "SecurityEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "Security"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "EC2ConfigLog",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "ASCII",
                                  "Filter": "EC2ConfigLog.txt",
                                  "LogDirectoryPath": "C:\\Program Files\\Amazon\\Ec2ConfigService\\Logs",
                                  "TimeZoneKind": "UTC",
                                  "TimestampFormat": "yyyy-MM-ddTHH:mm:ss.fffZ:"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "CfnInitLog",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "ASCII",
                                  "Filter": "cfn-init.log",
                                  "LogDirectoryPath": "C:\\cfn\\log",
                                  "TimeZoneKind": "Local",
                                  "TimestampFormat": "yyyy-MM-dd HH:mm:ss,fff"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "IISLogs",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "UTF-8",
                                  "Filter": "",
                                  "LineCount": "3",
                                  "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
                                  "TimeZoneKind": "UTC",
                                  "TimestampFormat": "yyyy-MM-dd HH:mm:ss"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "MemoryPerformanceCounter",
                              "Parameters": {
                                  "CategoryName": "Memory",
                                  "CounterName": "Available MBytes",
                                  "DimensionName": "",
                                  "DimensionValue": "",
                                  "InstanceName": "",
                                  "MetricName": "Memory",
                                  "Unit": "Megabytes"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchApplicationEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/ApplicationEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchSystemEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/SystemEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchSecurityEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/SecurityEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchEC2ConfigLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/EC2ConfigLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchCfnInitLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/CfnInitLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchIISLogs",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/IISLogs",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatch",
                              "Parameters": {
                                  "AccessKey": "",
                                  "NameSpace": "Windows/Default",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          }
                      ],
                      "Flows": {
                          "Flows": [
                              "ApplicationEventLog,CloudWatchApplicationEventLog",
                              "SystemEventLog,CloudWatchSystemEventLog",
                              "SecurityEventLog,CloudWatchSecurityEventLog",
                              "EC2ConfigLog,CloudWatchEC2ConfigLog",
                              "CfnInitLog,CloudWatchCfnInitLog",
                              "IISLogs,CloudWatchIISLogs",
                              "MemoryPerformanceCounter,CloudWatch"
                          ]
                      },
                      "PollInterval": "00:00:05"
                  },
                  "IsEnabled": true
                }
          commands:
            0-enableSSM:
              command: >-
                powershell.exe -Command "Set-Service -Name AmazonSSMAgent
                -StartupType Automatic" 
              waitAfterCompletion: '0'
            1-restartSSM:
              command: powershell.exe -Command "Restart-Service AmazonSSMAgent "
              waitAfterCompletion: '30'
        01-InstallWebServer:
          commands:
            01_install_webserver:
              command: >-
                powershell.exe -Command "Install-WindowsFeature Web-Server 
                -IncludeAllSubFeature"
              waitAfterCompletion: '0'
        02-ConfigureApplication:
          files:
            'c:\Inetpub\wwwroot\index.htm':
              content: >-
                <html> <head> <title>Test Application Page</title> </head>
                <body> <h1>Congratulations !! Your IIS server is
                configured.</h1> </body> </html>
        03-Finalize:
          commands:
            00_signal_success:
              command: !Sub >-
                cfn-signal.exe -e 0 --resource WebServerHost --stack
                ${AWS::StackName} --region ${AWS::Region}
              waitAfterCompletion: '0'
    Properties:
      KeyName: !Ref KeyPair
      ImageId: "{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-English-64Bit-Base}}"
      InstanceType: t2.xlarge
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      IamInstanceProfile: !Ref LogRoleInstanceProfile
      UserData: !Base64 
        'Fn::Sub': >
          <script>

          wmic product where "description='Amazon SSM Agent' " uninstall

          wmic product where "description='aws-cfn-bootstrap' " uninstall 

          start /wait c:\\Windows\\system32\\msiexec /passive /qn /i
          https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-win64-latest.msi

          powershell.exe -Command "iwr
          https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/windows_amd64/AmazonSSMAgentSetup.exe 
          -UseBasicParsing -OutFile C:\\AmazonSSMAgentSetup.exe"

          start /wait C:\\AmazonSSMAgentSetup.exe /install /quiet

          cfn-init.exe -v -c config -s ${AWS::StackName} --resource
          WebServerHost --region ${AWS::Region} 

          </script>
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      RetentionInDays: 7
  404MetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref LogGroup
      FilterPattern: >-
        [timestamps, serverip, method, uri, query, port, dash, clientip,
        useragent, status_code = 404, ...]
      MetricTransformations:
        - MetricValue: '1'
          MetricNamespace: test/404s
          MetricName: test404Count
  404Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The number of 404s is greater than 2 over 2 minutes
      MetricName: test404Count
      Namespace: test/404s
      Statistic: Sum
      Period: '60'
      EvaluationPeriods: '2'
      Threshold: '2'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  AlarmNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
Outputs:
  InstanceId:
    Description: The instance ID of the web server
    Value: !Ref WebServerHost
  WebsiteURL:
    Value: !Sub 'http://${WebServerHost.PublicDnsName}'
    Description: URL for the web server
  PublicIP:
    Description: Public IP address of the web server
    Value: !GetAtt 
      - WebServerHost
      - PublicIp
  CloudWatchLogGroupName:
    Description: The name of the CloudWatch log group
    Value: !Ref LogGroup
```

## Lihat juga
<a name="w2aac11c41c35c11"></a>

Untuk informasi selengkapnya tentang sumber daya CloudWatch Log, lihat [AWS::Logs::LogGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-loggroup.html)atau [AWS::Logs::MetricFilter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-metricfilter.html).

# Cuplikan template Amazon DynamoDB
<a name="quickref-dynamodb"></a>

**Topics**
+ [Application Auto Scaling dengan tabel Amazon DynamoDB](#quickref-dynamodb-application-autoscaling)
+ [Lihat juga](#w2aac11c41c39b7)

## Application Auto Scaling dengan tabel Amazon DynamoDB
<a name="quickref-dynamodb-application-autoscaling"></a>

Contoh ini menetapkan Application Auto Scaling untuk sumber daya `AWS::DynamoDB::Table`. Templat tersebut menentukan kebijakan penskalaan `TargetTrackingScaling` yang menaikkan skala throughput `WriteCapacityUnits` untuk tabel.

### JSON
<a name="quickref-dynamodb-example.json"></a>

```
{
    "Resources": {
        "DDBTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "AttributeDefinitions": [
                    {
                        "AttributeName": "ArtistId",
                        "AttributeType": "S"
                    },
                    {
                        "AttributeName": "Concert",
                        "AttributeType": "S"
                    },
                    {
                        "AttributeName": "TicketSales",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "ArtistId",
                        "KeyType": "HASH"
                    },
                    {
                        "AttributeName": "Concert",
                        "KeyType": "RANGE"
                    }
                ],
                "GlobalSecondaryIndexes": [
                    {
                        "IndexName": "GSI",
                        "KeySchema": [
                            {
                                "AttributeName": "TicketSales",
                                "KeyType": "HASH"
                            }
                        ],
                        "Projection": {
                            "ProjectionType": "KEYS_ONLY"
                        },
                        "ProvisionedThroughput": {
                            "ReadCapacityUnits": 5,
                            "WriteCapacityUnits": 5
                        }
                    }
                ],
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 5
                }
            }
        },
        "WriteCapacityScalableTarget": {
            "Type": "AWS::ApplicationAutoScaling::ScalableTarget",
            "Properties": {
                "MaxCapacity": 15,
                "MinCapacity": 5,
                "ResourceId": {
                    "Fn::Join": [
                        "/",
                        [
                            "table",
                            {
                                "Ref": "DDBTable"
                            }
                        ]
                    ]
                },
                "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable" },
                "ScalableDimension": "dynamodb:table:WriteCapacityUnits",
                "ServiceNamespace": "dynamodb"
            }
        },
        "WriteScalingPolicy": {
            "Type": "AWS::ApplicationAutoScaling::ScalingPolicy",
            "Properties": {
                "PolicyName": "WriteAutoScalingPolicy",
                "PolicyType": "TargetTrackingScaling",
                "ScalingTargetId": {
                    "Ref": "WriteCapacityScalableTarget"
                },
                "TargetTrackingScalingPolicyConfiguration": {
                    "TargetValue": 50,
                    "ScaleInCooldown": 60,
                    "ScaleOutCooldown": 60,
                    "PredefinedMetricSpecification": {
                        "PredefinedMetricType": "DynamoDBWriteCapacityUtilization"
                    }
                }
            }
        }
    }
}
```

### YAML
<a name="quickref-dynamodb-example.yaml"></a>

```
Resources:
  DDBTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: "ArtistId"
          AttributeType: "S"
        - AttributeName: "Concert"
          AttributeType: "S"
        - AttributeName: "TicketSales"
          AttributeType: "S"
      KeySchema:
        - AttributeName: "ArtistId"
          KeyType: "HASH"
        - AttributeName: "Concert"
          KeyType: "RANGE"
      GlobalSecondaryIndexes:
        - IndexName: "GSI"
          KeySchema:
            - AttributeName: "TicketSales"
              KeyType: "HASH"
          Projection:
            ProjectionType: "KEYS_ONLY"
          ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 5
  WriteCapacityScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 15
      MinCapacity: 5
      ResourceId: !Join
        - /
        - - table
          - !Ref DDBTable
      RoleARN:
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
      ScalableDimension: dynamodb:table:WriteCapacityUnits
      ServiceNamespace: dynamodb
  WriteScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: WriteAutoScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref WriteCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 50.0
        ScaleInCooldown: 60
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBWriteCapacityUtilization
```

## Lihat juga
<a name="w2aac11c41c39b7"></a>

Untuk informasi selengkapnya, lihat posting blog [Cara menggunakan CloudFormation untuk mengonfigurasi penskalaan otomatis untuk tabel dan indeks DynamoDB](https://aws.amazon.com/blogs/database/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/) di Blog Database. AWS 

Untuk informasi selengkapnya tentang sumber daya DynamoDB, lihat. [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html)

# Cuplikan EC2 CloudFormation template Amazon
<a name="quickref-ec2"></a>

Amazon EC2 menyediakan kapasitas komputasi yang dapat diskalakan di. AWS Cloud Anda dapat menggunakan Amazon EC2 untuk meluncurkan server virtual sebanyak atau sesedikit yang Anda butuhkan, mengonfigurasi keamanan dan jaringan, dan mengelola penyimpanan. Server virtual ini, yang dikenal sebagai instance, dapat menjalankan berbagai sistem operasi dan aplikasi, dan dapat disesuaikan untuk memenuhi kebutuhan spesifik Anda. Amazon EC2 memungkinkan Anda meningkatkan atau menurunkan skala untuk menangani perubahan persyaratan atau lonjakan penggunaan.

Anda dapat menentukan dan menyediakan EC2 instans Amazon sebagai bagian dari infrastruktur Anda menggunakan CloudFormation templat. Template memudahkan pengelolaan dan otomatisasi penyebaran EC2 sumber daya Amazon secara berulang dan konsisten. 

Contoh cuplikan template berikut menjelaskan CloudFormation sumber daya atau komponen untuk Amazon. EC2 Cuplikan ini dirancang untuk diintegrasikan ke dalam template dan tidak dimaksudkan untuk dijalankan secara independen.

**Topics**
+ [Mengkonfigurasi Instans EC2](quickref-ec2-instance-config.md)
+ [Buat template peluncuran](quickref-ec2-launch-templates.md)
+ [Mengelola grup keamanan](quickref-ec2-sg.md)
+ [Alokasikan Elastis IPs](quickref-ec2-elastic-ip.md)
+ [Konfigurasikan sumber daya VPC](quickref-ec2-vpc.md)

# Konfigurasikan instans Amazon EC2 dengan CloudFormation
<a name="quickref-ec2-instance-config"></a>

Cuplikan berikut menunjukkan cara mengonfigurasi instans Amazon EC2 menggunakan. CloudFormation

**Topics**
+ [Konfigurasi umum Amazon EC2](#quickref-ec2-instance-config-general)
+ [Tentukan pemetaan perangkat blok untuk sebuah instance](#scenario-ec2-bdm)

## Konfigurasi umum Amazon EC2
<a name="quickref-ec2-instance-config-general"></a>

Cuplikan berikut menunjukkan konfigurasi umum untuk instans Amazon EC2 yang digunakan. CloudFormation

**Topics**
+ [Membuat instans Amazon EC2 di Availability Zone yang ditentukan](#scenario-ec2-instance)
+ [Mengonfigurasi instans Amazon EC2 yang diberi tag dengan volume EBS dan data pengguna](#scenario-ec2-instance-with-vol-and-tags)
+ [Tentukan nama tabel DynamoDB dalam data pengguna untuk peluncuran instans Amazon EC2](#scenario-ec2-with-sdb-domain)
+ [Buat volume Amazon EBS dengan `DeletionPolicy`](#scenario-ec2-volume)

### Membuat instans Amazon EC2 di Availability Zone yang ditentukan
<a name="scenario-ec2-instance"></a>

Cuplikan berikut membuat instance Amazon EC2 di Availability Zone yang ditentukan menggunakan resource. [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) Kode untuk Availability Zone adalah kode Region diikuti oleh pengidentifikasi huruf. Anda dapat meluncurkan instance ke dalam Availability Zone tunggal. 

#### JSON
<a name="quickref-ec2-example-6.json"></a>

```
1. "Ec2Instance": {
2.     "Type": "AWS::EC2::Instance",
3.     "Properties": {
4.         "AvailabilityZone": "aa-example-1a",
5.         "ImageId": "ami-1234567890abcdef0"
6.     }
7. }
```

#### YAML
<a name="quickref-ec2-example-6.yaml"></a>

```
1. Ec2Instance:
2.   Type: AWS::EC2::Instance
3.   Properties:
4.     AvailabilityZone: aa-example-1a
5.     ImageId: ami-1234567890abcdef0
```

### Mengonfigurasi instans Amazon EC2 yang diberi tag dengan volume EBS dan data pengguna
<a name="scenario-ec2-instance-with-vol-and-tags"></a>

Cuplikan berikut membuat instans Amazon EC2 dengan tag, volume EBS, dan data pengguna. Ini menggunakan sumber [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)daya. Dalam template yang sama, Anda harus menentukan [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)sumber daya, [AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html)sumber daya, dan [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)sumber daya. `KeyName`Harus didefinisikan di `Parameters` bagian template.

Tag dapat membantu Anda mengkategorikan AWS sumber daya berdasarkan preferensi Anda, seperti berdasarkan tujuan, pemilik, atau lingkungan. Data pengguna memungkinkan penyediaan skrip atau data khusus ke instance selama peluncuran. Data ini memfasilitasi otomatisasi tugas, konfigurasi perangkat lunak, instalasi paket, dan tindakan lain pada instance selama inisialisasi. 

Untuk informasi selengkapnya tentang menandai sumber daya Anda, lihat [Menandai sumber daya Amazon EC2 Anda](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) di Panduan Pengguna *Amazon EC2*. 

Untuk informasi tentang data pengguna, lihat [Menggunakan metadata instans untuk mengelola instans EC2 Anda](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) di Panduan Pengguna *Amazon* EC2.

#### JSON
<a name="quickref-ec2-example-7.json"></a>

```
 1. "Ec2Instance": {
 2.   "Type": "AWS::EC2::Instance",
 3.   "Properties": {
 4.     "KeyName": { "Ref": "KeyName" },
 5.     "SecurityGroups": [ { "Ref": "Ec2SecurityGroup" } ],
 6.     "UserData": {
 7.       "Fn::Base64": {
 8.         "Fn::Join": [ ":", [
 9.             "PORT=80",
10.             "TOPIC=",
11.             { "Ref": "MySNSTopic" }
12.           ]
13.         ]
14.       }
15.     },
16.     "InstanceType": "aa.size",
17.     "AvailabilityZone": "aa-example-1a",
18.     "ImageId": "ami-1234567890abcdef0",
19.     "Volumes": [
20.       {
21.         "VolumeId": { "Ref": "MyVolumeResource" },
22.         "Device": "/dev/sdk"
23.       }
24.     ],
25.     "Tags": [ { "Key": "Name", "Value": "MyTag" } ]
26.   }
27. }
```

#### YAML
<a name="quickref-ec2-example-7.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     KeyName: !Ref KeyName
 5.     SecurityGroups:
 6.       - !Ref Ec2SecurityGroup
 7.     UserData:
 8.       Fn::Base64:
 9.         Fn::Join:
10.           - ":"
11.           - - "PORT=80"
12.             - "TOPIC="
13.             - !Ref MySNSTopic
14.     InstanceType: aa.size
15.     AvailabilityZone: aa-example-1a
16.     ImageId: ami-1234567890abcdef0
17.     Volumes:
18.       - VolumeId: !Ref MyVolumeResource
19.         Device: "/dev/sdk"
20.     Tags:
21.       - Key: Name
22.         Value: MyTag
```

### Tentukan nama tabel DynamoDB dalam data pengguna untuk peluncuran instans Amazon EC2
<a name="scenario-ec2-with-sdb-domain"></a>

Cuplikan berikut membuat instance Amazon EC2 dan mendefinisikan nama tabel DynamoDB dalam data pengguna untuk diteruskan ke instance saat peluncuran. Ini menggunakan sumber [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)daya. Anda dapat menentukan parameter atau nilai dinamis dalam data pengguna untuk meneruskan instans EC2 saat peluncuran. 

Untuk informasi selengkapnya tentang data pengguna, lihat [Menggunakan metadata instans untuk mengelola instans EC2 Anda](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) di Panduan Pengguna *Amazon* EC2.

#### JSON
<a name="quickref-ec2-example-8.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "UserData": {
 5.             "Fn::Base64": {
 6.                 "Fn::Join": [
 7.                     "",
 8.                     [
 9.                         "TableName=",
10.                         {
11.                             "Ref": "DynamoDBTableName"
12.                         }
13.                     ]
14.                 ]
15.             }
16.         },
17.         "AvailabilityZone": "aa-example-1a",
18.         "ImageId": "ami-1234567890abcdef0"
19.     }
20. }
```

#### YAML
<a name="quickref-ec2-example-8.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     UserData:
 5.       Fn::Base64:
 6.         Fn::Join:
 7.           - ''
 8.           - - 'TableName='
 9.             - Ref: DynamoDBTableName
10.     AvailabilityZone: aa-example-1a
11.     ImageId: ami-1234567890abcdef0
```

### Buat volume Amazon EBS dengan `DeletionPolicy`
<a name="scenario-ec2-volume"></a>

Cuplikan berikut membuat volume Amazon EBS menggunakan sumber daya Amazon EC2. [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) Anda dapat menggunakan `SnapshotID` properti `Size` or untuk menentukan volume, tetapi tidak keduanya. `DeletionPolicy`Atribut diatur untuk membuat snapshot volume saat tumpukan dihapus. 

Untuk informasi selengkapnya tentang `DeletionPolicy` atribut, lihat [DeletionPolicyatribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html).

Untuk informasi selengkapnya tentang membuat volume Amazon EBS, lihat [Membuat volume Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html).

#### JSON
<a name="quickref-ec2-example-13.json"></a>

**Cuplikan ini membuat volume Amazon EBS dengan ukuran tertentu.** Ukurannya diatur ke 10, tetapi Anda dapat menyesuaikannya sesuai kebutuhan. [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Sumber daya memungkinkan Anda untuk menentukan ukuran atau ID snapshot tetapi tidak keduanya.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "Size": "10",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

**Cuplikan ini membuat volume Amazon EBS menggunakan ID snapshot yang disediakan.** [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Sumber daya memungkinkan Anda untuk menentukan ukuran atau ID snapshot tetapi tidak keduanya.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "SnapshotId" : "snap-1234567890abcdef0",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

#### YAML
<a name="quickref-ec2-example-13.yaml"></a>

**Cuplikan ini membuat volume Amazon EBS dengan ukuran tertentu.** Ukurannya diatur ke 10, tetapi Anda dapat menyesuaikannya sesuai kebutuhan. [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Sumber daya memungkinkan Anda untuk menentukan ukuran atau ID snapshot tetapi tidak keduanya.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     Size: 10
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

**Cuplikan ini membuat volume Amazon EBS menggunakan ID snapshot yang disediakan.** [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Sumber daya memungkinkan Anda untuk menentukan ukuran atau ID snapshot tetapi tidak keduanya.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     SnapshotId: snap-1234567890abcdef0
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

## Tentukan pemetaan perangkat blok untuk sebuah instance
<a name="scenario-ec2-bdm"></a>

Pemetaan perangkat blok mendefinisikan perangkat blok, yang mencakup volume penyimpanan instans dan volume EBS, untuk dilampirkan ke sebuah instance. Anda dapat menentukan pemetaan perangkat blok saat membuat AMI sehingga pemetaan digunakan oleh semua instance yang diluncurkan dari AMI. Atau, Anda dapat menentukan pemetaan perangkat blok saat meluncurkan instance, sehingga pemetaan menggantikan yang ditentukan dalam AMI tempat instance diluncurkan.

Anda dapat menggunakan cuplikan templat berikut untuk menentukan pemetaan perangkat blok untuk volume penyimpanan EBS atau instans menggunakan properti sumber daya. `BlockDeviceMappings` [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 

*Untuk informasi selengkapnya tentang memblokir pemetaan perangkat, lihat [Memblokir pemetaan perangkat untuk volume pada instans Amazon EC2 di Panduan Pengguna Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html).*

**Topics**
+ [Tentukan pemetaan perangkat blok untuk dua volume EBS](#w2aac11c41c43c13b9c11)
+ [Tentukan pemetaan perangkat blok untuk volume penyimpanan instance](#w2aac11c41c43c13b9c13)

### Tentukan pemetaan perangkat blok untuk dua volume EBS
<a name="w2aac11c41c43c13b9c11"></a>

#### JSON
<a name="quickref-ec2-example-1.json"></a>

```
"Ec2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
      "KeyName": { "Ref": "KeyName" },
      "InstanceType": { "Ref": "InstanceType" },
      "SecurityGroups": [{ "Ref": "Ec2SecurityGroup" }],
      "BlockDeviceMappings": [
        {
          "DeviceName": "/dev/sda1",
          "Ebs": { "VolumeSize": "50" }
        },
        {
          "DeviceName": "/dev/sdm",
          "Ebs": { "VolumeSize": "100" }
        }
      ]
    }
  }
}
```

#### YAML
<a name="quickref-ec2-example-1.yaml"></a>

```
EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      KeyName: !Ref KeyName
      InstanceType: !Ref InstanceType
      SecurityGroups:
        - !Ref Ec2SecurityGroup
      BlockDeviceMappings:
        -
          DeviceName: /dev/sda1
          Ebs:
            VolumeSize: 50
        -
          DeviceName: /dev/sdm
          Ebs:
            VolumeSize: 100
```

### Tentukan pemetaan perangkat blok untuk volume penyimpanan instance
<a name="w2aac11c41c43c13b9c13"></a>

#### JSON
<a name="quickref-ec2-example-2.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance", 
  "Properties" : {
    "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
    "KeyName" : { "Ref" : "KeyName" },
    "InstanceType": { "Ref": "InstanceType" },
    "SecurityGroups" : [{ "Ref" : "Ec2SecurityGroup" }],
    "BlockDeviceMappings" : [
      {
        "DeviceName"  : "/dev/sdc",
        "VirtualName" : "ephemeral0"
      }
    ]
  }
}
```

#### YAML
<a name="quickref-ec2-example-2.yaml"></a>

```
EC2Instance:
  Type: AWS::EC2::Instance
  Properties:
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    KeyName: !Ref KeyName
    InstanceType: !Ref InstanceType
    SecurityGroups:
      - !Ref Ec2SecurityGroup
    BlockDeviceMappings:
      - DeviceName: /dev/sdc
        VirtualName: ephemeral0
```

# Buat template peluncuran dengan CloudFormation
<a name="quickref-ec2-launch-templates"></a>

Bagian ini memberikan contoh untuk membuat template peluncuran Amazon EC2 menggunakan. CloudFormation Template peluncuran memungkinkan Anda membuat templat untuk mengonfigurasi dan menyediakan instans Amazon EC2 di dalamnya. AWS Dengan template peluncuran, Anda dapat menyimpan parameter peluncuran sehingga Anda tidak perlu menentukannya setiap kali Anda meluncurkan instance. Untuk contoh lainnya, lihat bagian [Contoh](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) di `AWS::EC2::LaunchTemplate` sumber daya.

Untuk informasi selengkapnya tentang template peluncuran, lihat [Menyimpan parameter peluncuran instans di templat peluncuran Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) di Panduan Pengguna *Amazon EC2*. 

Untuk informasi tentang membuat templat peluncuran untuk digunakan dengan grup Auto Scaling, lihat templat [peluncuran Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-templates.html) di Panduan Pengguna *Amazon EC2 Auto Scaling*.

**Topics**
+ [Buat template peluncuran yang menentukan grup keamanan, tag, data pengguna, dan peran IAM](#scenario-as-launch-template)

## Buat template peluncuran yang menentukan grup keamanan, tag, data pengguna, dan peran IAM
<a name="scenario-as-launch-template"></a>

Cuplikan ini menunjukkan [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)sumber daya yang berisi informasi konfigurasi untuk meluncurkan instance. Anda menentukan nilai untuk`ImageId`,`InstanceType`,`SecurityGroups`,`UserData`, dan `TagSpecifications` properti. `SecurityGroups`Properti menentukan grup keamanan EC2 yang ada dan grup keamanan baru. `Ref`Fungsi mendapatkan ID dari [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)sumber daya `myNewEC2SecurityGroup` yang dideklarasikan di tempat lain di template tumpukan. 

Template peluncuran mencakup bagian untuk data pengguna kustom. Anda dapat meneruskan tugas konfigurasi dan skrip yang berjalan saat instance diluncurkan di bagian ini. Dalam contoh ini, data pengguna menginstal AWS Systems Manager Agen dan memulai agen.

Template peluncuran juga menyertakan peran IAM yang memungkinkan aplikasi yang berjalan pada instance untuk melakukan tindakan atas nama Anda. Contoh ini menunjukkan [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)sumber daya untuk template peluncuran, yang menggunakan `IamInstanceProfile` properti untuk menentukan peran IAM. `Ref`Fungsi mendapatkan nama sumber [AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-instanceprofile.html)daya`myInstanceProfile`. Untuk mengonfigurasi izin peran IAM, Anda menentukan nilai untuk properti. `ManagedPolicyArns`

### JSON
<a name="quickref-launch-template-example-1.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "myLaunchTemplate":{
 4.       "Type":"AWS::EC2::LaunchTemplate",
 5.       "Properties":{
 6.         "LaunchTemplateName":{ "Fn::Sub": "${AWS::StackName}-launch-template" },
 7.         "LaunchTemplateData":{
 8.           "ImageId":"ami-02354e95b3example",
 9.           "InstanceType":"t3.micro",
10.           "IamInstanceProfile":{
11.             "Name":{
12.               "Ref":"myInstanceProfile"
13.             }
14.           },
15.           "SecurityGroupIds":[
16.             {
17.               "Ref":"myNewEC2SecurityGroup"
18.             },
19.             "sg-083cd3bfb8example"
20.           ],
21.           "UserData":{
22.             "Fn::Base64":{
23.               "Fn::Join": [
24.                 "", [
25.                   "#!/bin/bash\n",
26.                   "cd /tmp\n",
27.                   "yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm\n",
28.                   "systemctl enable amazon-ssm-agent\n",
29.                   "systemctl start amazon-ssm-agent\n"
30.                 ]
31.               ]
32.             }
33.           },
34.           "TagSpecifications":[
35.             {
36.               "ResourceType":"instance",
37.               "Tags":[
38.                 {
39.                   "Key":"environment",
40.                   "Value":"development"
41.                 }
42.               ]
43.             },
44.             {
45.               "ResourceType":"volume",
46.               "Tags":[
47.                 {
48.                   "Key":"environment",
49.                   "Value":"development"
50.                 }
51.               ]
52.             }
53.           ]
54.         }
55.       }
56.     },
57.     "myInstanceRole":{
58.       "Type":"AWS::IAM::Role",
59.       "Properties":{
60.         "RoleName":"InstanceRole",
61.         "AssumeRolePolicyDocument":{
62.           "Version": "2012-10-17",		 	 	 
63.           "Statement":[
64.             {
65.               "Effect":"Allow",
66.               "Principal":{
67.                 "Service":[
68.                   "ec2.amazonaws.com"
69.                 ]
70.               },
71.               "Action":[
72.                 "sts:AssumeRole"
73.               ]
74.             }
75.           ]
76.         },
77.         "ManagedPolicyArns":[
78.           "arn:aws:iam::aws:policy/myCustomerManagedPolicy"
79.         ]
80.       }
81.     },
82.     "myInstanceProfile":{
83.       "Type":"AWS::IAM::InstanceProfile",
84.       "Properties":{
85.         "Path":"/",
86.         "Roles":[
87.           {
88.             "Ref":"myInstanceRole"
89.           }
90.         ]
91.       }
92.     }
93.   }
94. }
```

### YAML
<a name="quickref-launch-template-example-1.yaml"></a>

```
 1. ---
 2. Resources:
 3.   myLaunchTemplate:
 4.     Type: AWS::EC2::LaunchTemplate
 5.     Properties:
 6.       LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
 7.       LaunchTemplateData:
 8.         ImageId: ami-02354e95b3example
 9.         InstanceType: t3.micro
10.         IamInstanceProfile:
11.           Name: !Ref myInstanceProfile
12.         SecurityGroupIds:
13.         - !Ref myNewEC2SecurityGroup
14.         - sg-083cd3bfb8example
15.         UserData:
16.           Fn::Base64: !Sub |
17.             #!/bin/bash
18.             cd /tmp
19.             yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
20.             systemctl enable amazon-ssm-agent
21.             systemctl start amazon-ssm-agent
22.         TagSpecifications:
23.         - ResourceType: instance
24.           Tags:
25.           - Key: environment
26.             Value: development
27.         - ResourceType: volume
28.           Tags:
29.           - Key: environment
30.             Value: development
31.   myInstanceRole:
32.     Type: AWS::IAM::Role
33.     Properties:
34.       RoleName: InstanceRole
35.       AssumeRolePolicyDocument:
36.         Version: '2012-10-17'
37.         Statement:
38.         - Effect: 'Allow'
39.           Principal:
40.             Service:
41.             - 'ec2.amazonaws.com'
42.           Action:
43.           - 'sts:AssumeRole'
44.       ManagedPolicyArns:
45.         - 'arn:aws:iam::aws:policy/myCustomerManagedPolicy'
46.   myInstanceProfile:
47.     Type: AWS::IAM::InstanceProfile
48.     Properties:
49.       Path: '/'
50.       Roles:
51.       - !Ref myInstanceRole
```

# Kelola grup keamanan dengan CloudFormation
<a name="quickref-ec2-sg"></a>

Cuplikan berikut menunjukkan cara menggunakan CloudFormation untuk mengelola grup keamanan dan instans Amazon EC2 untuk mengontrol akses ke sumber daya Anda. AWS 

**Topics**
+ [Kaitkan instans Amazon EC2 dengan grup keamanan](#quickref-ec2-instances-associate-security-group)
+ [Buat grup keamanan dengan aturan masuk](#quickref-ec2-instances-ingress)
+ [Buat Elastic Load Balancer dengan aturan masuknya grup keamanan](#scenario-ec2-security-group-elbingress)

## Kaitkan instans Amazon EC2 dengan grup keamanan
<a name="quickref-ec2-instances-associate-security-group"></a>

Contoh cuplikan berikut menunjukkan cara mengaitkan instans Amazon EC2 dengan grup keamanan Amazon VPC default yang digunakan. CloudFormation

**Topics**
+ [Kaitkan instans Amazon EC2 dengan grup keamanan VPC default](#using-cfn-getatt-default-values)
+ [Membuat instans Amazon EC2 dengan volume dan grup keamanan terlampir](#scenario-ec2-volumeattachment)

### Kaitkan instans Amazon EC2 dengan grup keamanan VPC default
<a name="using-cfn-getatt-default-values"></a>

Cuplikan berikut membuat Amazon VPC, subnet dalam VPC, dan instans Amazon EC2. VPC dibuat menggunakan sumber daya [AWS: :EC2: :VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html). Rentang alamat IP untuk VPC didefinisikan dalam template yang lebih besar dan direferensikan oleh parameter. `MyVPCCIDRRange`

Subnet dibuat dalam VPC menggunakan sumber daya [AWS: :EC2::](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html) Subnet. Subnet dikaitkan dengan VPC, yang direferensikan sebagai. `MyVPC`

Instans EC2 diluncurkan dalam VPC dan subnet menggunakan sumber daya. [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) Resource ini menentukan Amazon Machine Image (AMI) yang akan digunakan untuk meluncurkan instance, subnet tempat instance akan berjalan, dan grup keamanan yang akan diasosiasikan dengan instance. `ImageId`Menggunakan parameter Systems Manager untuk secara dinamis mengambil Amazon Linux 2 AMI terbaru. 

ID grup keamanan diperoleh dengan menggunakan `Fn::GetAtt` fungsi, yang mengambil grup keamanan default dari `MyVPC` sumber daya. 

Instance ditempatkan dalam `MySubnet` sumber daya yang ditentukan dalam cuplikan. 

Saat Anda membuat VPC menggunakan CloudFormation, AWS secara otomatis membuat sumber daya default dalam VPC, termasuk grup keamanan default. Namun, ketika Anda mendefinisikan VPC dalam CloudFormation template, Anda mungkin tidak memiliki akses ke sumber daya default ini saat Anda membuat template. IDs Untuk mengakses dan menggunakan sumber daya default yang ditentukan dalam template, Anda dapat menggunakan fungsi intrinsik seperti. `Fn::GetAtt` Fungsi ini memungkinkan Anda untuk bekerja dengan sumber daya default yang dibuat secara otomatis oleh CloudFormation.

#### JSON
<a name="quickref-ec2-example-15.json"></a>

```
"MyVPC": {
    "Type": "AWS::EC2::VPC",
    "Properties": {
        "CidrBlock": {
            "Ref": "MyVPCCIDRRange"
        },
        "EnableDnsSupport": false,
        "EnableDnsHostnames": false,
        "InstanceTenancy": "default"
    }
},
"MySubnet": {
    "Type": "AWS::EC2::Subnet",
    "Properties": {
        "CidrBlock": {
            "Ref": "MyVPCCIDRRange"
        },
        "VpcId": {
            "Ref": "MyVPC"
        }
    }
},
"MyInstance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
        "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "SecurityGroupIds": [
            {
                "Fn::GetAtt": [
                    "MyVPC",
                    "DefaultSecurityGroup"
                ]
            }
        ],
        "SubnetId": {
            "Ref": "MySubnet"
        }
    }
}
```

#### YAML
<a name="quickref-ec2-example-15.yaml"></a>

```
MyVPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock:
      Ref: MyVPCCIDRRange
    EnableDnsSupport: false
    EnableDnsHostnames: false
    InstanceTenancy: default
MySubnet:
  Type: AWS::EC2::Subnet
  Properties:
    CidrBlock:
      Ref: MyVPCCIDRRange
    VpcId:
      Ref: MyVPC
MyInstance:
  Type: AWS::EC2::Instance
  Properties:
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    SecurityGroupIds:
      - Fn::GetAtt:
          - MyVPC
          - DefaultSecurityGroup
    SubnetId:
      Ref: MySubnet
```

### Membuat instans Amazon EC2 dengan volume dan grup keamanan terlampir
<a name="scenario-ec2-volumeattachment"></a>

Cuplikan berikut membuat instans Amazon EC2 menggunakan sumber daya, [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)yang diluncurkan dari AMI yang ditunjuk. Instance ini dikaitkan dengan grup keamanan yang memungkinkan lalu lintas SSH masuk pada port 22 dari alamat IP tertentu, menggunakan sumber daya. [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) Ini menciptakan volume Amazon EBS 100 GB menggunakan [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)sumber daya. Volume dibuat di zona ketersediaan yang sama dengan instance, seperti yang ditentukan oleh `GetAtt` fungsi, dan dipasang ke instance di `/dev/sdh` perangkat.

Untuk informasi selengkapnya tentang membuat volume Amazon EBS, lihat [Membuat volume Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html).

#### JSON
<a name="quickref-ec2-example-14.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "SecurityGroups": [
 5.             {
 6.                 "Ref": "InstanceSecurityGroup"
 7.             }
 8.         ],
 9.         "ImageId": "ami-1234567890abcdef0"
10.     }
11. },
12. "InstanceSecurityGroup": {
13.     "Type": "AWS::EC2::SecurityGroup",
14.     "Properties": {
15.         "GroupDescription": "Enable SSH access via port 22",
16.         "SecurityGroupIngress": [
17.             {
18.                 "IpProtocol": "tcp",
19.                 "FromPort": "22",
20.                 "ToPort": "22",
21.                 "CidrIp": "192.0.2.0/24"
22.             }
23.         ]
24.     }
25. },
26. "NewVolume": {
27.     "Type": "AWS::EC2::Volume",
28.     "Properties": {
29.         "Size": "100",
30.         "AvailabilityZone": {
31.             "Fn::GetAtt": [
32.                 "Ec2Instance",
33.                 "AvailabilityZone"
34.             ]
35.         }
36.     }
37. },
38. "MountPoint": {
39.     "Type": "AWS::EC2::VolumeAttachment",
40.     "Properties": {
41.         "InstanceId": {
42.             "Ref": "Ec2Instance"
43.         },
44.         "VolumeId": {
45.             "Ref": "NewVolume"
46.         },
47.         "Device": "/dev/sdh"
48.     }
49. }
```

#### YAML
<a name="quickref-ec2-example-14.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     SecurityGroups:
 5.       - !Ref InstanceSecurityGroup
 6.     ImageId: ami-1234567890abcdef0
 7. InstanceSecurityGroup:
 8.   Type: AWS::EC2::SecurityGroup
 9.   Properties:
10.     GroupDescription: Enable SSH access via port 22
11.     SecurityGroupIngress:
12.       - IpProtocol: tcp
13.         FromPort: 22
14.         ToPort: 22
15.         CidrIp: 192.0.2.0/24
16. NewVolume:
17.   Type: AWS::EC2::Volume
18.   Properties:
19.     Size: 100
20.     AvailabilityZone: !GetAtt [Ec2Instance, AvailabilityZone]
21. MountPoint:
22.   Type: AWS::EC2::VolumeAttachment
23.   Properties:
24.     InstanceId: !Ref Ec2Instance
25.     VolumeId: !Ref NewVolume
26.     Device: /dev/sdh
```

## Buat grup keamanan dengan aturan masuk
<a name="quickref-ec2-instances-ingress"></a>

Contoh cuplikan berikut menunjukkan cara mengkonfigurasi grup keamanan dengan aturan masuk tertentu menggunakan. CloudFormation

**Topics**
+ [Buat grup keamanan dengan aturan masuk untuk akses SSH dan HTTP](#scenario-ec2-security-group-rule)
+ [Buat grup keamanan dengan aturan ingress untuk akses HTTP dan SSH dari rentang CIDR yang ditentukan](#scenario-ec2-security-group-two-ports)
+ [Buat grup keamanan referensi silang dengan aturan masuk](#scenario-ec2-security-group-ingress)

### Buat grup keamanan dengan aturan masuk untuk akses SSH dan HTTP
<a name="scenario-ec2-security-group-rule"></a>

Cuplikan berikut menjelaskan dua aturan masuknya grup keamanan menggunakan sumber daya. [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) Aturan masuk pertama memungkinkan akses SSH (port 22) dari grup keamanan yang ada bernama`MyAdminSecurityGroup`, yang dimiliki oleh AWS akun dengan nomor akun. `1111-2222-3333` Aturan ingress kedua memungkinkan akses HTTP (port 80) dari grup keamanan yang berbeda bernama`MySecurityGroupCreatedInCFN`, yang dibuat dalam template yang sama. `Ref`Fungsi ini digunakan untuk referensi nama logis dari grup keamanan yang dibuat dalam template yang sama. 

Dalam aturan ingress pertama, Anda harus menambahkan nilai untuk `SourceSecurityGroupOwnerId` properti `SourceSecurityGroupName` dan properti. Dalam aturan ingress kedua, `MySecurityGroupCreatedInCFNTemplate` referensi grup keamanan yang berbeda, yang dibuat dalam template yang sama. Verifikasi bahwa nama logis `MySecurityGroupCreatedInCFNTemplate` cocok dengan nama logis sebenarnya dari sumber daya grup keamanan yang Anda tentukan dalam templat yang lebih besar. 

Untuk informasi selengkapnya tentang grup keamanan, lihat [grup keamanan Amazon EC2 untuk instans Amazon EC2 Anda](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) di Panduan Pengguna Amazon *EC2*.

#### JSON
<a name="quickref-ec2-example-10.json"></a>

```
 1. "SecurityGroup": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "Allow connections from specified source security group",
 5.         "SecurityGroupIngress": [
 6.             {
 7.                 "IpProtocol": "tcp",
 8.                 "FromPort": "22",
 9.                 "ToPort": "22",
10.                 "SourceSecurityGroupName": "MyAdminSecurityGroup",
11.                 "SourceSecurityGroupOwnerId": "1111-2222-3333"
12.             },
13.             {
14.                 "IpProtocol": "tcp",
15.                 "FromPort": "80",
16.                 "ToPort": "80",
17.                 "SourceSecurityGroupName": {
18.                     "Ref": "MySecurityGroupCreatedInCFNTemplate"
19.                 }
20.             }
21.         ]
22.     }
23. }
```

#### YAML
<a name="quickref-ec2-example-10.yaml"></a>

```
 1. SecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified source security group
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: '22'
 8.         ToPort: '22'
 9.         SourceSecurityGroupName: MyAdminSecurityGroup
10.         SourceSecurityGroupOwnerId: '1111-2222-3333'
11.       - IpProtocol: tcp
12.         FromPort: '80'
13.         ToPort: '80'
14.         SourceSecurityGroupName:
15.           Ref: MySecurityGroupCreatedInCFNTemplate
```

### Buat grup keamanan dengan aturan ingress untuk akses HTTP dan SSH dari rentang CIDR yang ditentukan
<a name="scenario-ec2-security-group-two-ports"></a>

Cuplikan berikut membuat grup keamanan untuk instans Amazon EC2 dengan dua aturan masuk. Aturan masuk memungkinkan lalu lintas TCP masuk pada port yang ditentukan dari rentang CIDR yang ditentukan. [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)Sumber daya digunakan untuk menentukan aturan. Anda harus menentukan protokol untuk setiap aturan. Untuk TCP, Anda harus menentukan port atau rentang port. Jika Anda tidak menentukan grup keamanan sumber atau rentang CIDR, tumpukan akan berhasil diluncurkan, tetapi aturan tidak akan diterapkan ke grup keamanan. 

Untuk informasi selengkapnya tentang grup keamanan, lihat [grup keamanan Amazon EC2 untuk instans Amazon EC2 Anda](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) di Panduan Pengguna Amazon *EC2*.

#### JSON
<a name="quickref-ec2-example-9.json"></a>

```
 1. "ServerSecurityGroup": {
 2.   "Type": "AWS::EC2::SecurityGroup",
 3.   "Properties": {
 4.     "GroupDescription": "Allow connections from specified CIDR ranges",
 5.     "SecurityGroupIngress": [
 6.       {
 7.         "IpProtocol": "tcp",
 8.         "FromPort": "80",
 9.         "ToPort": "80",
10.         "CidrIp": "192.0.2.0/24"
11.       },
12.       {
13.         "IpProtocol": "tcp",
14.         "FromPort": "22",
15.         "ToPort": "22",
16.         "CidrIp": "192.0.2.0/24"
17.       }
18.     ]
19.   }
20. }
```

#### YAML
<a name="quickref-ec2-example-9.yaml"></a>

```
 1. ServerSecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified CIDR ranges
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: 80
 8.         ToPort: 80
 9.         CidrIp: 192.0.2.0/24
10.       - IpProtocol: tcp
11.         FromPort: 22
12.         ToPort: 22
13.         CidrIp: 192.0.2.0/24
```

### Buat grup keamanan referensi silang dengan aturan masuk
<a name="scenario-ec2-security-group-ingress"></a>

Cuplikan berikut menggunakan [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)sumber daya untuk membuat dua grup keamanan Amazon EC2, dan. `SGroup1` `SGroup2` Aturan masuk yang memungkinkan komunikasi antara dua kelompok keamanan dibuat dengan menggunakan sumber daya [AWS::EC2::SecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroupingress.html). `SGroup1Ingress`menetapkan aturan ingress untuk `SGroup1` yang memungkinkan lalu lintas TCP masuk pada port 80 dari grup keamanan sumber,. `SGroup2` `SGroup2Ingress`menetapkan aturan ingress untuk `SGroup2` yang memungkinkan lalu lintas TCP masuk pada port 80 dari grup keamanan sumber,. `SGroup1` 

#### JSON
<a name="quickref-ec2-example-12.json"></a>

```
 1. "SGroup1": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "EC2 instance access"
 5.     }
 6. },
 7. "SGroup2": {
 8.     "Type": "AWS::EC2::SecurityGroup",
 9.     "Properties": {
10.         "GroupDescription": "EC2 instance access"
11.     }
12. },
13. "SGroup1Ingress": {
14.     "Type": "AWS::EC2::SecurityGroupIngress",
15.     "Properties": {
16.         "GroupName": {
17.             "Ref": "SGroup1"
18.         },
19.         "IpProtocol": "tcp",
20.         "ToPort": "80",
21.         "FromPort": "80",
22.         "SourceSecurityGroupName": {
23.             "Ref": "SGroup2"
24.         }
25.     }
26. },
27. "SGroup2Ingress": {
28.     "Type": "AWS::EC2::SecurityGroupIngress",
29.     "Properties": {
30.         "GroupName": {
31.             "Ref": "SGroup2"
32.         },
33.         "IpProtocol": "tcp",
34.         "ToPort": "80",
35.         "FromPort": "80",
36.         "SourceSecurityGroupName": {
37.             "Ref": "SGroup1"
38.         }
39.     }
40. }
```

#### YAML
<a name="quickref-ec2-example-12.yaml"></a>

```
 1. SGroup1:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: EC2 Instance access
 5. SGroup2:
 6.   Type: AWS::EC2::SecurityGroup
 7.   Properties:
 8.     GroupDescription: EC2 Instance access
 9. SGroup1Ingress:
10.   Type: AWS::EC2::SecurityGroupIngress
11.   Properties:
12.     GroupName: !Ref SGroup1
13.     IpProtocol: tcp
14.     ToPort: 80
15.     FromPort: 80
16.     SourceSecurityGroupName: !Ref SGroup2
17. SGroup2Ingress:
18.   Type: AWS::EC2::SecurityGroupIngress
19.   Properties:
20.     GroupName: !Ref SGroup2
21.     IpProtocol: tcp
22.     ToPort: 80
23.     FromPort: 80
24.     SourceSecurityGroupName: !Ref SGroup1
```

## Buat Elastic Load Balancer dengan aturan masuknya grup keamanan
<a name="scenario-ec2-security-group-elbingress"></a>

Template berikut membuat [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html)sumber daya di zona ketersediaan yang ditentukan. [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html)Sumber daya dikonfigurasi untuk mendengarkan pada port 80 untuk lalu lintas HTTP dan permintaan langsung ke instance juga pada port 80. Elastic Load Balancer bertanggung jawab untuk menyeimbangkan beban lalu lintas HTTP yang masuk di antara instans.

 Selain itu, template ini menghasilkan [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)sumber daya yang terkait dengan penyeimbang beban. Grup keamanan ini dibuat dengan aturan masuk tunggal, digambarkan sebagai`ELB ingress group`, yang memungkinkan lalu lintas TCP masuk pada port 80. Sumber untuk aturan ingress ini didefinisikan menggunakan `Fn::GetAtt` fucntion untuk mengambil atribut dari sumber daya penyeimbang beban. `SourceSecurityGroupOwnerId`digunakan `Fn::GetAtt` untuk mendapatkan kelompok keamanan sumber dari penyeimbang beban. `OwnerAlias` `SourceSecurityGroupName`digunakan `Fn::Getatt` untuk mendapatkan kelompok keamanan sumber ELB. `GroupName` 

Pengaturan ini memastikan komunikasi yang aman antara ELB dan instans. 

Untuk informasi selengkapnya tentang load balancing, lihat Panduan Pengguna [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/).

### JSON
<a name="quickref-ec2-example-11.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "MyELB": {
            "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
            "Properties": {
                "AvailabilityZones": [
                    "aa-example-1a"
                ],
                "Listeners": [
                    {
                        "LoadBalancerPort": "80",
                        "InstancePort": "80",
                        "Protocol": "HTTP"
                    }
                ]
            }
        },
        "MyELBIngressGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "ELB ingress group",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "SourceSecurityGroupOwnerId": {
                            "Fn::GetAtt": [
                                "MyELB",
                                "SourceSecurityGroup.OwnerAlias"
                            ]
                        },
                        "SourceSecurityGroupName": {
                            "Fn::GetAtt": [
                                "MyELB",
                                "SourceSecurityGroup.GroupName"
                            ]
                        }
                    }
                ]
            }
        }
    }
}
```

### YAML
<a name="quickref-ec2-example-11.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyELB:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      AvailabilityZones:
        - aa-example-1a
      Listeners:
        - LoadBalancerPort: '80'
          InstancePort: '80'
          Protocol: HTTP
  MyELBIngressGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB ingress group
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          SourceSecurityGroupOwnerId:
            Fn::GetAtt:
              - MyELB
              - SourceSecurityGroup.OwnerAlias
          SourceSecurityGroupName:
            Fn::GetAtt:
              - MyELB
              - SourceSecurityGroup.GroupName
```

# Alokasikan dan kaitkan alamat IP Elastis dengan CloudFormation
<a name="quickref-ec2-elastic-ip"></a>

Cuplikan template berikut adalah contoh yang terkait dengan alamat IP Elastis (EIP) di Amazon EC2. Contoh-contoh ini mencakup alokasi, asosiasi, dan manajemen EIPs untuk instans Anda.

**Topics**
+ [Alokasikan alamat IP Elastis dan kaitkan dengan instans Amazon EC2](#scenario-ec2-eip)
+ [Kaitkan alamat IP Elastis ke instans Amazon EC2 dengan menentukan alamat IP](#scenario-ec2-eip-association)
+ [Kaitkan alamat IP Elastis ke instans Amazon EC2 dengan menentukan ID alokasi alamat IP](#scenario-ec2-eip-association-vpc)

## Alokasikan alamat IP Elastis dan kaitkan dengan instans Amazon EC2
<a name="scenario-ec2-eip"></a>

Cuplikan berikut mengalokasikan alamat Amazon EC2 Elastic IP (EIP) dan mengaitkannya dengan instans Amazon EC2 menggunakan sumber daya. [AWS::EC2::EIP ](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html) Anda dapat mengalokasikan alamat EIP dari kumpulan alamat yang dimiliki oleh AWS atau dari kumpulan alamat yang dibuat dari rentang IPv4 alamat publik yang Anda bawa AWS untuk digunakan dengan AWS sumber daya Anda menggunakan [bawa alamat IP Anda sendiri (BYOIP)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html). Dalam contoh ini, EIP dialokasikan dari kumpulan alamat yang dimiliki oleh. AWS

Untuk informasi selengkapnya tentang alamat IP [Elastis, lihat Alamat IP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) Elastis di *Panduan Pengguna Amazon EC2*.

### JSON
<a name="quickref-ec2-example-3.json"></a>

```
1. "ElasticIP": {
2.     "Type": "AWS::EC2::EIP",
3.     "Properties": {
4.         "InstanceId": {
5.             "Ref": "Ec2Instance"
6.         }
7.     }
8. }
```

### YAML
<a name="quickref-ec2-example-3.yaml"></a>

```
1. ElasticIP:
2.   Type: AWS::EC2::EIP
3.   Properties:
4.     InstanceId: !Ref EC2Instance
```

## Kaitkan alamat IP Elastis ke instans Amazon EC2 dengan menentukan alamat IP
<a name="scenario-ec2-eip-association"></a>

Cuplikan berikut mengaitkan alamat IP Elastic Amazon EC2 yang ada ke instans EC2 menggunakan sumber daya [AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html): :EC2::. EIPAssociation Anda harus terlebih dahulu mengalokasikan alamat IP Elastis untuk digunakan di akun Anda. Alamat IP elastis dapat dikaitkan dengan satu contoh.

### JSON
<a name="quickref-ec2-example-4.json"></a>

```
1. "IPAssoc": {
2.   "Type": "AWS::EC2::EIPAssociation",
3.   "Properties": {
4.     "InstanceId": {
5.       "Ref": "Ec2Instance"
6.     },
7.     "EIP": "192.0.2.0"
8.   }
9. }
```

### YAML
<a name="quickref-ec2-example-4.yaml"></a>

```
1. IPAssoc:
2.   Type: AWS::EC2::EIPAssociation
3.   Properties:
4.     InstanceId: !Ref EC2Instance
5.     EIP: 192.0.2.0
```

## Kaitkan alamat IP Elastis ke instans Amazon EC2 dengan menentukan ID alokasi alamat IP
<a name="scenario-ec2-eip-association-vpc"></a>

[Cuplikan berikut mengaitkan alamat IP Elastic yang ada ke instans Amazon EC2 dengan menentukan ID alokasi menggunakan sumber daya AWS: :EC2::. EIPAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html) ID alokasi ditetapkan ke alamat IP Elastis pada alokasi alamat IP Elastis. 

### JSON
<a name="quickref-ec2-example-5.json"></a>

```
1. "IPAssoc": {
2.     "Type": "AWS::EC2::EIPAssociation",
3.     "Properties": {
4.         "InstanceId": {
5.             "Ref": "Ec2Instance"
6.         },
7.         "AllocationId": "eipalloc-1234567890abcdef0"
8.     }
9. }
```

### YAML
<a name="quickref-ec2-example-5.yaml"></a>

```
1. IPAssoc:
2.   Type: AWS::EC2::EIPAssociation
3.   Properties:
4.     InstanceId: !Ref EC2Instance
5.     AllocationId: eipalloc-1234567890abcdef0
```

# Konfigurasikan sumber daya Amazon VPC dengan CloudFormation
<a name="quickref-ec2-vpc"></a>

Bagian ini memberikan contoh untuk mengonfigurasi sumber daya Amazon VPC menggunakan. CloudFormation VPCsmemungkinkan Anda membuat jaringan virtual di dalamnya AWS, dan cuplikan ini menunjukkan cara mengonfigurasi aspek VPCs untuk memenuhi persyaratan jaringan Anda. 

**Topics**
+ [Aktifkan akses internet IPv6 khusus egres di VPC](#quickref-ec2-route-egressonlyinternetgateway)
+ [Potongan templat antarmuka jaringan elastis (ENI)](#cfn-template-snippets-eni)

## Aktifkan akses internet IPv6 khusus egres di VPC
<a name="quickref-ec2-route-egressonlyinternetgateway"></a>

Sebuah gateway internet egress-only memungkinkan instance dalam VPC untuk mengakses internet dan mencegah sumber daya di internet berkomunikasi dengan instans. Cuplikan berikut memungkinkan akses internet IPv6 khusus egres dari dalam VPC. Ini membuat VPC dengan rentang IPv4 alamat `10.0.0/16` menggunakan sumber daya [AWS: :EC2: :VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html). Tabel rute dikaitkan dengan sumber daya VPC ini menggunakan sumber daya. [AWS::EC2::RouteTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-routetable.html) Tabel rute mengelola rute untuk instance dalam VPC. An [AWS::EC2::EgressOnlyInternetGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-egressonlyinternetgateway.html)digunakan untuk membuat gateway internet egress-only untuk memungkinkan IPv6 komunikasi untuk lalu lintas keluar dari instance dalam VPC, sekaligus mencegah lalu lintas masuk. [AWS::EC2::Route](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-route.html)Sumber daya ditentukan untuk membuat IPv6 rute dalam tabel rute yang mengarahkan semua IPv6 lalu lintas keluar (`::/0`) ke gateway internet khusus egres. 

*Untuk informasi selengkapnya tentang gateway internet khusus egres, lihat [Mengaktifkan IPv6 lalu lintas keluar menggunakan gateway internet khusus egres di Panduan](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html) Pengguna Amazon VPC.*

### JSON
<a name="quickref-ec2-example-16.json"></a>

```
"DefaultIpv6Route": {
    "Type": "AWS::EC2::Route",
    "Properties": {
        "DestinationIpv6CidrBlock": "::/0",
        "EgressOnlyInternetGatewayId": {
            "Ref": "EgressOnlyInternetGateway"
        },
        "RouteTableId": {
            "Ref": "RouteTable"
        }
    }
},
"EgressOnlyInternetGateway": {
    "Type": "AWS::EC2::EgressOnlyInternetGateway",
    "Properties": {
        "VpcId": {
            "Ref": "VPC"
        }
    }
},
"RouteTable": {
    "Type": "AWS::EC2::RouteTable",
    "Properties": {
        "VpcId": {
            "Ref": "VPC"
        }
    }
},
"VPC": {
    "Type": "AWS::EC2::VPC",
    "Properties": {
        "CidrBlock": "10.0.0.0/16"
    }
}
```

### YAML
<a name="quickref-ec2-example-16.yaml"></a>

```
DefaultIpv6Route:
  Type: AWS::EC2::Route
  Properties:
    DestinationIpv6CidrBlock: "::/0"
    EgressOnlyInternetGatewayId:
      Ref: "EgressOnlyInternetGateway"
    RouteTableId:
      Ref: "RouteTable"
EgressOnlyInternetGateway:
  Type: AWS::EC2::EgressOnlyInternetGateway
  Properties:
    VpcId:
      Ref: "VPC"
RouteTable:
  Type: AWS::EC2::RouteTable
  Properties:
    VpcId:
      Ref: "VPC"
VPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock: "10.0.0.0/16"
```

## Potongan templat antarmuka jaringan elastis (ENI)
<a name="cfn-template-snippets-eni"></a>

### Buat instans Amazon EC2 dengan antarmuka jaringan elastis terlampir () ENIs
<a name="cfn-template-snippets-eni-template"></a>

Contoh cuplikan berikut membuat instance Amazon EC2 menggunakan sumber daya di VPC Amazon dan subnet [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)yang ditentukan. Ini melampirkan dua antarmuka jaringan (ENIs) dengan instance, mengaitkan alamat IP Elastic ke instance melalui terlampir ENIs, dan mengkonfigurasi grup keamanan untuk akses SSH dan HTTP. Data pengguna diberikan ke instance sebagai bagian dari konfigurasi peluncuran saat instance dibuat. Data pengguna menyertakan skrip yang dikodekan dalam `base64` format untuk memastikannya diteruskan ke instance. Ketika instance diluncurkan, skrip berjalan secara otomatis sebagai bagian dari proses bootstrap. Ini menginstal`ec2-net-utils`, mengkonfigurasi antarmuka jaringan, dan memulai layanan HTTP. 

Untuk menentukan Amazon Machine Image (AMI) yang sesuai berdasarkan Wilayah yang dipilih, cuplikan menggunakan `Fn::FindInMap` fungsi yang mencari nilai dalam `RegionMap` pemetaan. Pemetaan ini harus didefinisikan dalam template yang lebih besar. Kedua antarmuka jaringan dibuat menggunakan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-networkinterface.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-networkinterface.html)sumber daya. Alamat IP elastis ditentukan menggunakan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html)sumber daya yang dialokasikan ke `vpc` domain. Alamat IP elastis ini dikaitkan dengan antarmuka jaringan menggunakan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html)sumber daya. 

`Outputs`Bagian ini mendefinisikan nilai atau sumber daya yang ingin Anda akses setelah tumpukan dibuat. Dalam cuplikan ini, output yang ditentukan adalah`InstancePublicIp`, yang mewakili alamat IP publik dari instans EC2 yang dibuat oleh tumpukan. Anda dapat mengambil output ini di tab **Output** di CloudFormation konsol, atau menggunakan [perintah deskripsi-tumpukan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html). 

Untuk informasi selengkapnya tentang antarmuka jaringan elastis, lihat [Antarmuka jaringan elastis](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html).

#### JSON
<a name="cfn-template-snippets-eni-example-1.json"></a>

```
"Resources": {
    "ControlPortAddress": {
        "Type": "AWS::EC2::EIP",
        "Properties": {
            "Domain": "vpc"
        }
    },
    "AssociateControlPort": {
        "Type": "AWS::EC2::EIPAssociation",
        "Properties": {
            "AllocationId": {
                "Fn::GetAtt": [
                    "ControlPortAddress",
                    "AllocationId"
                ]
            },
            "NetworkInterfaceId": {
                "Ref": "controlXface"
            }
        }
    },
    "WebPortAddress": {
        "Type": "AWS::EC2::EIP",
        "Properties": {
            "Domain": "vpc"
        }
    },
    "AssociateWebPort": {
        "Type": "AWS::EC2::EIPAssociation",
        "Properties": {
            "AllocationId": {
                "Fn::GetAtt": [
                    "WebPortAddress",
                    "AllocationId"
                ]
            },
            "NetworkInterfaceId": {
                "Ref": "webXface"
            }
        }
    },
    "SSHSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "VpcId": {
                "Ref": "VpcId"
            },
            "GroupDescription": "Enable SSH access via port 22",
            "SecurityGroupIngress": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": 22,
                    "IpProtocol": "tcp",
                    "ToPort": 22
                }
            ]
        }
    },
    "WebSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "VpcId": {
                "Ref": "VpcId"
            },
            "GroupDescription": "Enable HTTP access via user-defined port",
            "SecurityGroupIngress": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": 80,
                    "IpProtocol": "tcp",
                    "ToPort": 80
                }
            ]
        }
    },
    "controlXface": {
        "Type": "AWS::EC2::NetworkInterface",
        "Properties": {
            "SubnetId": {
                "Ref": "SubnetId"
            },
            "Description": "Interface for controlling traffic such as SSH",
            "GroupSet": [
                {
                    "Fn::GetAtt": [
                        "SSHSecurityGroup",
                        "GroupId"
                    ]
                }
            ],
            "SourceDestCheck": true,
            "Tags": [
                {
                    "Key": "Network",
                    "Value": "Control"
                }
            ]
        }
    },
    "webXface": {
        "Type": "AWS::EC2::NetworkInterface",
        "Properties": {
            "SubnetId": {
                "Ref": "SubnetId"
            },
            "Description": "Interface for web traffic",
            "GroupSet": [
                {
                    "Fn::GetAtt": [
                        "WebSecurityGroup",
                        "GroupId"
                    ]
                }
            ],
            "SourceDestCheck": true,
            "Tags": [
                {
                    "Key": "Network",
                    "Value": "Web"
                }
            ]
        }
    },
    "Ec2Instance": {
        "Type": "AWS::EC2::Instance",
        "Properties": {
            "ImageId": {
                "Fn::FindInMap": [
                    "RegionMap",
                    {
                        "Ref": "AWS::Region"
                    },
                    "AMI"
                ]
            },
            "KeyName": {
                "Ref": "KeyName"
            },
            "NetworkInterfaces": [
                {
                    "NetworkInterfaceId": {
                        "Ref": "controlXface"
                    },
                    "DeviceIndex": "0"
                },
                {
                    "NetworkInterfaceId": {
                        "Ref": "webXface"
                    },
                    "DeviceIndex": "1"
                }
            ],
            "Tags": [
                {
                    "Key": "Role",
                    "Value": "Test Instance"
                }
            ],
            "UserData": {
                "Fn::Base64": {
                    "Fn::Sub": "#!/bin/bash -xe\nyum install ec2-net-utils -y\nec2ifup eth1\nservice httpd start\n"
                }
            }
        }
    }
},
"Outputs": {
    "InstancePublicIp": {
        "Description": "Public IP Address of the EC2 Instance",
        "Value": {
            "Fn::GetAtt": [
                "Ec2Instance",
                "PublicIp"
            ]
        }
    }
}
```

#### YAML
<a name="cfn-template-snippets-eni-example.yaml"></a>

```
Resources:
  ControlPortAddress:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  AssociateControlPort:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId:
        Fn::GetAtt:
          - ControlPortAddress
          - AllocationId
      NetworkInterfaceId:
        Ref: controlXface
  WebPortAddress:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  AssociateWebPort:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId:
        Fn::GetAtt:
          - WebPortAddress
          - AllocationId
      NetworkInterfaceId:
        Ref: webXface
  SSHSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VpcId
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          FromPort: 22
          IpProtocol: tcp
          ToPort: 22
  WebSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VpcId
      GroupDescription: Enable HTTP access via user-defined port
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          FromPort: 80
          IpProtocol: tcp
          ToPort: 80
  controlXface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId:
        Ref: SubnetId
      Description: Interface for controlling traffic such as SSH
      GroupSet:
        - Fn::GetAtt:
            - SSHSecurityGroup
            - GroupId
      SourceDestCheck: true
      Tags:
        - Key: Network
          Value: Control
  webXface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId:
        Ref: SubnetId
      Description: Interface for web traffic
      GroupSet:
        - Fn::GetAtt:
            - WebSecurityGroup
            - GroupId
      SourceDestCheck: true
      Tags:
        - Key: Network
          Value: Web
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId:
        Fn::FindInMap:
          - RegionMap
          - Ref: AWS::Region
          - AMI
      KeyName:
        Ref: KeyName
      NetworkInterfaces:
        - NetworkInterfaceId:
            Ref: controlXface
          DeviceIndex: "0"
        - NetworkInterfaceId:
            Ref: webXface
          DeviceIndex: "1"
      Tags:
        - Key: Role
          Value: Test Instance
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum install ec2-net-utils -y
          ec2ifup eth1
          service httpd start
Outputs:
  InstancePublicIp:
    Description: Public IP Address of the EC2 Instance
    Value:
      Fn::GetAtt:
        - Ec2Instance
        - PublicIp
```

# Templat contoh Layanan Kontainer Elastis Amazon
<a name="quickref-ecs"></a>

Amazon Elastic Container Service (Amazon ECS) adalah layanan manajemen kontainer yang memudahkan untuk menjalankan, menghentikan, dan mengelola container Docker di cluster instans Amazon Elastic Compute Cloud (Amazon EC2).

## Buat cluster dengan AL2023 Amazon ECS-Optimized-AMI
<a name="create-cluster-al2023"></a>

Tentukan cluster yang menggunakan penyedia kapasitas yang meluncurkan instans AL2023 di Amazon EC2.

**penting**  
Untuk AMI terbaru IDs, lihat AMI yang [dioptimalkan Amazon ECS di Panduan](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html) *Pengembang Layanan Kontainer Elastis Amazon*.

### JSON
<a name="quickref-ecs-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "EC2 ECS cluster that starts out empty, with no EC2 instances yet. An ECS capacity provider automatically launches more EC2 instances as required on the fly when you request ECS to launch services or standalone tasks.",
  "Parameters": {
      "InstanceType": {
          "Type": "String",
          "Description": "EC2 instance type",
          "Default": "t2.medium",
          "AllowedValues": [
              "t1.micro",
              "t2.2xlarge",
              "t2.large",
              "t2.medium",
              "t2.micro",
              "t2.nano",
              "t2.small",
              "t2.xlarge",
              "t3.2xlarge",
              "t3.large",
              "t3.medium",
              "t3.micro",
              "t3.nano",
              "t3.small",
              "t3.xlarge"
          ]
      },
      "DesiredCapacity": {
          "Type": "Number",
          "Default": "0",
          "Description": "Number of EC2 instances to launch in your ECS cluster."
      },
      "MaxSize": {
          "Type": "Number",
          "Default": "100",
          "Description": "Maximum number of EC2 instances that can be launched in your ECS cluster."
      },
      "ECSAMI": {
          "Description": "The Amazon Machine Image ID used for the cluster",
          "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
          "Default": "/aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id"
      },
      "VpcId": {
          "Type": "AWS::EC2::VPC::Id",
          "Description": "VPC ID where the ECS cluster is launched",
          "Default": "vpc-1234567890abcdef0"
      },
      "SubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of subnet IDs where the EC2 instances will be launched",
          "Default": "subnet-021345abcdef67890"
      }
  },
  "Resources": {
      "ECSCluster": {
          "Type": "AWS::ECS::Cluster",
          "Properties": {
              "ClusterSettings": [
                  {
                      "Name": "containerInsights",
                      "Value": "enabled"
                  }
              ]
          }
      },
      "ECSAutoScalingGroup": {
          "Type": "AWS::AutoScaling::AutoScalingGroup",
          "DependsOn": [
              "ECSCluster",
              "EC2Role"
          ],
          "Properties": {
              "VPCZoneIdentifier": {
                  "Ref": "SubnetIds"
              },
              "LaunchTemplate": {
                  "LaunchTemplateId": {
                      "Ref": "ContainerInstances"
                  },
                  "Version": {
                      "Fn::GetAtt": [
                          "ContainerInstances",
                          "LatestVersionNumber"
                      ]
                  }
              },
              "MinSize": 0,
              "MaxSize": {
                  "Ref": "MaxSize"
              },
              "DesiredCapacity": {
                  "Ref": "DesiredCapacity"
              },
              "NewInstancesProtectedFromScaleIn": true
          },
          "UpdatePolicy": {
              "AutoScalingReplacingUpdate": {
                  "WillReplace": "true"
              }
          }
      },
      "ContainerInstances": {
          "Type": "AWS::EC2::LaunchTemplate",
          "Properties": {
              "LaunchTemplateName": "asg-launch-template",
              "LaunchTemplateData": {
                  "ImageId": {
                      "Ref": "ECSAMI"
                  },
                  "InstanceType": {
                      "Ref": "InstanceType"
                  },
                  "IamInstanceProfile": {
                      "Name": {
                          "Ref": "EC2InstanceProfile"
                      }
                  },
                  "SecurityGroupIds": [
                      {
                          "Ref": "ContainerHostSecurityGroup"
                      }
                  ],
                  "UserData": {
                      "Fn::Base64": {
                          "Fn::Sub": "#!/bin/bash -xe\n echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config\n yum install -y aws-cfn-bootstrap\n /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource ContainerInstances --configsets full_install --region ${AWS::Region} &\n"
                      }
                  },
                  "MetadataOptions": {
                      "HttpEndpoint": "enabled",
                      "HttpTokens": "required"
                  }
              }
          }
      },
      "EC2InstanceProfile": {
          "Type": "AWS::IAM::InstanceProfile",
          "Properties": {
              "Path": "/",
              "Roles": [
                  {
                      "Ref": "EC2Role"
                  }
              ]
          }
      },
      "CapacityProvider": {
          "Type": "AWS::ECS::CapacityProvider",
          "Properties": {
              "AutoScalingGroupProvider": {
                  "AutoScalingGroupArn": {
                      "Ref": "ECSAutoScalingGroup"
                  },
                  "ManagedScaling": {
                      "InstanceWarmupPeriod": 60,
                      "MinimumScalingStepSize": 1,
                      "MaximumScalingStepSize": 100,
                      "Status": "ENABLED",
                      "TargetCapacity": 100
                  },
                  "ManagedTerminationProtection": "ENABLED"
              }
          }
      },
      "CapacityProviderAssociation": {
          "Type": "AWS::ECS::ClusterCapacityProviderAssociations",
          "Properties": {
              "CapacityProviders": [
                  {
                      "Ref": "CapacityProvider"
                  }
              ],
              "Cluster": {
                  "Ref": "ECSCluster"
              },
              "DefaultCapacityProviderStrategy": [
                  {
                      "Base": 0,
                      "CapacityProvider": {
                          "Ref": "CapacityProvider"
                      },
                      "Weight": 1
                  }
              ]
          }
      },
      "ContainerHostSecurityGroup": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Access to the EC2 hosts that run containers",
              "VpcId": {
                  "Ref": "VpcId"
              }
          }
      },
      "EC2Role": {
          "Type": "AWS::IAM::Role",
          "Properties": {
              "AssumeRolePolicyDocument": {
                  "Statement": [
                      {
                          "Effect": "Allow",
                          "Principal": {
                              "Service": [
                                  "ec2.amazonaws.com"
                              ]
                          },
                          "Action": [
                              "sts:AssumeRole"
                          ]
                      }
                  ]
              },
              "Path": "/",
              "ManagedPolicyArns": [
                  "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role",
                  "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
              ]
          }
      },
      "ECSTaskExecutionRole": {
          "Type": "AWS::IAM::Role",
          "Properties": {
              "AssumeRolePolicyDocument": {
                  "Statement": [
                      {
                          "Effect": "Allow",
                          "Principal": {
                              "Service": [
                                  "ecs-tasks.amazonaws.com"
                              ]
                          },
                          "Action": [
                              "sts:AssumeRole"
                          ],
                          "Condition": {
                              "ArnLike": {
                                  "aws:SourceArn": {
                                      "Fn::Sub": "arn:${AWS::Partition}:ecs:${AWS::Region}:${AWS::AccountId}:*"
                                  }
                              },
                              "StringEquals": {
                                  "aws:SourceAccount": {
                                        "Fn::Sub": "${AWS::AccountId}"
                                    }
                              }
                          }
                      }
                  ]
              },
              "Path": "/",
              "ManagedPolicyArns": [
                  "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
              ]
          }
      }
  },
  "Outputs": {
      "ClusterName": {
          "Description": "The ECS cluster into which to launch resources",
          "Value": "ECSCluster"
      },
      "ECSTaskExecutionRole": {
          "Description": "The role used to start up a task",
          "Value": "ECSTaskExecutionRole"
      },
      "CapacityProvider": {
          "Description": "The cluster capacity provider that the service should use to request capacity when it wants to start up a task",
          "Value": "CapacityProvider"
      }
  }
}
```

### YAML
<a name="quickref-ecs-example-1.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: EC2 ECS cluster that starts out empty, with no EC2 instances yet.
  An ECS capacity provider automatically launches more EC2 instances as required
  on the fly when you request ECS to launch services or standalone tasks.
Parameters:
  InstanceType:
    Type: String
    Description: EC2 instance type
    Default: "t2.medium"
    AllowedValues:
      - t1.micro
      - t2.2xlarge
      - t2.large
      - t2.medium
      - t2.micro
      - t2.nano
      - t2.small
      - t2.xlarge
      - t3.2xlarge
      - t3.large
      - t3.medium
      - t3.micro
      - t3.nano
      - t3.small
      - t3.xlarge
  DesiredCapacity:
    Type: Number
    Default: "0"
    Description: Number of EC2 instances to launch in your ECS cluster.
  MaxSize:
    Type: Number
    Default: "100"
    Description: Maximum number of EC2 instances that can be launched in your ECS cluster.
  ECSAMI:
    Description: The Amazon Machine Image ID used for the cluster
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VPC ID where the ECS cluster is launched
    Default: vpc-1234567890abcdef0
  SubnetIds:
    Type: List<AWS::EC2::Subnet::Id>
    Description: List of subnet IDs where the EC2 instances will be launched
    Default: "subnet-021345abcdef67890"
Resources:
# This is authorizes ECS to manage resources on your
  # account on your behalf. This role is likely already created on your account
  # ECSRole:
  #  Type: AWS::IAM::ServiceLinkedRole
  #  Properties:
  #    AWSServiceName: 'ecs.amazonaws.com'
  
   # ECS Resources
  ECSCluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterSettings:
        - Name: containerInsights
          Value: enabled
  
  # Autoscaling group. This launches the actual EC2 instances that will register
  # themselves as members of the cluster, and run the docker containers.
  ECSAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    DependsOn:
      # This is to ensure that the ASG gets deleted first before these
    # resources, when it comes to stack teardown.
      - ECSCluster
      - EC2Role
    Properties:
      VPCZoneIdentifier:
        Ref: SubnetIds
      LaunchTemplate:
        LaunchTemplateId: !Ref ContainerInstances
        Version: !GetAtt ContainerInstances.LatestVersionNumber
      MinSize: 0
      MaxSize:
        Ref: MaxSize
      DesiredCapacity:
        Ref: DesiredCapacity
      NewInstancesProtectedFromScaleIn: true
    UpdatePolicy:
      AutoScalingReplacingUpdate:
        WillReplace: "true"
  # The config for each instance that is added to the cluster
  ContainerInstances:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: "asg-launch-template"
      LaunchTemplateData:
        ImageId:
          Ref: ECSAMI
        InstanceType:
          Ref: InstanceType
        IamInstanceProfile:
          Name: !Ref EC2InstanceProfile
        SecurityGroupIds:
          - !Ref ContainerHostSecurityGroup
        # This injected configuration file is how the EC2 instance
      # knows which ECS cluster on your AWS account it should be joining
        UserData:
          Fn::Base64: !Sub |
           #!/bin/bash -xe
            echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config
            yum install -y aws-cfn-bootstrap
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource ContainerInstances --configsets full_install --region ${AWS::Region} &
         # Disable IMDSv1, and require IMDSv2
        MetadataOptions:
          HttpEndpoint: enabled
          HttpTokens: required
  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles: 
      - !Ref EC2Role 
  # Create an ECS capacity provider to attach the ASG to the ECS cluster
  # so that it autoscales as we launch more containers
  CapacityProvider:
    Type: AWS::ECS::CapacityProvider
    Properties:
      AutoScalingGroupProvider:
        AutoScalingGroupArn: !Ref ECSAutoScalingGroup
        ManagedScaling:
          InstanceWarmupPeriod: 60
          MinimumScalingStepSize: 1
          MaximumScalingStepSize: 100
          Status: ENABLED
          # Percentage of cluster reservation to try to maintain
          TargetCapacity: 100
        ManagedTerminationProtection: ENABLED
   # Create a cluster capacity provider assocation so that the cluster
  # will use the capacity provider
  CapacityProviderAssociation:
    Type: AWS::ECS::ClusterCapacityProviderAssociations
    Properties:
      CapacityProviders:
        - !Ref CapacityProvider
      Cluster: !Ref ECSCluster
      DefaultCapacityProviderStrategy:
        - Base: 0
          CapacityProvider: !Ref CapacityProvider
          Weight: 1
  # A security group for the EC2 hosts that will run the containers.
  # This can be used to limit incoming traffic to or outgoing traffic
  # from the container's host EC2 instance.
  ContainerHostSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to the EC2 hosts that run containers
      VpcId:
        Ref: VpcId
  # Role for the EC2 hosts. This allows the ECS agent on the EC2 hosts
  # to communciate with the ECS control plane, as well as download the docker
  # images from ECR to run on your host.
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
      # See reference: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerServiceforEC2Role
        - arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role
      # This managed policy allows us to connect to the instance using SSM
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
  # This is a role which is used within Fargate to allow the Fargate agent
  # to download images, and upload logs.
  ECSTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ecs-tasks.amazonaws.com
            Action:
              - sts:AssumeRole
            Condition:
              ArnLike:
                aws:SourceArn: !Sub arn:${AWS::Partition}:ecs:${AWS::Region}:${AWS::AccountId}:*
              StringEquals:
                aws:SourceAccount: !Sub ${AWS::AccountId}
      Path: /
      # This role enables all features of ECS. See reference:
    # https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonECSTaskExecutionRolePolicy
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
Outputs:
  ClusterName:
    Description: The ECS cluster into which to launch resources
    Value: ECSCluster
  ECSTaskExecutionRole:
    Description: The role used to start up a task
    Value: ECSTaskExecutionRole
  CapacityProvider:
    Description: The cluster capacity provider that the service should use to
      request capacity when it wants to start up a task
    Value: CapacityProvider
```

## Menyebarkan layanan
<a name="create-service"></a>

Template berikut mendefinisikan layanan yang menggunakan penyedia kapasitas untuk meminta AL2023 kapasitas untuk dijalankan. Kontainer akan diluncurkan ke AL2023 instance saat online:

### JSON
<a name="quickref-ecs-example-2.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "An example service that deploys in AWS VPC networking mode on EC2 capacity. Service uses a capacity provider to request EC2 instances to run on. Service runs with networking in private subnets, but still accessible to the internet via a load balancer hosted in public subnets.",
  "Parameters": {
      "VpcId": {
          "Type": "String",
          "Description": "The VPC that the service is running inside of"
      },
      "PublicSubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of public subnet ID's to put the load balancer in"
      },
      "PrivateSubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of private subnet ID's that the AWS VPC tasks are in"
      },
      "ClusterName": {
          "Type": "String",
          "Description": "The name of the ECS cluster into which to launch capacity."
      },
      "ECSTaskExecutionRole": {
          "Type": "String",
          "Description": "The role used to start up an ECS task"
      },
      "CapacityProvider": {
          "Type": "String",
          "Description": "The cluster capacity provider that the service should use to request capacity when it wants to start up a task"
      },
      "ServiceName": {
          "Type": "String",
          "Default": "web",
          "Description": "A name for the service"
      },
      "ImageUrl": {
          "Type": "String",
          "Default": "public.ecr.aws/docker/library/nginx:latest",
          "Description": "The url of a docker image that contains the application process that will handle the traffic for this service"
      },
      "ContainerCpu": {
          "Type": "Number",
          "Default": 256,
          "Description": "How much CPU to give the container. 1024 is 1 CPU"
      },
      "ContainerMemory": {
          "Type": "Number",
          "Default": 512,
          "Description": "How much memory in megabytes to give the container"
      },
      "ContainerPort": {
          "Type": "Number",
          "Default": 80,
          "Description": "What port that the application expects traffic on"
      },
      "DesiredCount": {
          "Type": "Number",
          "Default": 2,
          "Description": "How many copies of the service task to run"
      }
  },
  "Resources": {
      "TaskDefinition": {
          "Type": "AWS::ECS::TaskDefinition",
          "Properties": {
              "Family": {
                  "Ref": "ServiceName"
              },
              "Cpu": {
                  "Ref": "ContainerCpu"
              },
              "Memory": {
                  "Ref": "ContainerMemory"
              },
              "NetworkMode": "awsvpc",
              "RequiresCompatibilities": [
                  "EC2"
              ],
              "ExecutionRoleArn": {
                  "Ref": "ECSTaskExecutionRole"
              },
              "ContainerDefinitions": [
                  {
                      "Name": {
                          "Ref": "ServiceName"
                      },
                      "Cpu": {
                          "Ref": "ContainerCpu"
                      },
                      "Memory": {
                          "Ref": "ContainerMemory"
                      },
                      "Image": {
                          "Ref": "ImageUrl"
                      },
                      "PortMappings": [
                          {
                              "ContainerPort": {
                                  "Ref": "ContainerPort"
                              },
                              "HostPort": {
                                  "Ref": "ContainerPort"
                              }
                          }
                      ],
                      "LogConfiguration": {
                          "LogDriver": "awslogs",
                          "Options": {
                              "mode": "non-blocking",
                              "max-buffer-size": "25m",
                              "awslogs-group": {
                                  "Ref": "LogGroup"
                              },
                              "awslogs-region": {
                                  "Ref": "AWS::Region"
                              },
                              "awslogs-stream-prefix": {
                                  "Ref": "ServiceName"
                              }
                          }
                      }
                  }
              ]
          }
      },
      "Service": {
          "Type": "AWS::ECS::Service",
          "DependsOn": "PublicLoadBalancerListener",
          "Properties": {
              "ServiceName": {
                  "Ref": "ServiceName"
              },
              "Cluster": {
                  "Ref": "ClusterName"
              },
              "PlacementStrategies": [
                  {
                      "Field": "attribute:ecs.availability-zone",
                      "Type": "spread"
                  },
                  {
                      "Field": "cpu",
                      "Type": "binpack"
                  }
              ],
              "CapacityProviderStrategy": [
                  {
                      "Base": 0,
                      "CapacityProvider": {
                          "Ref": "CapacityProvider"
                      },
                      "Weight": 1
                  }
              ],
              "NetworkConfiguration": {
                  "AwsvpcConfiguration": {
                      "SecurityGroups": [
                          {
                              "Ref": "ServiceSecurityGroup"
                          }
                      ],
                      "Subnets": {
                          "Ref": "PrivateSubnetIds"
                      }
                  }
              },
              "DeploymentConfiguration": {
                  "MaximumPercent": 200,
                  "MinimumHealthyPercent": 75
              },
              "DesiredCount": {
                  "Ref": "DesiredCount"
              },
              "TaskDefinition": {
                  "Ref": "TaskDefinition"
              },
              "LoadBalancers": [
                  {
                      "ContainerName": {
                          "Ref": "ServiceName"
                      },
                      "ContainerPort": {
                          "Ref": "ContainerPort"
                      },
                      "TargetGroupArn": {
                          "Ref": "ServiceTargetGroup"
                      }
                  }
              ]
          }
      },
      "ServiceSecurityGroup": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Security group for service",
              "VpcId": {
                  "Ref": "VpcId"
              }
          }
      },
      "ServiceTargetGroup": {
          "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
          "Properties": {
              "HealthCheckIntervalSeconds": 6,
              "HealthCheckPath": "/",
              "HealthCheckProtocol": "HTTP",
              "HealthCheckTimeoutSeconds": 5,
              "HealthyThresholdCount": 2,
              "TargetType": "ip",
              "Port": {
                  "Ref": "ContainerPort"
              },
              "Protocol": "HTTP",
              "UnhealthyThresholdCount": 10,
              "VpcId": {
                  "Ref": "VpcId"
              },
              "TargetGroupAttributes": [
                  {
                      "Key": "deregistration_delay.timeout_seconds",
                      "Value": 0
                  }
              ]
          }
      },
      "PublicLoadBalancerSG": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Access to the public facing load balancer",
              "VpcId": {
                  "Ref": "VpcId"
              },
              "SecurityGroupIngress": [
                  {
                      "CidrIp": "0.0.0.0/0",
                      "IpProtocol": -1
                  }
              ]
          }
      },
      "PublicLoadBalancer": {
          "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
          "Properties": {
              "Scheme": "internet-facing",
              "LoadBalancerAttributes": [
                  {
                      "Key": "idle_timeout.timeout_seconds",
                      "Value": "30"
                  }
              ],
              "Subnets": {
                  "Ref": "PublicSubnetIds"
              },
              "SecurityGroups": [
                  {
                      "Ref": "PublicLoadBalancerSG"
                  }
              ]
          }
      },
      "PublicLoadBalancerListener": {
          "Type": "AWS::ElasticLoadBalancingV2::Listener",
          "Properties": {
              "DefaultActions": [
                  {
                      "Type": "forward",
                      "ForwardConfig": {
                          "TargetGroups": [
                              {
                                  "TargetGroupArn": {
                                      "Ref": "ServiceTargetGroup"
                                  },
                                  "Weight": 100
                              }
                          ]
                      }
                  }
              ],
              "LoadBalancerArn": {
                  "Ref": "PublicLoadBalancer"
              },
              "Port": 80,
              "Protocol": "HTTP"
          }
      },
      "ServiceIngressfromLoadBalancer": {
          "Type": "AWS::EC2::SecurityGroupIngress",
          "Properties": {
              "Description": "Ingress from the public ALB",
              "GroupId": {
                  "Ref": "ServiceSecurityGroup"
              },
              "IpProtocol": -1,
              "SourceSecurityGroupId": {
                  "Ref": "PublicLoadBalancerSG"
              }
          }
      },
      "LogGroup": {
          "Type": "AWS::Logs::LogGroup"
      }
  }
}
```

### YAML
<a name="quickref-ecs-example-2.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: >-
  An example service that deploys in AWS VPC networking mode on EC2 capacity.
  Service uses a capacity provider to request EC2 instances to run on. Service
  runs with networking in private subnets, but still accessible to the internet
  via a load balancer hosted in public subnets.
Parameters:
  VpcId:
    Type: String
    Description: The VPC that the service is running inside of
  PublicSubnetIds:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: List of public subnet ID's to put the load balancer in
  PrivateSubnetIds:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: List of private subnet ID's that the AWS VPC tasks are in
  ClusterName:
    Type: String
    Description: The name of the ECS cluster into which to launch capacity.
  ECSTaskExecutionRole:
    Type: String
    Description: The role used to start up an ECS task
  CapacityProvider:
    Type: String
    Description: >-
      The cluster capacity provider that the service should use to request
      capacity when it wants to start up a task
  ServiceName:
    Type: String
    Default: web
    Description: A name for the service
  ImageUrl:
    Type: String
    Default: 'public.ecr.aws/docker/library/nginx:latest'
    Description: >-
      The url of a docker image that contains the application process that will
      handle the traffic for this service
  ContainerCpu:
    Type: Number
    Default: 256
    Description: How much CPU to give the container. 1024 is 1 CPU
  ContainerMemory:
    Type: Number
    Default: 512
    Description: How much memory in megabytes to give the container
  ContainerPort:
    Type: Number
    Default: 80
    Description: What port that the application expects traffic on
  DesiredCount:
    Type: Number
    Default: 2
    Description: How many copies of the service task to run
Resources:
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Ref ServiceName
      Cpu: !Ref ContainerCpu
      Memory: !Ref ContainerMemory
      NetworkMode: awsvpc
      RequiresCompatibilities:
        - EC2
      ExecutionRoleArn: !Ref ECSTaskExecutionRole
      ContainerDefinitions:
        - Name: !Ref ServiceName
          Cpu: !Ref ContainerCpu
          Memory: !Ref ContainerMemory
          Image: !Ref ImageUrl
          PortMappings:
            - ContainerPort: !Ref ContainerPort
              HostPort: !Ref ContainerPort
          LogConfiguration:
            LogDriver: awslogs
            Options:
              mode: non-blocking
              max-buffer-size: 25m
              awslogs-group: !Ref LogGroup
              awslogs-region: !Ref AWS::Region
              awslogs-stream-prefix: !Ref ServiceName
  Service:
    Type: AWS::ECS::Service
    DependsOn: PublicLoadBalancerListener
    Properties:
      ServiceName: !Ref ServiceName
      Cluster: !Ref ClusterName
      PlacementStrategies:
        - Field: 'attribute:ecs.availability-zone'
          Type: spread
        - Field: cpu
          Type: binpack
      CapacityProviderStrategy:
        - Base: 0
          CapacityProvider: !Ref CapacityProvider
          Weight: 1
      NetworkConfiguration:
        AwsvpcConfiguration:
          SecurityGroups:
            - !Ref ServiceSecurityGroup
          Subnets: !Ref PrivateSubnetIds
      DeploymentConfiguration:
        MaximumPercent: 200
        MinimumHealthyPercent: 75
      DesiredCount: !Ref DesiredCount
      TaskDefinition: !Ref TaskDefinition
      LoadBalancers:
        - ContainerName: !Ref ServiceName
          ContainerPort: !Ref ContainerPort
          TargetGroupArn: !Ref ServiceTargetGroup
  ServiceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for service
      VpcId: !Ref VpcId
  ServiceTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 6
      HealthCheckPath: /
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 2
      TargetType: ip
      Port: !Ref ContainerPort
      Protocol: HTTP
      UnhealthyThresholdCount: 10
      VpcId: !Ref VpcId
      TargetGroupAttributes:
        - Key: deregistration_delay.timeout_seconds
          Value: 0
  PublicLoadBalancerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to the public facing load balancer
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          IpProtocol: -1
  PublicLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      LoadBalancerAttributes:
        - Key: idle_timeout.timeout_seconds
          Value: '30'
      Subnets: !Ref PublicSubnetIds
      SecurityGroups:
        - !Ref PublicLoadBalancerSG
  PublicLoadBalancerListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ServiceTargetGroup
                Weight: 100
      LoadBalancerArn: !Ref PublicLoadBalancer
      Port: 80
      Protocol: HTTP
  ServiceIngressfromLoadBalancer:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      Description: Ingress from the public ALB
      GroupId: !Ref ServiceSecurityGroup
      IpProtocol: -1
      SourceSecurityGroupId: !Ref PublicLoadBalancerSG
  LogGroup:
    Type: AWS::Logs::LogGroup
```

# Templat Contoh Sistem File Elastis Amazon
<a name="quickref-efs"></a>

Amazon Elastic File System (Amazon EFS) adalah layanan penyimpanan file untuk instans Amazon Elastic Compute Cloud (Amazon EC2). Dengan Amazon EFS, aplikasi Anda memiliki penyimpanan saat mereka membutuhkannya karena kapasitas penyimpanan tumbuh dan menyusut secara otomatis saat Anda menambah dan menghapus file.

Contoh template berikut menerapkan EC2 instance (dalam grup Auto Scaling) yang terkait dengan sistem file Amazon EFS. Untuk mengaitkan instans dengan sistem file, instans menjalankan skrip pembantu cfn-init, yang mengunduh dan menginstal paket yum `nfs-utils`, membuat direktori baru, lalu menggunakan nama DNS sistem file untuk memasang sistem file pada direktori tersebut. Nama DNS sistem file diselesaikan ke alamat IP target mount di Availability Zone EC2 instans Amazon. Untuk informasi selengkapnya tentang struktur nama DNS, lihat [Memasang Sistem File](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html) di *Panduan Pengguna Amazon Elastic File System*.

Untuk mengukur aktivitas Sistem File Jaringan, template menyertakan CloudWatch metrik Amazon khusus. Templat juga membuat VPC, subnet, dan grup keamanan. Untuk memungkinkan instance berkomunikasi dengan sistem file, VPC harus mengaktifkan DNS, dan target pemasangan dan instance harus berada di Availability Zone (AZ) yang sama, yang ditentukan oleh subnet. EC2 

Kelompok keamanan target mount memungkinkan koneksi jaringan ke port TCP 2049, yang diperlukan untuk NFSv4 klien untuk me-mount sistem file. Untuk informasi selengkapnya tentang grup keamanan untuk EC2 instans dan target pemasangan, lihat [Keamanan](https://docs.aws.amazon.com/efs/latest/ug/security-considerations.html) di [https://docs.aws.amazon.com/efs/latest/ug/](https://docs.aws.amazon.com/efs/latest/ug/).

**catatan**  
Jika Anda membuat pembaruan ke target pemasangan yang menyebabkannya diganti, instans atau aplikasi yang menggunakan sistem file terkait mungkin terganggu. Hal ini dapat menyebabkan penulisan tidak berkomitmen hilang. Untuk menghindari gangguan, hentikan instans Anda saat memperbarui target pemasangan dengan mengatur kapasitas yang diinginkan ke nol. Hal ini memungkinkan instans untuk membongkar sistem file sebelum target pemasangan dihapus. Setelah pembaruan pemasangan selesai, mulailah instans Anda dalam pembaruan berikutnya dengan mengatur kapasitas yang diinginkan.

## JSON
<a name="quickref-efs-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "This template creates an Amazon EFS file system and mount target and associates it with Amazon EC2 instances in an Auto Scaling group. **WARNING** This template creates Amazon EC2 instances and related resources. You will be billed for the AWS resources used if you create a stack from this template.",
  "Parameters": {
    "InstanceType" : {
      "Description" : "WebServer EC2 instance type",
      "Type" : "String",
      "Default" : "t2.small",
      "AllowedValues" : [ 
        "t1.micro", 
        "t2.nano", 
        "t2.micro", 
        "t2.small", 
        "t2.medium", 
        "t2.large", 
        "m1.small", 
        "m1.medium", 
        "m1.large", 
        "m1.xlarge", 
        "m2.xlarge", 
        "m2.2xlarge", 
        "m2.4xlarge", 
        "m3.medium", 
        "m3.large", 
        "m3.xlarge", 
        "m3.2xlarge", 
        "m4.large", 
        "m4.xlarge", 
        "m4.2xlarge", 
        "m4.4xlarge", 
        "m4.10xlarge", 
        "c1.medium", 
        "c1.xlarge", 
        "c3.large", 
        "c3.xlarge", 
        "c3.2xlarge", 
        "c3.4xlarge", 
        "c3.8xlarge", 
        "c4.large", 
        "c4.xlarge", 
        "c4.2xlarge", 
        "c4.4xlarge", 
        "c4.8xlarge", 
        "g2.2xlarge", 
        "g2.8xlarge", 
        "r3.large", 
        "r3.xlarge", 
        "r3.2xlarge", 
        "r3.4xlarge", 
        "r3.8xlarge", 
        "i2.xlarge", 
        "i2.2xlarge", 
        "i2.4xlarge", 
        "i2.8xlarge", 
        "d2.xlarge", 
        "d2.2xlarge", 
        "d2.4xlarge", 
        "d2.8xlarge", 
        "hi1.4xlarge", 
        "hs1.8xlarge", 
        "cr1.8xlarge", 
        "cc2.8xlarge", 
        "cg1.4xlarge"
      ],
      "ConstraintDescription" : "must be a valid EC2 instance type."
    },
    "KeyName": {
      "Type": "AWS::EC2::KeyPair::KeyName",
      "Description": "Name of an existing EC2 key pair to enable SSH access to the EC2 instances"
    },
    "AsgMaxSize": {
      "Type": "Number",
      "Description": "Maximum size and initial desired capacity of Auto Scaling Group",
      "Default": "2"
    },
    "SSHLocation" : {
      "Description" : "The IP address range that can be used to connect to the EC2 instances by using SSH",
      "Type": "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default": "0.0.0.0/0",
      "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "VolumeName" : {
      "Description" : "The name to be used for the EFS volume",
      "Type": "String",
      "MinLength": "1",
      "Default": "myEFSvolume"
    },
    "MountPoint" : {
      "Description" : "The Linux mount point for the EFS volume",
      "Type": "String",
      "MinLength": "1",
      "Default": "myEFSvolume"
    }
  },
  "Mappings" : {
    "AWSInstanceType2Arch" : {
      "t1.micro"    : { "Arch" : "HVM64"  },
      "t2.nano"     : { "Arch" : "HVM64"  },
      "t2.micro"    : { "Arch" : "HVM64"  },
      "t2.small"    : { "Arch" : "HVM64"  },
      "t2.medium"   : { "Arch" : "HVM64"  },
      "t2.large"    : { "Arch" : "HVM64"  },
      "m1.small"    : { "Arch" : "HVM64"  },
      "m1.medium"   : { "Arch" : "HVM64"  },
      "m1.large"    : { "Arch" : "HVM64"  },
      "m1.xlarge"   : { "Arch" : "HVM64"  },
      "m2.xlarge"   : { "Arch" : "HVM64"  },
      "m2.2xlarge"  : { "Arch" : "HVM64"  },
      "m2.4xlarge"  : { "Arch" : "HVM64"  },
      "m3.medium"   : { "Arch" : "HVM64"  },
      "m3.large"    : { "Arch" : "HVM64"  },
      "m3.xlarge"   : { "Arch" : "HVM64"  },
      "m3.2xlarge"  : { "Arch" : "HVM64"  },
      "m4.large"    : { "Arch" : "HVM64"  },
      "m4.xlarge"   : { "Arch" : "HVM64"  },
      "m4.2xlarge"  : { "Arch" : "HVM64"  },
      "m4.4xlarge"  : { "Arch" : "HVM64"  },
      "m4.10xlarge" : { "Arch" : "HVM64"  },
      "c1.medium"   : { "Arch" : "HVM64"  },
      "c1.xlarge"   : { "Arch" : "HVM64"  },
      "c3.large"    : { "Arch" : "HVM64"  },
      "c3.xlarge"   : { "Arch" : "HVM64"  },
      "c3.2xlarge"  : { "Arch" : "HVM64"  },
      "c3.4xlarge"  : { "Arch" : "HVM64"  },
      "c3.8xlarge"  : { "Arch" : "HVM64"  },
      "c4.large"    : { "Arch" : "HVM64"  },
      "c4.xlarge"   : { "Arch" : "HVM64"  },
      "c4.2xlarge"  : { "Arch" : "HVM64"  },
      "c4.4xlarge"  : { "Arch" : "HVM64"  },
      "c4.8xlarge"  : { "Arch" : "HVM64"  },
      "g2.2xlarge"  : { "Arch" : "HVMG2"  },
      "g2.8xlarge"  : { "Arch" : "HVMG2"  },
      "r3.large"    : { "Arch" : "HVM64"  },
      "r3.xlarge"   : { "Arch" : "HVM64"  },
      "r3.2xlarge"  : { "Arch" : "HVM64"  },
      "r3.4xlarge"  : { "Arch" : "HVM64"  },
      "r3.8xlarge"  : { "Arch" : "HVM64"  },
      "i2.xlarge"   : { "Arch" : "HVM64"  },
      "i2.2xlarge"  : { "Arch" : "HVM64"  },
      "i2.4xlarge"  : { "Arch" : "HVM64"  },
      "i2.8xlarge"  : { "Arch" : "HVM64"  },
      "d2.xlarge"   : { "Arch" : "HVM64"  },
      "d2.2xlarge"  : { "Arch" : "HVM64"  },
      "d2.4xlarge"  : { "Arch" : "HVM64"  },
      "d2.8xlarge"  : { "Arch" : "HVM64"  },
      "hi1.4xlarge" : { "Arch" : "HVM64"  },
      "hs1.8xlarge" : { "Arch" : "HVM64"  },
      "cr1.8xlarge" : { "Arch" : "HVM64"  },
      "cc2.8xlarge" : { "Arch" : "HVM64"  }
    },
    "AWSRegionArch2AMI" : {
      "us-east-1"        : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"},
      "us-west-2"        : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"},
      "us-west-1"        : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"},
      "eu-west-1"        : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"},
      "eu-west-2"        : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"},
      "eu-west-3"        : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"},
      "eu-central-1"     : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"},
      "ap-northeast-1"   : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"},
      "ap-northeast-2"   : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"},
      "ap-northeast-3"   : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"},
      "ap-southeast-1"   : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"},
      "ap-southeast-2"   : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"},
      "ap-south-1"       : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"},
      "us-east-2"        : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"},
      "ca-central-1"     : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"},
      "sa-east-1"        : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"},
      "cn-north-1"       : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"},
      "cn-northwest-1"   : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"}
    }
  },
  "Resources": {
    "CloudWatchPutMetricsRole" : {
      "Type"  : "AWS::IAM::Role",
      "Properties" : {
          "AssumeRolePolicyDocument" : {
              "Statement" : [ {
                  "Effect" : "Allow",
                  "Principal" : {
                      "Service" : [ "ec2.amazonaws.com" ]
                  },
                  "Action" : [ "sts:AssumeRole" ]
              } ]
          },
          "Path" : "/"
      }
    },
    "CloudWatchPutMetricsRolePolicy" : {
        "Type" : "AWS::IAM::Policy",
        "Properties" : {
            "PolicyName" : "CloudWatch_PutMetricData",
            "PolicyDocument" : {
              "Version": "2012-10-17",		 	 	 
              "Statement": [
                {
                  "Sid": "CloudWatchPutMetricData",
                  "Effect": "Allow",
                  "Action": ["cloudwatch:PutMetricData"],
                  "Resource": ["*"]
                }
              ]
            },
            "Roles" : [ { "Ref" : "CloudWatchPutMetricsRole" } ]
        }
    },
    "CloudWatchPutMetricsInstanceProfile" : {
      "Type" : "AWS::IAM::InstanceProfile",
      "Properties" : {
        "Path" : "/",
        "Roles" : [ { "Ref" : "CloudWatchPutMetricsRole" } ]
      }
    },
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "EnableDnsSupport" : "true",
        "EnableDnsHostnames" : "true",
        "CidrBlock": "10.0.0.0/16",
        "Tags": [ {"Key": "Application", "Value": { "Ref": "AWS::StackId"} } ]
      }
    },
    "InternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway",
      "Properties" : {
        "Tags" : [
          { "Key" : "Application", "Value" : { "Ref" : "AWS::StackName" } },
          { "Key" : "Network", "Value" : "Public" }
        ]
      }
    },
    "GatewayToInternet" : {
      "Type" : "AWS::EC2::VPCGatewayAttachment",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "InternetGatewayId" : { "Ref" : "InternetGateway" }
      }
    },
    "RouteTable":{
      "Type":"AWS::EC2::RouteTable",
      "Properties":{
        "VpcId": {"Ref":"VPC"}
      }
    },
    "SubnetRouteTableAssoc": {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "RouteTableId" : {"Ref":"RouteTable"},
        "SubnetId" : {"Ref":"Subnet"}
      }
    },
    "InternetGatewayRoute": {
        "Type":"AWS::EC2::Route",
        "Properties":{
            "DestinationCidrBlock":"0.0.0.0/0",
            "RouteTableId":{"Ref":"RouteTable"},
            "GatewayId":{"Ref":"InternetGateway"}
        }
    },
    "Subnet": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "CidrBlock": "10.0.0.0/24",
        "Tags": [ { "Key": "Application", "Value": { "Ref": "AWS::StackId" } } ]
      }
    },    
    "InstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "GroupDescription": "Enable SSH access via port 22",
        "SecurityGroupIngress": [
          { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } },
          { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" }
         ]
      }
    },
    "MountTargetSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "GroupDescription": "Security group for mount target",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 2049,
            "ToPort": 2049,
            "CidrIp": "0.0.0.0/0"
          }
        ]
      }
    },
    "FileSystem": {
      "Type": "AWS::EFS::FileSystem",
      "Properties": {
        "PerformanceMode": "generalPurpose",
        "FileSystemTags": [
          {
            "Key": "Name",
            "Value": { "Ref" : "VolumeName" }
          }
        ]
      }
    },
    "MountTarget": {
      "Type": "AWS::EFS::MountTarget",
      "Properties": {
        "FileSystemId": { "Ref": "FileSystem" },
        "SubnetId": { "Ref": "Subnet" },
        "SecurityGroups": [ { "Ref": "MountTargetSecurityGroup" } ]        
      }
    },
    "LaunchConfiguration": {
      "Type": "AWS::AutoScaling::LaunchConfiguration",
      "Metadata" : {
        "AWS::CloudFormation::Init" : {
          "configSets" : {
            "MountConfig" : [ "setup", "mount" ]
          },
          "setup" : {
            "packages" : {
              "yum" : {
                "nfs-utils" : []
              }
            },
            "files" : {
              "/home/ec2-user/post_nfsstat" : {
                "content" : { "Fn::Join" : [ "", [
                      "#!/bin/bash\n",
                      "\n",
                      "INPUT=\"$(cat)\"\n",
                      "CW_JSON_OPEN='{ \"Namespace\": \"EFS\", \"MetricData\": [ '\n",
                      "CW_JSON_CLOSE=' ] }'\n",
                      "CW_JSON_METRIC=''\n",
                      "METRIC_COUNTER=0\n",
                      "\n",
                      "for COL in 1 2 3 4 5 6; do\n",
                      "\n",
                      " COUNTER=0\n",
                      " METRIC_FIELD=$COL\n",
                      " DATA_FIELD=$(($COL+($COL-1)))\n",
                      "\n",
                      " while read line; do\n",
                      "   if [[ COUNTER -gt 0 ]]; then\n",
                      "\n",
                      "     LINE=`echo $line | tr -s ' ' `\n",
                      "     AWS_COMMAND=\"aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, "\"\n",
                      "     MOD=$(( $COUNTER % 2))\n",
                      "\n",
                      "     if [ $MOD -eq 1 ]; then\n",
                      "       METRIC_NAME=`echo $LINE | cut -d ' ' -f $METRIC_FIELD`\n",
                      "     else\n",
                      "       METRIC_VALUE=`echo $LINE | cut -d ' ' -f $DATA_FIELD`\n",
                      "     fi\n",
                      "\n",
                      "     if [[ -n \"$METRIC_NAME\" && -n \"$METRIC_VALUE\" ]]; then\n",
                      "       INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)\n",
                      "       CW_JSON_METRIC=\"$CW_JSON_METRIC { \\\"MetricName\\\": \\\"$METRIC_NAME\\\", \\\"Dimensions\\\": [{\\\"Name\\\": \\\"InstanceId\\\", \\\"Value\\\": \\\"$INSTANCE_ID\\\"} ], \\\"Value\\\": $METRIC_VALUE },\"\n",
                      "       unset METRIC_NAME\n",
                      "       unset METRIC_VALUE\n",
                      "\n",
                      "       METRIC_COUNTER=$((METRIC_COUNTER+1))\n",
                      "       if [ $METRIC_COUNTER -eq 20 ]; then\n",
                      "         # 20 is max metric collection size, so we have to submit here\n",
                      "         aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, " --cli-input-json \"`echo $CW_JSON_OPEN ${CW_JSON_METRIC%?} $CW_JSON_CLOSE`\"\n",
                      "\n",
                      "         # reset\n",
                      "         METRIC_COUNTER=0\n",
                      "         CW_JSON_METRIC=''\n",
                      "       fi\n",
                      "     fi  \n",
                      "\n",
                      "\n",
                      "\n",
                      "     COUNTER=$((COUNTER+1))\n",
                      "   fi\n",
                      "\n",
                      "   if [[ \"$line\" == \"Client nfs v4:\" ]]; then\n",
                      "     # the next line is the good stuff \n",
                      "     COUNTER=$((COUNTER+1))\n",
                      "   fi\n",
                      " done <<< \"$INPUT\"\n",
                      "done\n",
                      "\n",
                      "# submit whatever is left\n",
                      "aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, " --cli-input-json \"`echo $CW_JSON_OPEN ${CW_JSON_METRIC%?} $CW_JSON_CLOSE`\""
                    ] ] },
                "mode": "000755",
                "owner": "ec2-user",
                "group": "ec2-user"
              },
              "/home/ec2-user/crontab" : {
                "content" : { "Fn::Join" : [ "", [
                  "* * * * * /usr/sbin/nfsstat | /home/ec2-user/post_nfsstat\n"
                ] ] },
                "owner": "ec2-user",
                "group": "ec2-user"
              }
            },
            "commands" : {
              "01_createdir" : {
                "command" : {"Fn::Join" : [ "", [ "mkdir /", { "Ref" : "MountPoint" }]]}
              }
            }
          },
          "mount" : {
            "commands" : {
              "01_mount" : {
                "command" : { "Fn::Sub": "sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 ${FileSystem}.efs.${AWS::Region}.amazonaws.com:/ /${MountPoint}"}
              },
              "02_permissions" : {
                "command" : {"Fn::Join" : [ "", [ "chown ec2-user:ec2-user /", { "Ref" : "MountPoint" }]]}
              }
            }
          }
        }
      },
      "Properties": {
        "AssociatePublicIpAddress" : true,
        "ImageId": {
          "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, {
            "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ]
          } ]
        },
        "InstanceType": { "Ref": "InstanceType" },
        "KeyName": { "Ref": "KeyName" },
        "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ],
        "IamInstanceProfile" : { "Ref" : "CloudWatchPutMetricsInstanceProfile" },
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
             "#!/bin/bash -xe\n",
             "yum install -y aws-cfn-bootstrap\n",

             "/opt/aws/bin/cfn-init -v ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource LaunchConfiguration ",
             "         --configsets MountConfig ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n",

             "crontab /home/ec2-user/crontab\n",

             "/opt/aws/bin/cfn-signal -e $? ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource AutoScalingGroup ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n"
        ]]}}
      }
    },
    "AutoScalingGroup": {
      "Type": "AWS::AutoScaling::AutoScalingGroup",
      "DependsOn": ["MountTarget", "GatewayToInternet"],
      "CreationPolicy" : {
        "ResourceSignal" : {
          "Timeout" : "PT15M",
          "Count"   : { "Ref": "AsgMaxSize" }
        }
      },
      "Properties": {
        "VPCZoneIdentifier": [ { "Ref": "Subnet" } ],
        "LaunchConfigurationName": { "Ref": "LaunchConfiguration" },
        "MinSize": "1",
        "MaxSize": { "Ref": "AsgMaxSize" },
        "DesiredCapacity": { "Ref": "AsgMaxSize" },
        "Tags": [ {
          "Key": "Name",
          "Value": "EFS FileSystem Mounted Instance",
          "PropagateAtLaunch": "true"
        } ]
      }
    }
  },
  "Outputs" : {
    "MountTargetID" : {
      "Description" : "Mount target ID",
      "Value" :  { "Ref" : "MountTarget" }
    },
    "FileSystemID" : {
      "Description" : "File system ID",
      "Value" :  { "Ref" : "FileSystem" }
    }
  }
}
```

## YAML
<a name="quickref-efs-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: This template creates an Amazon EFS file system and mount target and
  associates it with Amazon EC2 instances in an Auto Scaling group. **WARNING** This
  template creates Amazon EC2 instances and related resources. You will be billed
  for the AWS resources used if you create a stack from this template.
Parameters:
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.small
    AllowedValues:
      - t1.micro
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
      - m1.small
      - m1.medium
      - m1.large
      - m1.xlarge
      - m2.xlarge
      - m2.2xlarge
      - m2.4xlarge
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
      - m4.large
      - m4.xlarge
      - m4.2xlarge
      - m4.4xlarge
      - m4.10xlarge
      - c1.medium
      - c1.xlarge
      - c3.large
      - c3.xlarge
      - c3.2xlarge
      - c3.4xlarge
      - c3.8xlarge
      - c4.large
      - c4.xlarge
      - c4.2xlarge
      - c4.4xlarge
      - c4.8xlarge
      - g2.2xlarge
      - g2.8xlarge
      - r3.large
      - r3.xlarge
      - r3.2xlarge
      - r3.4xlarge
      - r3.8xlarge
      - i2.xlarge
      - i2.2xlarge
      - i2.4xlarge
      - i2.8xlarge
      - d2.xlarge
      - d2.2xlarge
      - d2.4xlarge
      - d2.8xlarge
      - hi1.4xlarge
      - hs1.8xlarge
      - cr1.8xlarge
      - cc2.8xlarge
      - cg1.4xlarge
    ConstraintDescription: must be a valid EC2 instance type.
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: Name of an existing EC2 key pair to enable SSH access to the ECS
      instances
  AsgMaxSize:
    Type: Number
    Description: Maximum size and initial desired capacity of Auto Scaling Group
    Default: '2'
  SSHLocation:
    Description: The IP address range that can be used to connect to the EC2 instances
      by using SSH
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  VolumeName:
    Description: The name to be used for the EFS volume
    Type: String
    MinLength: '1'
    Default: myEFSvolume
  MountPoint:
    Description: The Linux mount point for the EFS volume
    Type: String
    MinLength: '1'
    Default: myEFSvolume
Mappings:
  AWSInstanceType2Arch:
    t1.micro:
      Arch: HVM64
    t2.nano:
      Arch: HVM64
    t2.micro:
      Arch: HVM64
    t2.small:
      Arch: HVM64
    t2.medium:
      Arch: HVM64
    t2.large:
      Arch: HVM64
    m1.small:
      Arch: HVM64
    m1.medium:
      Arch: HVM64
    m1.large:
      Arch: HVM64
    m1.xlarge:
      Arch: HVM64
    m2.xlarge:
      Arch: HVM64
    m2.2xlarge:
      Arch: HVM64
    m2.4xlarge:
      Arch: HVM64
    m3.medium:
      Arch: HVM64
    m3.large:
      Arch: HVM64
    m3.xlarge:
      Arch: HVM64
    m3.2xlarge:
      Arch: HVM64
    m4.large:
      Arch: HVM64
    m4.xlarge:
      Arch: HVM64
    m4.2xlarge:
      Arch: HVM64
    m4.4xlarge:
      Arch: HVM64
    m4.10xlarge:
      Arch: HVM64
    c1.medium:
      Arch: HVM64
    c1.xlarge:
      Arch: HVM64
    c3.large:
      Arch: HVM64
    c3.xlarge:
      Arch: HVM64
    c3.2xlarge:
      Arch: HVM64
    c3.4xlarge:
      Arch: HVM64
    c3.8xlarge:
      Arch: HVM64
    c4.large:
      Arch: HVM64
    c4.xlarge:
      Arch: HVM64
    c4.2xlarge:
      Arch: HVM64
    c4.4xlarge:
      Arch: HVM64
    c4.8xlarge:
      Arch: HVM64
    g2.2xlarge:
      Arch: HVMG2
    g2.8xlarge:
      Arch: HVMG2
    r3.large:
      Arch: HVM64
    r3.xlarge:
      Arch: HVM64
    r3.2xlarge:
      Arch: HVM64
    r3.4xlarge:
      Arch: HVM64
    r3.8xlarge:
      Arch: HVM64
    i2.xlarge:
      Arch: HVM64
    i2.2xlarge:
      Arch: HVM64
    i2.4xlarge:
      Arch: HVM64
    i2.8xlarge:
      Arch: HVM64
    d2.xlarge:
      Arch: HVM64
    d2.2xlarge:
      Arch: HVM64
    d2.4xlarge:
      Arch: HVM64
    d2.8xlarge:
      Arch: HVM64
    hi1.4xlarge:
      Arch: HVM64
    hs1.8xlarge:
      Arch: HVM64
    cr1.8xlarge:
      Arch: HVM64
    cc2.8xlarge:
      Arch: HVM64
  AWSRegionArch2AMI:
    us-east-1:
      HVM64: ami-0ff8a91507f77f867
      HVMG2: ami-0a584ac55a7631c0c
    us-west-2:
      HVM64: ami-a0cfeed8
      HVMG2: ami-0e09505bc235aa82d
    us-west-1:
      HVM64: ami-0bdb828fd58c52235
      HVMG2: ami-066ee5fd4a9ef77f1
    eu-west-1:
      HVM64: ami-047bb4163c506cd98
      HVMG2: ami-0a7c483d527806435
    eu-west-2:
      HVM64: ami-f976839e
      HVMG2: NOT_SUPPORTED
    eu-west-3:
      HVM64: ami-0ebc281c20e89ba4b
      HVMG2: NOT_SUPPORTED
    eu-central-1:
      HVM64: ami-0233214e13e500f77
      HVMG2: ami-06223d46a6d0661c7
    ap-northeast-1:
      HVM64: ami-06cd52961ce9f0d85
      HVMG2: ami-053cdd503598e4a9d
    ap-northeast-2:
      HVM64: ami-0a10b2721688ce9d2
      HVMG2: NOT_SUPPORTED
    ap-northeast-3:
      HVM64: ami-0d98120a9fb693f07
      HVMG2: NOT_SUPPORTED
    ap-southeast-1:
      HVM64: ami-08569b978cc4dfa10
      HVMG2: ami-0be9df32ae9f92309
    ap-southeast-2:
      HVM64: ami-09b42976632b27e9b
      HVMG2: ami-0a9ce9fecc3d1daf8
    ap-south-1:
      HVM64: ami-0912f71e06545ad88
      HVMG2: ami-097b15e89dbdcfcf4
    us-east-2:
      HVM64: ami-0b59bfac6be064b78
      HVMG2: NOT_SUPPORTED
    ca-central-1:
      HVM64: ami-0b18956f
      HVMG2: NOT_SUPPORTED
    sa-east-1:
      HVM64: ami-07b14488da8ea02a0
      HVMG2: NOT_SUPPORTED
    cn-north-1:
      HVM64: ami-0a4eaf6c4454eda75
      HVMG2: NOT_SUPPORTED
    cn-northwest-1:
      HVM64: ami-6b6a7d09
      HVMG2: NOT_SUPPORTED
Resources:
  CloudWatchPutMetricsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  CloudWatchPutMetricsRolePolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: CloudWatch_PutMetricData
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Sid: CloudWatchPutMetricData
          Effect: Allow
          Action:
          - cloudwatch:PutMetricData
          Resource:
          - "*"
      Roles:
      - Ref: CloudWatchPutMetricsRole
  CloudWatchPutMetricsInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - Ref: CloudWatchPutMetricsRole
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
      CidrBlock: 10.0.0.0/16
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackName
      - Key: Network
        Value: Public
  GatewayToInternet:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: InternetGateway
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC
  SubnetRouteTableAssoc:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId:
        Ref: RouteTable
      SubnetId:
        Ref: Subnet
  InternetGatewayRoute:
    Type: AWS::EC2::Route
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      RouteTableId:
        Ref: RouteTable
      GatewayId:
        Ref: InternetGateway
  Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      CidrBlock: 10.0.0.0/24
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VPC
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp:
          Ref: SSHLocation
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  MountTargetSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VPC
      GroupDescription: Security group for mount target
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 2049
        ToPort: 2049
        CidrIp: 0.0.0.0/0
  FileSystem:
    Type: AWS::EFS::FileSystem
    Properties:
      PerformanceMode: generalPurpose
      FileSystemTags:
      - Key: Name
        Value:
          Ref: VolumeName
  MountTarget:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId:
        Ref: FileSystem
      SubnetId:
        Ref: Subnet
      SecurityGroups:
      - Ref: MountTargetSecurityGroup
  LaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Metadata:
      AWS::CloudFormation::Init:
        configSets:
          MountConfig:
          - setup
          - mount
        setup:
          packages:
            yum:
              nfs-utils: []
          files:
            "/home/ec2-user/post_nfsstat":
              content: !Sub |
                #!/bin/bash

                INPUT="$(cat)"
                CW_JSON_OPEN='{ "Namespace": "EFS", "MetricData": [ '
                CW_JSON_CLOSE=' ] }'
                CW_JSON_METRIC=''
                METRIC_COUNTER=0

                for COL in 1 2 3 4 5 6; do

                 COUNTER=0
                 METRIC_FIELD=$COL
                 DATA_FIELD=$(($COL+($COL-1)))

                 while read line; do
                   if [[ COUNTER -gt 0 ]]; then

                     LINE=`echo $line | tr -s ' ' `
                     AWS_COMMAND="aws cloudwatch put-metric-data --region ${AWS::Region}"
                     MOD=$(( $COUNTER % 2))

                     if [ $MOD -eq 1 ]; then
                       METRIC_NAME=`echo $LINE | cut -d ' ' -f $METRIC_FIELD`
                     else
                       METRIC_VALUE=`echo $LINE | cut -d ' ' -f $DATA_FIELD`
                     fi

                     if [[ -n "$METRIC_NAME" && -n "$METRIC_VALUE" ]]; then
                       INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
                       CW_JSON_METRIC="$CW_JSON_METRIC { \"MetricName\": \"$METRIC_NAME\", \"Dimensions\": [{\"Name\": \"InstanceId\", \"Value\": \"$INSTANCE_ID\"} ], \"Value\": $METRIC_VALUE },"
                       unset METRIC_NAME
                       unset METRIC_VALUE

                       METRIC_COUNTER=$((METRIC_COUNTER+1))
                       if [ $METRIC_COUNTER -eq 20 ]; then
                         # 20 is max metric collection size, so we have to submit here
                         aws cloudwatch put-metric-data --region ${AWS::Region} --cli-input-json "`echo $CW_JSON_OPEN ${!CW_JSON_METRIC%?} $CW_JSON_CLOSE`"

                         # reset
                         METRIC_COUNTER=0
                         CW_JSON_METRIC=''
                       fi
                     fi



                     COUNTER=$((COUNTER+1))
                   fi

                   if [[ "$line" == "Client nfs v4:" ]]; then
                     # the next line is the good stuff
                     COUNTER=$((COUNTER+1))
                   fi
                 done <<< "$INPUT"
                done

                # submit whatever is left
                aws cloudwatch put-metric-data --region ${AWS::Region} --cli-input-json "`echo $CW_JSON_OPEN ${!CW_JSON_METRIC%?} $CW_JSON_CLOSE`"
              mode: '000755'
              owner: ec2-user
              group: ec2-user
            "/home/ec2-user/crontab":
              content: "* * * * * /usr/sbin/nfsstat | /home/ec2-user/post_nfsstat\n"
              owner: ec2-user
              group: ec2-user
          commands:
            01_createdir:
              command: !Sub "mkdir /${MountPoint}"
        mount:
          commands:
            01_mount:
              command: !Sub >
                mount -t nfs4 -o nfsvers=4.1 ${FileSystem}.efs.${AWS::Region}.amazonaws.com:/ /${MountPoint}
            02_permissions:
              command: !Sub "chown ec2-user:ec2-user /${MountPoint}"
    Properties:
      AssociatePublicIpAddress: true
      ImageId:
        Fn::FindInMap:
        - AWSRegionArch2AMI
        - Ref: AWS::Region
        - Fn::FindInMap:
          - AWSInstanceType2Arch
          - Ref: InstanceType
          - Arch
      InstanceType:
        Ref: InstanceType
      KeyName:
        Ref: KeyName
      SecurityGroups:
      - Ref: InstanceSecurityGroup
      IamInstanceProfile:
        Ref: CloudWatchPutMetricsInstanceProfile
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfiguration --configsets MountConfig --region ${AWS::Region}
          crontab /home/ec2-user/crontab
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource AutoScalingGroup --region ${AWS::Region}
  AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    DependsOn:
    - MountTarget
    - GatewayToInternet
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
        Count:
          Ref: AsgMaxSize
    Properties:
      VPCZoneIdentifier:
      - Ref: Subnet
      LaunchConfigurationName:
        Ref: LaunchConfiguration
      MinSize: '1'
      MaxSize:
        Ref: AsgMaxSize
      DesiredCapacity:
        Ref: AsgMaxSize
      Tags:
      - Key: Name
        Value: EFS FileSystem Mounted Instance
        PropagateAtLaunch: 'true'
Outputs:
  MountTargetID:
    Description: Mount target ID
    Value:
      Ref: MountTarget
  FileSystemID:
    Description: File system ID
    Value:
      Ref: FileSystem
```

# Cuplikan templat Elastic Beanstalk
<a name="quickref-elasticbeanstalk"></a>

Dengan Elastic Beanstalk, Anda dapat dengan cepat menyebarkan dan mengelola AWS aplikasi tanpa khawatir tentang infrastruktur yang menjalankan aplikasi tersebut. Contoh template berikut dapat membantu Anda menggambarkan sumber daya Elastic Beanstalk di template Anda. CloudFormation 

## Contoh Elastic Beanstalk PHP
<a name="quickref-elasticbeanstalk-sampleenv"></a>

Contoh template berikut menyebarkan contoh aplikasi web PHP yang disimpan dalam bucket Amazon S3. Lingkungan ini juga merupakan lingkungan auto-scaling, load-balancing, dengan minimal dua instans EC2 Amazon dan maksimal enam. Ini menunjukkan lingkungan Elastic Beanstalk yang menggunakan konfigurasi peluncuran lama. Untuk selengkapnya tentang menggunakan templat peluncuran, lihat [Meluncurkan Template](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-autoscaling-launch-templates.html) di *Panduan AWS Elastic Beanstalk Pengembang*.

Ganti `solution-stack` dengan nama tumpukan penyelesaian (versi platform). Untuk daftar tumpukan solusi yang tersedia, gunakan AWS CLI perintah**aws elasticbeanstalk list-available-solution-stacks**.

### JSON
<a name="quickref-elasticbeanstalk-example-1.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "sampleApplication": {
            "Type": "AWS::ElasticBeanstalk::Application",
            "Properties": {
                "Description": "AWS Elastic Beanstalk Sample Application"
            }
        },
        "sampleApplicationVersion": {
            "Type": "AWS::ElasticBeanstalk::ApplicationVersion",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Application Version",
                "SourceBundle": {
                    "S3Bucket": {
                        "Fn::Sub": "elasticbeanstalk-samples-${AWS::Region}"
                    },
                    "S3Key": "php-newsample-app.zip"
                }
            }
        },
        "sampleConfigurationTemplate": {
            "Type": "AWS::ElasticBeanstalk::ConfigurationTemplate",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Configuration Template",
                "OptionSettings": [
                    {
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MinSize",
                        "Value": "2"
                    },
                    {
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MaxSize",
                        "Value": "6"
                    },
                    {
                        "Namespace": "aws:elasticbeanstalk:environment",
                        "OptionName": "EnvironmentType",
                        "Value": "LoadBalanced"
                    },
                    {
                        "Namespace": "aws:autoscaling:launchconfiguration",
                        "OptionName": "IamInstanceProfile",
                        "Value": {
                            "Ref": "MyInstanceProfile"
                        }
                    }
                ],
                "SolutionStackName": "solution-stack"
            }
        },
        "sampleEnvironment": {
            "Type": "AWS::ElasticBeanstalk::Environment",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Environment",
                "TemplateName": {
                    "Ref": "sampleConfigurationTemplate"
                },
                "VersionLabel": {
                    "Ref": "sampleApplicationVersion"
                }
            }
        },
        "MyInstanceRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Description": "Beanstalk EC2 role",
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier",
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker",
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier"
                ]
            }
        },
        "MyInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Roles": [
                    {
                        "Ref": "MyInstanceRole"
                    }
                ]
            }
        }
    }
}
```

### YAML
<a name="quickref-elasticbeanstalk-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  sampleApplication:
    Type: AWS::ElasticBeanstalk::Application
    Properties:
      Description: AWS Elastic Beanstalk Sample Application
  sampleApplicationVersion:
    Type: AWS::ElasticBeanstalk::ApplicationVersion
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Application Version
      SourceBundle:
        S3Bucket: !Sub "elasticbeanstalk-samples-${AWS::Region}"
        S3Key: php-newsample-app.zip
  sampleConfigurationTemplate:
    Type: AWS::ElasticBeanstalk::ConfigurationTemplate
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Configuration Template
      OptionSettings:
      - Namespace: aws:autoscaling:asg
        OptionName: MinSize
        Value: '2'
      - Namespace: aws:autoscaling:asg
        OptionName: MaxSize
        Value: '6'
      - Namespace: aws:elasticbeanstalk:environment
        OptionName: EnvironmentType
        Value: LoadBalanced
      - Namespace: aws:autoscaling:launchconfiguration
        OptionName: IamInstanceProfile
        Value: !Ref MyInstanceProfile        
      SolutionStackName: solution-stack
  sampleEnvironment:
    Type: AWS::ElasticBeanstalk::Environment
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Environment
      TemplateName:
        Ref: sampleConfigurationTemplate
      VersionLabel:
        Ref: sampleApplicationVersion
  MyInstanceRole:
    Type: AWS::IAM::Role
    Properties: 
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Description: Beanstalk EC2 role
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier
  MyInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties: 
      Roles:
        - !Ref MyInstanceRole
```

# Cuplikan templat Elastic Load Balancing
<a name="quickref-elb"></a>

Untuk membuat Application Load Balancer, Network Load Balancer, atau Load Balancer Gateway, gunakan jenis sumber daya V2, yang dimulai dengan. `AWS::ElasticLoadBalancingV2` Untuk membuat Classic Load Balancer, gunakan jenis sumber daya yang dimulai dengan. `AWS::ElasticLoadBalancing`

**Topics**
+ [ELBv2 sumber daya](#scenario-elbv2-load-balancer)
+ [Sumber daya Classic Load Balancer](#scenario-elb-load-balancer)

## ELBv2 sumber daya
<a name="scenario-elbv2-load-balancer"></a>

Contoh ini mendefinisikan Application Load Balancer dengan pendengar HTTP dan tindakan default yang meneruskan lalu lintas ke grup target. Penyeimbang beban menggunakan pengaturan pemeriksaan kesehatan default. Kelompok sasaran memiliki dua EC2 contoh terdaftar. 

------
#### [ YAML ]

```
Resources:
  myLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup

  myHTTPlistener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref myLoadBalancer
      Protocol: HTTP
      Port: 80
      DefaultActions:
        - Type: "forward"
          TargetGroupArn: !Ref myTargetGroup
                        
  myTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: "my-target-group"
      Protocol: HTTP
      Port: 80
      TargetType: instance
      VpcId: !Ref myVPC
      Targets:
        - Id: !GetAtt Instance1.InstanceId
          Port: 80
        - Id: !GetAtt Instance2.InstanceId
          Port: 80
```

------
#### [ JSON ]

```
{
    "Resources": {
        "myLoadBalancer": {
            "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
            "Properties": {
                "Name": "my-alb",
                "Type": "application",
                "Scheme": "internal",
                "Subnets": [
                    {
                        "Ref": "subnet-AZ1"
                    },
                    {
                        "Ref": "subnet-AZ2"
                    }
                ],
                "SecurityGroups": [
                    {
                        "Ref": "mySecurityGroup"
                    }
                ]
            }
        },
        "myHTTPlistener": {
            "Type": "AWS::ElasticLoadBalancingV2::Listener",
            "Properties": {
                "LoadBalancerArn": {
                    "Ref": "myLoadBalancer"
                },
                "Protocol": "HTTP",
                "Port": 80,
                "DefaultActions": [
                    {
                        "Type": "forward",
                        "TargetGroupArn": {
                            "Ref": "myTargetGroup"
                        }
                    }
                ]
            }
        },
        "myTargetGroup": {
            "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
            "Properties": {
                "Name": "my-target-group",
                "Protocol": "HTTP",
                "Port": 80,
                "TargetType": "instance",
                "VpcId": {
                    "Ref": "myVPC"
                },
                "Targets": [
                    {
                        "Id": {
                            "Fn::GetAtt": [
                                "Instance1",
                                "InstanceId"
                            ]
                        },
                        "Port": 80
                    },
                    {
                        "Id": {
                            "Fn::GetAtt": [
                                "Instance2",
                                "InstanceId"
                            ]
                        },
                        "Port": 80
                    }
                ]
            }
        }
    }
}
```

------

## Sumber daya Classic Load Balancer
<a name="scenario-elb-load-balancer"></a>

Contoh ini mendefinisikan Classic Load Balancer dengan pendengar HTTP dan tidak ada instance terdaftar. EC2 Penyeimbang beban menggunakan pengaturan pemeriksaan kesehatan default.

------
#### [ YAML ]

```
myLoadBalancer:
  Type: AWS::ElasticLoadBalancing::LoadBalancer
  Properties:
    AvailabilityZones:
    - "us-east-1a"
    Listeners:
    - LoadBalancerPort: '80'
      InstancePort: '80'
      Protocol: HTTP
```

------
#### [ JSON ]

```
"myLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
        "AvailabilityZones" : [ "us-east-1a" ],
        "Listeners" : [ {
            "LoadBalancerPort" : "80",
            "InstancePort" : "80",
            "Protocol" : "HTTP"
        } ]
    }
}
```

------

Contoh ini mendefinisikan Classic Load Balancer dengan pendengar HTTP, dua instance EC2 terdaftar, dan setelan pemeriksaan kesehatan khusus.

------
#### [ YAML ]

```
myClassicLoadBalancer:
  Type: AWS::ElasticLoadBalancing::LoadBalancer
  Properties:
    AvailabilityZones:
    - "us-east-1a"
    Instances:
    - Ref: Instance1
    - Ref: Instance2
    Listeners:
    - LoadBalancerPort: '80'
      InstancePort: '80'
      Protocol: HTTP
    HealthCheck:
      Target: HTTP:80/
      HealthyThreshold: '3'
      UnhealthyThreshold: '5'
      Interval: '30'
      Timeout: '5'
```

------
#### [ JSON ]

```
"myClassicLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
        "AvailabilityZones" : [ "us-east-1a" ],
        "Instances" : [
            { "Ref" : "Instance1" },
            { "Ref" : "Instance2" }
        ],
        "Listeners" : [ {
            "LoadBalancerPort" : "80",
            "InstancePort" : "80",
            "Protocol" : "HTTP"
        } ],

        "HealthCheck" : {
            "Target" : "HTTP:80/",
            "HealthyThreshold" : "3",
            "UnhealthyThreshold" : "5",
            "Interval" : "30",
            "Timeout" : "5"
        }
    }
}
```

------

# AWS Identity and Access Management cuplikan template
<a name="quickref-iam"></a>

Bagian ini berisi cuplikan AWS Identity and Access Management template.

**Topics**
+ [Mendeklarasikan sumber daya pengguna IAM](#scenario-iam-user)
+ [Mendeklarasikan sumber daya kunci akses IAM](#scenario-iam-accesskey)
+ [Mendeklarasikan sumber daya grup IAM](#scenario-iam-group)
+ [Menambahkan pengguna ke grup](#scenario-iam-addusertogroup)
+ [Mendeklarasikan kebijakan IAM](#scenario-iam-policy)
+ [Mendeklarasikan kebijakan bucket Amazon S3](#scenario-bucket-policy)
+ [Mendeklarasikan kebijakan topik Amazon SNS](#scenario-sns-policy)
+ [Mendeklarasikan kebijakan Amazon SQS](#scenario-sqs-policy)
+ [Contoh templat IAM role](#scenarios-iamroles)

**penting**  
Saat membuat atau memperbarui tumpukan menggunakan templat yang berisi sumber daya IAM, Anda harus mengakui penggunaan kemampuan IAM. Untuk informasi selengkapnya, lihat [Mengakui sumber daya IAM dalam templat CloudFormation](control-access-with-iam.md#using-iam-capabilities).

## Mendeklarasikan sumber daya pengguna IAM
<a name="scenario-iam-user"></a>

Cuplikan ini menunjukkan cara mendeklarasikan sebuah sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) untuk membuat pengguna IAM. Pengguna dinyatakan dengan jalur (`"/"`) dan profil login dengan kata sandi (`myP@ssW0rd`).

Dokumen kebijakan bernama `giveaccesstoqueueonly` memberikan izin kepada pengguna untuk melakukan semua tindakan Amazon SQS pada sumber daya antrian Amazon SQS, dan menolak akses ke semua `myqueue` sumber daya antrian Amazon SQS lainnya. Fungsi `Fn::GetAtt` mengambil atribut Arn dari `myqueue` sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html).

Dokumen kebijakan bernama `giveaccesstotopiconly` ditambahkan ke pengguna untuk memberikan izin kepada pengguna untuk melakukan semua tindakan Amazon SNS pada `mytopic` sumber daya topik Amazon SNS dan untuk menolak akses ke semua sumber daya Amazon SNS lainnya. Fungsi `Ref` mengambil ARN dari `mytopic` sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html).

### JSON
<a name="quickref-iam-example-1.json"></a>

```
"myuser" : {
   "Type" : "AWS::IAM::User",
   "Properties" : {
      "Path" : "/",
      "LoginProfile" : {
         "Password" : "myP@ssW0rd"
      },
      "Policies" : [ {
         "PolicyName" : "giveaccesstoqueueonly",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sqs:*" ],
               "Resource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            }, {
               "Effect" : "Deny",
               "Action" : [ "sqs:*" ],
               "NotResource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            }
         ] }
      }, {
         "PolicyName" : "giveaccesstotopiconly",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sns:*" ],
               "Resource" : [ { "Ref" : "mytopic" } ]
            }, {
               "Effect" : "Deny",
               "Action" : [ "sns:*" ],
               "NotResource" : [ { "Ref" : "mytopic" } ]
            } ]
         }
      } ]
   }
}
```

### YAML
<a name="quickref-iam-example-1.yaml"></a>

```
myuser:
  Type: AWS::IAM::User
  Properties:
    Path: "/"
    LoginProfile:
      Password: myP@ssW0rd
    Policies:
    - PolicyName: giveaccesstoqueueonly
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sqs:*
          Resource:
          - !GetAtt myqueue.Arn
        - Effect: Deny
          Action:
          - sqs:*
          NotResource:
          - !GetAtt myqueue.Arn
    - PolicyName: giveaccesstotopiconly
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sns:*
          Resource:
          - !Ref mytopic
        - Effect: Deny
          Action:
          - sns:*
          NotResource:
          - !Ref mytopic
```

## Mendeklarasikan sumber daya kunci akses IAM
<a name="scenario-iam-accesskey"></a>

### 
<a name="quickref-iam-access-key"></a>

Cuplikan ini menunjukkan sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-accesskey.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-accesskey.html). Sumber daya `myaccesskey` membuat access key dan menetapkannya ke pengguna IAM yang dinyatakan sebagai sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) dalam templat.

#### JSON
<a name="quickref-iam-example-2.json"></a>

```
"myaccesskey" : {
   "Type" : "AWS::IAM::AccessKey",
   "Properties" : {
      "UserName" : { "Ref" : "myuser" }
   }
}
```

#### YAML
<a name="quickref-iam-example-2.yaml"></a>

```
myaccesskey:
  Type: AWS::IAM::AccessKey
  Properties:
    UserName:
      !Ref myuser
```

### 
<a name="quickref-iam-access-key-2"></a>

Anda bisa mendapatkan kunci rahasia untuk sumber daya `AWS::IAM::AccessKey` menggunakan fungsi `Fn::GetAtt`. Salah satu cara untuk mengambil kunci rahasia adalah dengan memasukkannya ke dalam nilai `Output`. Anda bisa mendapatkan access key menggunakan fungsi `Ref`. Deklarasi nilai `Output` berikut mendapatkan access key dan kunci rahasia untuk `myaccesskey`.

#### JSON
<a name="quickref-iam-example-3.json"></a>

```
"AccessKeyformyaccesskey" : {
   "Value" : { "Ref" : "myaccesskey" }
},
"SecretKeyformyaccesskey" : {
   "Value" : {
      "Fn::GetAtt" : [ "myaccesskey", "SecretAccessKey" ]
   }
}
```

#### YAML
<a name="quickref-iam-example-3.yaml"></a>

```
AccessKeyformyaccesskey:
  Value:
    !Ref myaccesskey
SecretKeyformyaccesskey:
  Value: !GetAtt myaccesskey.SecretAccessKey
```

### 
<a name="quickref-iam-access-key-3"></a>

Anda juga dapat meneruskan kunci AWS akses dan kunci rahasia ke EC2 instans Amazon atau grup Auto Scaling yang ditentukan dalam template. Deklarasi berikut [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) menggunakan properti `UserData` untuk meneruskan access key dan kunci rahasia untuk sumber daya `myaccesskey`.

#### JSON
<a name="quickref-iam-example-4.json"></a>

```
"myinstance" : {
   "Type" : "AWS::EC2::Instance",
   "Properties" : {
      "AvailabilityZone" : "us-east-1a",
      "ImageId" : "ami-0ff8a91507f77f867",
      "UserData" : {
         "Fn::Base64" : {
            "Fn::Join" : [
               "", [
                  "ACCESS_KEY=", {
                     "Ref" : "myaccesskey"
                  },
                  "&",
                  "SECRET_KEY=",
                  {
                     "Fn::GetAtt" : [
                        "myaccesskey",
                        "SecretAccessKey"
                     ]
                  }
               ]
            ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-4.yaml"></a>

```
myinstance:
  Type: AWS::EC2::Instance
  Properties:
    AvailabilityZone: "us-east-1a"
    ImageId: ami-0ff8a91507f77f867
    UserData:
      Fn::Base64: !Sub "ACCESS_KEY=${myaccesskey}&SECRET_KEY=${myaccesskey.SecretAccessKey}"
```

## Mendeklarasikan sumber daya grup IAM
<a name="scenario-iam-group"></a>

Cuplikan ini menunjukkan sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html). Grup ini memiliki jalur (`"/myapplication/"`). Dokumen kebijakan bernama `myapppolicy` ditambahkan ke grup untuk memungkinkan pengguna grup melakukan semua tindakan Amazon SQS pada myqueue sumber daya antrian Amazon SQS dan menolak akses ke semua resource Amazon SQS lainnya kecuali. `myqueue`

Untuk menetapkan kebijakan pada sumber daya, IAM memerlukan Amazon Resource Name (ARN) untuk sumber daya tersebut. Dalam cuplikan, fungsi `Fn::GetAtt` mendapat ARN dari antrean sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html).

### JSON
<a name="quickref-iam-example-5.json"></a>

```
"mygroup" : {
   "Type" : "AWS::IAM::Group",
   "Properties" : {
      "Path" : "/myapplication/",
      "Policies" : [ {
         "PolicyName" : "myapppolicy",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sqs:*" ],
               "Resource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            },
            {
               "Effect" : "Deny",
               "Action" : [ "sqs:*" ],
               "NotResource" : [ { "Fn::GetAtt" : [ "myqueue", "Arn" ] } ]
            }
         ] }
      } ]
   }
}
```

### YAML
<a name="quickref-iam-example-5.yaml"></a>

```
mygroup:
  Type: AWS::IAM::Group
  Properties:
    Path: "/myapplication/"
    Policies:
    - PolicyName: myapppolicy
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sqs:*
          Resource: !GetAtt myqueue.Arn
        - Effect: Deny
          Action:
          - sqs:*
          NotResource: !GetAtt myqueue.Arn
```

## Menambahkan pengguna ke grup
<a name="scenario-iam-addusertogroup"></a>

Sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-usertogroupaddition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-usertogroupaddition.html) menambahkan pengguna ke grup. Pada potongan berikut, sumber daya `addUserToGroup` menambahkan pengguna berikut ke grup yang ada bernama `myexistinggroup2`: pengguna yang ada `existinguser1` dan pengguna `myuser` yang dinyatakan sebagai sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) dalam templat.

### JSON
<a name="quickref-iam-example-6.json"></a>

```
"addUserToGroup" : {
   "Type" : "AWS::IAM::UserToGroupAddition",
   "Properties" : {
      "GroupName" : "myexistinggroup2",
      "Users" : [ "existinguser1", { "Ref" : "myuser" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-6.yaml"></a>

```
addUserToGroup:
  Type: AWS::IAM::UserToGroupAddition
  Properties:
    GroupName: myexistinggroup2
    Users:
    - existinguser1
    - !Ref myuser
```

## Mendeklarasikan kebijakan IAM
<a name="scenario-iam-policy"></a>

Cuplikan ini menunjukkan cara membuat kebijakan dan menerapkannya ke beberapa grup menggunakan sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-policy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-policy.html) bernama `mypolicy`. Sumber daya `mypolicy` berisi properti `PolicyDocument` yang memungkinkan tindakan `GetObject`, `PutObject`, dan `PutObjectAcl` pada objek dalam bucket S3 yang diwakili oleh `arn:aws:s3:::myAWSBucket` ARN. `mypolicy`Sumber daya menerapkan kebijakan ke grup yang ada bernama `myexistinggroup1` dan grup `mygroup` yang dideklarasikan dalam templat sebagai [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html)sumber daya. Contoh ini menunjukkan cara menerapkan kebijakan ke grup yang menggunakan properti `Groups`; Namun, Anda juga dapat menggunakan properti `Users` untuk menambahkan dokumen kebijakan ke daftar pengguna.

### JSON
<a name="quickref-iam-example-7.json"></a>

```
"mypolicy" : {
   "Type" : "AWS::IAM::Policy",
   "Properties" : {
      "PolicyName" : "mygrouppolicy",
      "PolicyDocument" : {
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Effect" : "Allow",
            "Action" : [
               "s3:GetObject" , "s3:PutObject" , "s3:PutObjectAcl" ],
            "Resource" : "arn:aws:s3:::myAWSBucket/*"
         } ]
      },
      "Groups" : [ "myexistinggroup1", { "Ref" : "mygroup" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-7.yaml"></a>

```
mypolicy:
  Type: AWS::IAM::Policy
  Properties:
    PolicyName: mygrouppolicy
    PolicyDocument:
      Version: '2012-10-17'
      Statement:
      - Effect: Allow
        Action:
        - s3:GetObject
        - s3:PutObject
        - s3:PutObjectAcl
        Resource: arn:aws:s3:::myAWSBucket/*
    Groups:
    - myexistinggroup1
    - !Ref mygroup
```

## Mendeklarasikan kebijakan bucket Amazon S3
<a name="scenario-bucket-policy"></a>

Cuplikan ini menunjukkan cara membuat kebijakan dan menerapkannya ke bucket Amazon S3 menggunakan sumber daya. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html) `mybucketpolicy`Sumber daya mendeklarasikan dokumen kebijakan yang memungkinkan pengguna `user1` IAM untuk melakukan `GetObject` tindakan pada semua objek dalam bucket S3 tempat kebijakan ini diterapkan. Dalam cuplikan, fungsi `Fn::GetAtt` mengambil ARN dari sumber daya `user1`. Sumber daya `mybucketpolicy` menerapkan kebijakan untuk my bucket sumber daya `AWS::S3::BucketPolicy`. Fungsi `Ref` mengambil nama bucket dari sumber daya `mybucket`.

### JSON
<a name="quickref-iam-example-8.json"></a>

```
"mybucketpolicy" : {
   "Type" : "AWS::S3::BucketPolicy",
   "Properties" : {
      "PolicyDocument" : {
         "Id" : "MyPolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "ReadAccess",
            "Action" : [ "s3:GetObject" ],
            "Effect" : "Allow",
            "Resource" : { "Fn::Join" : [
                  "", [ "arn:aws:s3:::", { "Ref" : "mybucket" } , "/*" ]
               ] },
            "Principal" : {
               "AWS" : { "Fn::GetAtt" : [ "user1", "Arn" ] }
            }
         } ]
      },
      "Bucket" : { "Ref" : "mybucket" }
   }
}
```

### YAML
<a name="quickref-iam-example-8.yaml"></a>

```
mybucketpolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    PolicyDocument:
      Id: MyPolicy
      Version: '2012-10-17'
      Statement:
      - Sid: ReadAccess
        Action:
        - s3:GetObject
        Effect: Allow
        Resource: !Sub "arn:aws:s3:::${mybucket}/*"
        Principal:
          AWS: !GetAtt user1.Arn
    Bucket: !Ref mybucket
```

## Mendeklarasikan kebijakan topik Amazon SNS
<a name="scenario-sns-policy"></a>

Cuplikan ini menunjukkan cara membuat kebijakan dan menerapkannya ke topik Amazon SNS menggunakan sumber daya. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topicpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topicpolicy.html) Sumber daya `mysnspolicy` berisi properti `PolicyDocument` yang memungkinkan `myuser` sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) untuk melakukan tindakan `Publish` pada `mytopic` sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html). Dalam cuplikan, fungsi `Fn::GetAtt` mendapat ARN untuk sumber daya `myuser` dan fungsi `Ref` mendapat ARN untuk sumber daya `mytopic`.

### JSON
<a name="quickref-iam-example-9.json"></a>

```
"mysnspolicy" : {
   "Type" : "AWS::SNS::TopicPolicy",
   "Properties" : {
      "PolicyDocument" :  {
         "Id" : "MyTopicPolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "My-statement-id",
            "Effect" : "Allow",
            "Principal" : {
               "AWS" : { "Fn::GetAtt" : [ "myuser", "Arn" ] }
            },
            "Action" : "sns:Publish",
            "Resource" : "*"
         } ]
      },
      "Topics" : [ { "Ref" : "mytopic" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-9.yaml"></a>

```
mysnspolicy:
  Type: AWS::SNS::TopicPolicy
  Properties:
    PolicyDocument:
      Id: MyTopicPolicy
      Version: '2012-10-17'
      Statement:
      - Sid: My-statement-id
        Effect: Allow
        Principal:
          AWS: !GetAtt myuser.Arn
        Action: sns:Publish
        Resource: "*"
    Topics:
    - !Ref mytopic
```

## Mendeklarasikan kebijakan Amazon SQS
<a name="scenario-sqs-policy"></a>

Cuplikan ini menunjukkan cara membuat kebijakan dan menerapkannya ke antrian Amazon SQS menggunakan sumber daya. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queuepolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queuepolicy.html) Properti `PolicyDocument` memungkinkan pengguna yang ada `myapp` (ditentukan oleh ARN nya) untuk melakukan tindakan `SendMessage` pada antrian yang sudah ada, yang ditentukan oleh URL-nya, dan myqueue sumber daya [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html). Fungsi [Ref](resources-section-structure.md#resource-properties-ref) mendapat URL untuk sumber daya `myqueue`.

### JSON
<a name="quickref-iam-example-10.json"></a>

```
"mysqspolicy" : {
   "Type" : "AWS::SQS::QueuePolicy",
   "Properties" : {
      "PolicyDocument" : {
         "Id" : "MyQueuePolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "Allow-User-SendMessage",
            "Effect" : "Allow",
            "Principal" : {
               "AWS" : "arn:aws:iam::123456789012:user/myapp"
            },
            "Action" : [ "sqs:SendMessage" ],
            "Resource" : "*"
         } ]
      },
      "Queues" : [
         "https://sqs.us-east-2aws-region.amazonaws.com/123456789012/myexistingqueue",
         { "Ref" : "myqueue" }
      ]
   }
}
```

### YAML
<a name="quickref-iam-example-10.yaml"></a>

```
mysqspolicy:
  Type: AWS::SQS::QueuePolicy
  Properties:
    PolicyDocument:
      Id: MyQueuePolicy
      Version: '2012-10-17'
      Statement:
      - Sid: Allow-User-SendMessage
        Effect: Allow
        Principal:
          AWS: arn:aws:iam::123456789012:user/myapp
        Action:
        - sqs:SendMessage
        Resource: "*"
    Queues:
    - https://sqs.aws-region.amazonaws.com/123456789012/myexistingqueue
    - !Ref myqueue
```

## Contoh templat IAM role
<a name="scenarios-iamroles"></a>

Bagian ini memberikan contoh CloudFormation template untuk peran IAM untuk EC2 instance.

Untuk informasi selengkapnya, lihat [peran IAM untuk Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) di *Panduan EC2 Pengguna Amazon*.

### Peran IAM dengan EC2
<a name="scenario-iamrole-ec2"></a>

Dalam contoh ini, profil instance direferensikan oleh `IamInstanceProfile` properti EC2 instance. Kebijakan instans dan referensi kebijakan peran [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html).

#### JSON
<a name="quickref-iam-example-11.json"></a>

```
{
   "AWSTemplateFormatVersion": "2010-09-09",
   "Resources": {
      "myEC2Instance": {
         "Type": "AWS::EC2::Instance",
         "Version": "2009-05-15",
         "Properties": {
            "ImageId": "ami-0ff8a91507f77f867",
            "InstanceType": "m1.small",
            "Monitoring": "true",
            "DisableApiTermination": "false",
            "IamInstanceProfile": {
               "Ref": "RootInstanceProfile"
            }
         }
      },
      "RootRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
            "AssumeRolePolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [ "ec2.amazonaws.com" ]
                  },
                  "Action": [ "sts:AssumeRole" ]
               } ]
            },
            "Path": "/"
         }
      },
      "RolePolicies": {
         "Type": "AWS::IAM::Policy",
         "Properties": {
            "PolicyName": "root",
            "PolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
               } ]
            },
            "Roles": [ { "Ref": "RootRole" } ]
         }
      },
      "RootInstanceProfile": {
         "Type": "AWS::IAM::InstanceProfile",
         "Properties": {
            "Path": "/",
            "Roles": [ { "Ref": "RootRole" } ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-11.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myEC2Instance:
    Type: AWS::EC2::Instance
    Version: '2009-05-15'
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: m1.small
      Monitoring: 'true'
      DisableApiTermination: 'false'
      IamInstanceProfile:
        !Ref RootInstanceProfile
  RootRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  RolePolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: root
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action: "*"
          Resource: "*"
      Roles:
      - !Ref RootRole
  RootInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref RootRole
```

### Peran IAM dengan grup Auto Scaling
<a name="scenario-iamrole-asg"></a>

Dalam contoh ini, profil instance direferensikan oleh `IamInstanceProfile` properti konfigurasi peluncuran Amazon EC2 Auto Scaling.

#### JSON
<a name="quickref-iam-example-12.json"></a>

```
{
   "AWSTemplateFormatVersion": "2010-09-09",
   "Resources": {
      "myLCOne": {
         "Type": "AWS::AutoScaling::LaunchConfiguration",
         "Version": "2009-05-15",
         "Properties": {
            "ImageId": "ami-0ff8a91507f77f867",
            "InstanceType": "m1.small",
            "InstanceMonitoring": "true",
            "IamInstanceProfile": { "Ref": "RootInstanceProfile" }
         }
      },
      "myASGrpOne": {
         "Type": "AWS::AutoScaling::AutoScalingGroup",
         "Version": "2009-05-15",
         "Properties": {
            "AvailabilityZones": [ "us-east-1a" ],
            "LaunchConfigurationName": { "Ref": "myLCOne" },
            "MinSize": "0",
            "MaxSize": "0",
            "HealthCheckType": "EC2",
            "HealthCheckGracePeriod": "120"
         }
      },
      "RootRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
            "AssumeRolePolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [ "ec2.amazonaws.com" ]
                  },
                  "Action": [ "sts:AssumeRole" ]
               } ]
            },
            "Path": "/"
         }
      },
      "RolePolicies": {
         "Type": "AWS::IAM::Policy",
         "Properties": {
            "PolicyName": "root",
            "PolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
               } ]
            },
            "Roles": [ { "Ref": "RootRole" } ]
         }
      },
      "RootInstanceProfile": {
         "Type": "AWS::IAM::InstanceProfile",
         "Properties": {
            "Path": "/",
            "Roles": [ { "Ref": "RootRole" } ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-12.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myLCOne:
    Type: AWS::AutoScaling::LaunchConfiguration
    Version: '2009-05-15'
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: m1.small
      InstanceMonitoring: 'true'
      IamInstanceProfile:
        !Ref RootInstanceProfile
  myASGrpOne:
    Type: AWS::AutoScaling::AutoScalingGroup
    Version: '2009-05-15'
    Properties:
      AvailabilityZones:
      - "us-east-1a"
      LaunchConfigurationName:
        !Ref myLCOne
      MinSize: '0'
      MaxSize: '0'
      HealthCheckType: EC2
      HealthCheckGracePeriod: '120'
  RootRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  RolePolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: root
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action: "*"
          Resource: "*"
      Roles:
      - !Ref RootRole
  RootInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref RootRole
```

# AWS Lambda Template
<a name="quickref-lambda"></a>

Template berikut menggunakan fungsi AWS Lambda (Lambda) dan sumber daya khusus untuk menambahkan grup keamanan baru ke daftar grup keamanan yang ada. Fungsi ini berguna ketika Anda ingin membangun daftar grup keamanan secara dinamis, sehingga daftar Anda mencakup grup keamanan baru dan yang sudah ada. Misalnya, Anda dapat meneruskan daftar grup keamanan yang ada sebagai nilai parameter, menambahkan nilai baru ke daftar, dan kemudian mengaitkan semua nilai Anda dengan sebuah EC2 instance. Untuk informasi selengkapnya tentang jenis sumber daya fungsi Lambda, lihat. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)

Dalam contoh, saat CloudFormation membuat sumber daya `AllSecurityGroups` khusus, CloudFormation memanggil fungsi `AppendItemToListFunction` Lambda. CloudFormation meneruskan daftar grup keamanan yang ada dan grup keamanan baru (`NewSecurityGroup`) ke fungsi, yang menambahkan grup keamanan baru ke daftar dan kemudian mengembalikan daftar yang dimodifikasi. CloudFormation menggunakan daftar yang dimodifikasi untuk mengaitkan semua grup keamanan dengan `MyEC2Instance` sumber daya.

## JSON
<a name="quickref-lambda-example-1.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "ExistingSecurityGroups": {
            "Type": "List<AWS::EC2::SecurityGroup::Id>"
        },
        "ExistingVPC": {
            "Type": "AWS::EC2::VPC::Id",
            "Description": "The VPC ID that includes the security groups in the ExistingSecurityGroups parameter."
        },
        "InstanceType": {
            "Type": "String",
            "Default": "t2.micro",
            "AllowedValues": [
                "t2.micro",
                "t3.micro"
            ]
        }
    },

    "Resources": {
        "SecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Allow HTTP traffic to the host",
                "VpcId": {
                    "Ref": "ExistingVPC"
                },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    }
                ],
                "SecurityGroupEgress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        },
        "AllSecurityGroups": {
            "Type": "Custom::Split",
            "Properties": {
                "ServiceToken": {
                    "Fn::GetAtt": [
                        "AppendItemToListFunction",
                        "Arn"
                    ]
                },
                "List": {
                    "Ref": "ExistingSecurityGroups"
                },
                "AppendedItem": {
                    "Ref": "SecurityGroup"
                }
            }
        },
        "AppendItemToListFunction": {
            "Type": "AWS::Lambda::Function",
            "Properties": {
                "Handler": "index.handler",
                "Role": {
                    "Fn::GetAtt": [
                        "LambdaExecutionRole",
                        "Arn"
                    ]
                },
                "Code": {
                    "ZipFile": {
                        "Fn::Join": [
                            "",
                            [
                                "var response = require('cfn-response');",
                                "exports.handler = function(event, context) {",
                                "   var responseData = {Value: event.ResourceProperties.List};",
                                "   responseData.Value.push(event.ResourceProperties.AppendedItem);",
                                "   response.send(event, context, response.SUCCESS, responseData);",
                                "};"
                            ]
                        ]
                    }
                },
                "Runtime": "nodejs20.x"
            }
        },
        "MyEC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
                "SecurityGroupIds": {
                    "Fn::GetAtt": [
                        "AllSecurityGroups",
                        "Value"
                    ]
                },
                "InstanceType": {
                    "Ref": "InstanceType"
                }
            }
        },
        "LambdaExecutionRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17", 		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "lambda.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "root",
                        "PolicyDocument": {
                            "Version": "2012-10-17", 		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:*"
                                    ],
                                    "Resource": "arn:aws:logs:*:*:*"
                                }
                            ]
                        }
                    }
                ]
            }
        }
    },
    "Outputs": {
        "AllSecurityGroups": {
            "Description": "Security Groups that are associated with the EC2 instance",
            "Value": {
                "Fn::Join": [
                    ", ",
                    {
                        "Fn::GetAtt": [
                            "AllSecurityGroups",
                            "Value"
                        ]
                    }
                ]
            }
        }
    }
}
```

## YAML
<a name="quickref-lambda-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  ExistingSecurityGroups:
    Type: List<AWS::EC2::SecurityGroup::Id>
  ExistingVPC:
    Type: AWS::EC2::VPC::Id
    Description: The VPC ID that includes the security groups in the ExistingSecurityGroups parameter.
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t3.micro
Resources:
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP traffic to the host
      VpcId: !Ref ExistingVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
  AllSecurityGroups:
    Type: Custom::Split
    Properties:
      ServiceToken: !GetAtt AppendItemToListFunction.Arn
      List: !Ref ExistingSecurityGroups
      AppendedItem: !Ref SecurityGroup
  AppendItemToListFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile: !Join
          - ''
          - - var response = require('cfn-response');
            - exports.handler = function(event, context) {
            - '   var responseData = {Value: event.ResourceProperties.List};'
            - '   responseData.Value.push(event.ResourceProperties.AppendedItem);'
            - '   response.send(event, context, response.SUCCESS, responseData);'
            - '};'
      Runtime: nodejs20.x
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      SecurityGroupIds: !GetAtt AllSecurityGroups.Value
      InstanceType: !Ref InstanceType
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17' 		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: '2012-10-17' 		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - logs:*
                Resource: arn:aws:logs:*:*:*
Outputs:
  AllSecurityGroups:
    Description: Security Groups that are associated with the EC2 instance
    Value: !Join
      - ', '
      - !GetAtt AllSecurityGroups.Value
```

# Cuplikan template Amazon Redshift
<a name="quickref-redshift"></a>

Amazon Redshift adalah layanan gudang data dengan skala petabyte yang terkelola penuh di cloud. Anda dapat menggunakan CloudFormation untuk menyediakan dan mengelola klaster Amazon Redshift.

## Klaster Amazon Redshift
<a name="quickref-redshift-samplecluster"></a>

Contoh template berikut membuat klaster Amazon Redshift sesuai dengan nilai parameter yang ditentukan saat tumpukan dibuat. Grup parameter cluster yang dikaitkan dengan cluster Amazon Redshift memungkinkan pencatatan aktivitas pengguna. Template ini juga meluncurkan cluster Amazon Redshift di VPC Amazon yang ditentukan dalam template. VPC menyertakan gateway internet sehingga Anda dapat mengakses kluster Amazon Redshift dari Internet. Namun, komunikasi antara klaster dan gateway Internet juga harus diaktifkan, yang dilakukan oleh entri tabel rute.

**catatan**  
Templat mencakup kondisi `IsMultiNodeCluster` sehingga parameter `NumberOfNodes` dinyatakan hanya ketika nilai parameter `ClusterType` diatur ke `multi-node`.

Contoh mendefinisikan parameter `MysqlRootPassword` dengan properti `NoEcho` diatur menjadi `true`. Jika Anda mengatur atribut `NoEcho` menjadi `true`, CloudFormation mengembalikan nilai parameter tertutup sebagai tanda bintang (\$1\$1\$1\$1\$1) untuk setiap panggilan yang menggambarkan tumpukan atau peristiwa tumpukan, kecuali untuk informasi yang disimpan di lokasi yang ditentukan di bawah ini.

**penting**  
Menggunakan `NoEcho` atribut tidak menutupi informasi apa pun yang disimpan sebagai berikut:  
Bagian `Metadata` template. CloudFormation tidak mengubah, memodifikasi, atau menyunting informasi apa pun yang Anda sertakan di `Metadata` bagian ini. Untuk informasi selengkapnya, lihat [Metadata](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
Bagian `Outputs` template. Untuk informasi selengkapnya, lihat [Output](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
`Metadata`Atribut definisi sumber daya. Untuk informasi lebih lanjut, lihat [Atribut `Metadata`](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Kami sangat menyarankan Anda untuk tidak menggunakan mekanisme ini untuk memasukkan informasi sensitif, seperti kata sandi atau rahasia.

**penting**  
Daripada menyematkan informasi sensitif secara langsung di CloudFormation template Anda, kami sarankan Anda menggunakan parameter dinamis dalam template tumpukan untuk mereferensikan informasi sensitif yang disimpan dan dikelola di luar CloudFormation, seperti di AWS Systems Manager Parameter Store atau AWS Secrets Manager.  
Untuk informasi selengkapnya, lihat Do [not embed credentials dalam praktik terbaik template Anda](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).

### JSON
<a name="quickref-redshift-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters" : {
    "DatabaseName" : {
      "Description" : "The name of the first database to be created when the cluster is created",
      "Type" : "String",
      "Default" : "dev",
      "AllowedPattern" : "([a-z]|[0-9])+"
    },
    "ClusterType" : {
      "Description" : "The type of cluster",
      "Type" : "String",
      "Default" : "single-node",
      "AllowedValues" : [ "single-node", "multi-node" ]
    },
    "NumberOfNodes" : {
      "Description" : "The number of compute nodes in the cluster. For multi-node clusters, the NumberOfNodes parameter must be greater than 1",
      "Type" : "Number",
      "Default" : "1"
    },
    "NodeType" : {
      "Description" : "The type of node to be provisioned",
      "Type" : "String",
      "Default" : "ds2.xlarge",
      "AllowedValues" : [ "ds2.xlarge", "ds2.8xlarge", "dc1.large", "dc1.8xlarge" ]
    }, 
    "MasterUsername" : {
      "Description" : "The user name that is associated with the master user account for the cluster that is being created",
      "Type" : "String",
      "Default" : "defaultuser",
      "AllowedPattern" : "([a-z])([a-z]|[0-9])*"
    },
    "MasterUserPassword" :  {
      "Description" : "The password that is associated with the master user account for the cluster that is being created.",
      "Type" : "String",
      "NoEcho" : "true"
    },
    "InboundTraffic" : {
      "Description" : "Allow inbound traffic to the cluster from this CIDR range.",
      "Type" : "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default" : "0.0.0.0/0",
      "AllowedPattern" : "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription" : "must be a valid CIDR range of the form x.x.x.x/x."
    },
    "PortNumber" : {
      "Description" : "The port number on which the cluster accepts incoming connections.",
      "Type" : "Number",
      "Default" : "5439"
    }
  },
  "Conditions" : {
    "IsMultiNodeCluster" : {
      "Fn::Equals" : [{ "Ref" : "ClusterType" }, "multi-node" ]        
    }
  },
  "Resources" : {
    "RedshiftCluster" : {
      "Type" : "AWS::Redshift::Cluster",
      "DependsOn" : "AttachGateway",
      "Properties" : {
        "ClusterType" : { "Ref" : "ClusterType" },
        "NumberOfNodes" : { "Fn::If" : [ "IsMultiNodeCluster",  { "Ref" : "NumberOfNodes" }, { "Ref" : "AWS::NoValue" }]},
        "NodeType" : { "Ref" : "NodeType" },
        "DBName" : { "Ref" : "DatabaseName" },
        "MasterUsername" : { "Ref" : "MasterUsername" },
        "MasterUserPassword" : { "Ref" : "MasterUserPassword" },               
        "ClusterParameterGroupName" : { "Ref" : "RedshiftClusterParameterGroup" },
        "VpcSecurityGroupIds" : [ { "Ref" : "SecurityGroup" } ],
        "ClusterSubnetGroupName" : { "Ref" : "RedshiftClusterSubnetGroup" },
        "PubliclyAccessible" : "true",
        "Port" : { "Ref" : "PortNumber" }
      }
    },
    "RedshiftClusterParameterGroup" : {
      "Type" : "AWS::Redshift::ClusterParameterGroup",
      "Properties" : {
        "Description" : "Cluster parameter group",
        "ParameterGroupFamily" : "redshift-1.0",
        "Parameters" : [{
          "ParameterName" : "enable_user_activity_logging",
          "ParameterValue" : "true"
        }]
      }
    },
    "RedshiftClusterSubnetGroup" : {
      "Type" : "AWS::Redshift::ClusterSubnetGroup",
      "Properties" : {
        "Description" : "Cluster subnet group",
        "SubnetIds" : [ { "Ref" : "PublicSubnet" } ]
      }
    },
    "VPC" : {
      "Type" : "AWS::EC2::VPC",
      "Properties" : {
        "CidrBlock" : "10.0.0.0/16"
      }
    },
    "PublicSubnet" : {
      "Type" : "AWS::EC2::Subnet",
      "Properties" : {
        "CidrBlock" : "10.0.0.0/24",
        "VpcId" : { "Ref" : "VPC" }
      }
    },
    "SecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Security group",
        "SecurityGroupIngress" : [ {
          "CidrIp" : { "Ref": "InboundTraffic" },
          "FromPort" : { "Ref" : "PortNumber" },
          "ToPort" : { "Ref" : "PortNumber" },
          "IpProtocol" : "tcp"
        } ],
        "VpcId" : { "Ref" : "VPC" }
      }
    },
    "myInternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway"
    },
    "AttachGateway" : {
      "Type" : "AWS::EC2::VPCGatewayAttachment",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "InternetGatewayId" : { "Ref" : "myInternetGateway" }
      }
    },
    "PublicRouteTable" : {
      "Type" : "AWS::EC2::RouteTable",
      "Properties" : {
        "VpcId" : {
          "Ref" : "VPC"
        }
      }
    },
    "PublicRoute" : {
      "Type" : "AWS::EC2::Route",
      "DependsOn" : "AttachGateway",
      "Properties"  : {
        "RouteTableId" : {
          "Ref" : "PublicRouteTable"
        },
        "DestinationCidrBlock" : "0.0.0.0/0",
        "GatewayId" : {
          "Ref" : "myInternetGateway"
        }
      }
    },
    "PublicSubnetRouteTableAssociation" : {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "SubnetId" : {
          "Ref" : "PublicSubnet"
        },
        "RouteTableId" : {
          "Ref" : "PublicRouteTable"
        }
      }
    }
  },
  "Outputs" : {
    "ClusterEndpoint" : {
      "Description" : "Cluster endpoint",
      "Value" : { "Fn::Join" : [ ":", [ { "Fn::GetAtt" : [ "RedshiftCluster", "Endpoint.Address" ] }, { "Fn::GetAtt" : [ "RedshiftCluster", "Endpoint.Port" ] } ] ] }
    },
    "ClusterName" : {
      "Description" : "Name of cluster",
      "Value" : { "Ref" : "RedshiftCluster" }
    },
    "ParameterGroupName" : {
      "Description" : "Name of parameter group",
      "Value" : { "Ref" : "RedshiftClusterParameterGroup" }
    },
    "RedshiftClusterSubnetGroupName" : {
      "Description" : "Name of cluster subnet group",
      "Value" : { "Ref" : "RedshiftClusterSubnetGroup" }
    },
    "RedshiftClusterSecurityGroupName" : {
      "Description" : "Name of cluster security group",
      "Value" : { "Ref" : "SecurityGroup" }
    }
  }
}
```

### YAML
<a name="quickref-redshift-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  DatabaseName:
    Description: The name of the first database to be created when the cluster is
      created
    Type: String
    Default: dev
    AllowedPattern: "([a-z]|[0-9])+"
  ClusterType:
    Description: The type of cluster
    Type: String
    Default: single-node
    AllowedValues:
    - single-node
    - multi-node
  NumberOfNodes:
    Description: The number of compute nodes in the cluster. For multi-node clusters,
      the NumberOfNodes parameter must be greater than 1
    Type: Number
    Default: '1'
  NodeType:
    Description: The type of node to be provisioned
    Type: String
    Default: ds2.xlarge
    AllowedValues:
    - ds2.xlarge
    - ds2.8xlarge
    - dc1.large
    - dc1.8xlarge
  MasterUsername:
    Description: The user name that is associated with the master user account for
      the cluster that is being created
    Type: String
    Default: defaultuser
    AllowedPattern: "([a-z])([a-z]|[0-9])*"
  MasterUserPassword:
    Description: The password that is associated with the master user account for
      the cluster that is being created.
    Type: String
    NoEcho: 'true'
  InboundTraffic:
    Description: Allow inbound traffic to the cluster from this CIDR range.
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: must be a valid CIDR range of the form x.x.x.x/x.
  PortNumber:
    Description: The port number on which the cluster accepts incoming connections.
    Type: Number
    Default: '5439'
Conditions:
  IsMultiNodeCluster:
    Fn::Equals:
    - Ref: ClusterType
    - multi-node
Resources:
  RedshiftCluster:
    Type: AWS::Redshift::Cluster
    DependsOn: AttachGateway
    Properties:
      ClusterType:
        Ref: ClusterType
      NumberOfNodes:
        Fn::If:
        - IsMultiNodeCluster
        - Ref: NumberOfNodes
        - Ref: AWS::NoValue
      NodeType:
        Ref: NodeType
      DBName:
        Ref: DatabaseName
      MasterUsername:
        Ref: MasterUsername
      MasterUserPassword:
        Ref: MasterUserPassword
      ClusterParameterGroupName:
        Ref: RedshiftClusterParameterGroup
      VpcSecurityGroupIds:
      - Ref: SecurityGroup
      ClusterSubnetGroupName:
        Ref: RedshiftClusterSubnetGroup
      PubliclyAccessible: 'true'
      Port:
        Ref: PortNumber
  RedshiftClusterParameterGroup:
    Type: AWS::Redshift::ClusterParameterGroup
    Properties:
      Description: Cluster parameter group
      ParameterGroupFamily: redshift-1.0
      Parameters:
      - ParameterName: enable_user_activity_logging
        ParameterValue: 'true'
  RedshiftClusterSubnetGroup:
    Type: AWS::Redshift::ClusterSubnetGroup
    Properties:
      Description: Cluster subnet group
      SubnetIds:
      - Ref: PublicSubnet
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId:
        Ref: VPC
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group
      SecurityGroupIngress:
      - CidrIp:
          Ref: InboundTraffic
        FromPort:
          Ref: PortNumber
        ToPort:
          Ref: PortNumber
        IpProtocol: tcp
      VpcId:
        Ref: VPC
  myInternetGateway:
    Type: AWS::EC2::InternetGateway
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: myInternetGateway
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId:
        Ref: PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId:
        Ref: myInternetGateway
  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: PublicSubnet
      RouteTableId:
        Ref: PublicRouteTable
Outputs:
  ClusterEndpoint:
    Description: Cluster endpoint
    Value: !Sub "${RedshiftCluster.Endpoint.Address}:${RedshiftCluster.Endpoint.Port}"
  ClusterName:
    Description: Name of cluster
    Value:
      Ref: RedshiftCluster
  ParameterGroupName:
    Description: Name of parameter group
    Value:
      Ref: RedshiftClusterParameterGroup
  RedshiftClusterSubnetGroupName:
    Description: Name of cluster subnet group
    Value:
      Ref: RedshiftClusterSubnetGroup
  RedshiftClusterSecurityGroupName:
    Description: Name of cluster security group
    Value:
      Ref: SecurityGroup
```

## Lihat juga
<a name="w2aac11c41c72b7"></a>

[AWS::Redshift::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html)

# Cuplikan template Amazon RDS
<a name="quickref-rds"></a>

**Topics**
+ [Sumber daya instans Amazon RDS DB](#scenario-rds-instance)
+ [Sumber daya instans DB database oracle Amazon RDS](#scenario-rds-oracleinstance)
+ [Sumber daya Amazon RDS DBSecurity Group untuk rentang CIDR](#scenario-rds-security-group-cidr)
+ [Amazon RDS DBSecurity Group dengan grup EC2 keamanan Amazon](#scenario-rds-security-group-ec2)
+ [Beberapa grup keamanan VPC](#scenario-multiple-vpc-security-groups)
+ [Instans database Amazon RDS dalam grup keamanan VPC](#w2aac11c41c76c15)

## Sumber daya instans Amazon RDS DB
<a name="scenario-rds-instance"></a>

Contoh ini menunjukkan sumber daya Instans Amazon RDS DB dengan kata sandi pengguna master terkelola. Untuk informasi selengkapnya, lihat [Manajemen kata sandi dengan AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) di *Panduan Pengguna Amazon RDS* dan [Manajemen Kata AWS Secrets Manager Sandi](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html) di Panduan Pengguna *Aurora*. Karena `EngineVersion` properti opsional tidak ditentukan, versi mesin default digunakan untuk Instans DB ini. Untuk detail tentang versi mesin default dan setelan default lainnya, lihat [Membuat DBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html). `DBSecurityGroups`Properti mengotorisasi masuknya jaringan ke `AWS::RDS::DBSecurityGroup` sumber daya bernama `MyDbSecurityByEC2SecurityGroup` dan. MyDbSecurityBy CIDRIPGroup Lihat perinciannya di [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html). Sumber daya Instans DB juga memiliki `DeletionPolicy` atribut yang disetel ke`Snapshot`. Dengan `Snapshot` `DeletionPolicy` set, CloudFormation akan mengambil snapshot dari Instans DB ini sebelum menghapusnya selama penghapusan tumpukan.

### JSON
<a name="quickref-rds-example-1.json"></a>

```
 1. "MyDB" : {
 2.  "Type" : "AWS::RDS::DBInstance",
 3.  "Properties" : {
 4.      "DBSecurityGroups" : [
 5.         {"Ref" : "MyDbSecurityByEC2SecurityGroup"}, {"Ref" : "MyDbSecurityByCIDRIPGroup"} ],
 6.      "AllocatedStorage" : "5",
 7.      "DBInstanceClass" : "db.t2.small",
 8.      "Engine" : "MySQL",
 9.      "MasterUsername" : "MyName",
10.      "ManageMasterUserPassword" : true,
11.      "MasterUserSecret" : {
12.         "KmsKeyId" : {"Ref" : "KMSKey"}
13.      }
14.  },
15.  "DeletionPolicy" : "Snapshot"
16. }
```

### YAML
<a name="quickref-rds-example-1.yaml"></a>

```
 1. MyDB:
 2.   Type: AWS::RDS::DBInstance
 3.   Properties:
 4.     DBSecurityGroups:
 5.     - Ref: MyDbSecurityByEC2SecurityGroup
 6.     - Ref: MyDbSecurityByCIDRIPGroup
 7.     AllocatedStorage: '5'
 8.     DBInstanceClass: db.t2.small
 9.     Engine: MySQL
10.     MasterUsername: MyName
11.     ManageMasterUserPassword: true
12.     MasterUserSecret:
13.       KmsKeyId: !Ref KMSKey
14.   DeletionPolicy: Snapshot
```

## Sumber daya instans DB database oracle Amazon RDS
<a name="scenario-rds-oracleinstance"></a>

Contoh ini membuat sumber daya Oracle Database DB Instance dengan kata sandi pengguna master terkelola. Untuk informasi selengkapnya, lihat [Manajemen kata sandi dengan AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) di *Panduan Pengguna Amazon RDS*. Contoh menentukan `Engine` as `oracle-ee` dengan model lisensi. bring-your-own-license [Untuk detail tentang pengaturan untuk instans Oracle Database DB, lihat Membuat. DBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) Properti DBSecurity Grup mengotorisasi masuknya jaringan ke `AWS::RDS::DBSecurityGroup` sumber daya bernama MyDbSecurityBy EC2 SecurityGroup dan. MyDbSecurityBy CIDRIPGroup Lihat perinciannya di [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html). Sumber daya Instans DB juga memiliki `DeletionPolicy` atribut yang disetel ke`Snapshot`. Dengan `Snapshot` `DeletionPolicy` set, CloudFormation akan mengambil snapshot dari Instans DB ini sebelum menghapusnya selama penghapusan tumpukan.

### JSON
<a name="quickref-rds-example-2.json"></a>

```
 1. "MyDB" : {
 2.  "Type" : "AWS::RDS::DBInstance",
 3.  "Properties" : {
 4.      "DBSecurityGroups" : [
 5.         {"Ref" : "MyDbSecurityByEC2SecurityGroup"}, {"Ref" : "MyDbSecurityByCIDRIPGroup"} ],
 6.      "AllocatedStorage" : "5",
 7.      "DBInstanceClass" : "db.t2.small",
 8.      "Engine" : "oracle-ee",
 9.      "LicenseModel" : "bring-your-own-license",
10.      "MasterUsername" : "master",
11.      "ManageMasterUserPassword" : true,
12.      "MasterUserSecret" : {
13.         "KmsKeyId" : {"Ref" : "KMSKey"}
14.      }
15.  },
16.  "DeletionPolicy" : "Snapshot"
17. }
```

### YAML
<a name="quickref-rds-example-2.yaml"></a>

```
 1. MyDB:
 2.   Type: AWS::RDS::DBInstance
 3.   Properties:
 4.     DBSecurityGroups:
 5.     - Ref: MyDbSecurityByEC2SecurityGroup
 6.     - Ref: MyDbSecurityByCIDRIPGroup
 7.     AllocatedStorage: '5'
 8.     DBInstanceClass: db.t2.small
 9.     Engine: oracle-ee
10.     LicenseModel: bring-your-own-license
11.     MasterUsername: master
12.     ManageMasterUserPassword: true
13.     MasterUserSecret:
14.       KmsKeyId: !Ref KMSKey
15.   DeletionPolicy: Snapshot
```

## Sumber daya Amazon RDS DBSecurity Group untuk rentang CIDR
<a name="scenario-rds-security-group-cidr"></a>

Contoh ini menunjukkan `DBSecurityGroup` sumber daya Amazon RDS dengan otorisasi masuk untuk rentang CIDR yang ditentukan dalam format. `ddd.ddd.ddd.ddd/dd` [Untuk detailnya, lihat [AWS: :RDS:: DBSecurity Group dan Ingress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html).](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-rds-dbsecuritygroup-ingress.html)

### JSON
<a name="quickref-rds-example-3.json"></a>

```
1. "MyDbSecurityByCIDRIPGroup" : {
2.  "Type" : "AWS::RDS::DBSecurityGroup",
3.  "Properties" : {
4.      "GroupDescription" : "Ingress for CIDRIP",
5.      "DBSecurityGroupIngress" : {
6.          "CIDRIP" : "192.168.0.0/32"
7.      }
8.  }
9. }
```

### YAML
<a name="quickref-rds-example-3.yaml"></a>

```
1. MyDbSecurityByCIDRIPGroup:
2.   Type: AWS::RDS::DBSecurityGroup
3.   Properties:
4.     GroupDescription: Ingress for CIDRIP
5.     DBSecurityGroupIngress:
6.       CIDRIP: "192.168.0.0/32"
```

## Amazon RDS DBSecurity Group dengan grup EC2 keamanan Amazon
<a name="scenario-rds-security-group-ec2"></a>

Contoh ini menunjukkan sumber daya [AWS: :RDS:: DBSecurity Grup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) dengan otorisasi masuk dari grup EC2 keamanan Amazon yang direferensikan oleh. `MyEc2SecurityGroup`

Untuk melakukan ini, Anda mendefinisikan grup EC2 keamanan dan kemudian menggunakan `Ref` fungsi intrinsik untuk merujuk ke grup EC2 keamanan di dalam Anda. `DBSecurityGroup`

### JSON
<a name="quickref-rds-example-4.json"></a>

```
"DBInstance" : {
   "Type": "AWS::RDS::DBInstance",
   "Properties": {
      "DBName"            : { "Ref" : "DBName" },
      "Engine"            : "MySQL",
      "MasterUsername"    : { "Ref" : "DBUsername" },
      "DBInstanceClass"   : { "Ref" : "DBClass" },
      "DBSecurityGroups"  : [ { "Ref" : "DBSecurityGroup" } ],
      "AllocatedStorage"  : { "Ref" : "DBAllocatedStorage" },
      "MasterUserPassword": { "Ref" : "DBPassword" }
   }
},

"DBSecurityGroup": {
   "Type": "AWS::RDS::DBSecurityGroup",
   "Properties": {
      "DBSecurityGroupIngress": {
         "EC2SecurityGroupName": {
            "Fn::GetAtt": ["WebServerSecurityGroup", "GroupName"]
         }
      },
      "GroupDescription" : "Frontend Access"
   }
},

"WebServerSecurityGroup" : {
   "Type" : "AWS::EC2::SecurityGroup",
   "Properties" : {
      "GroupDescription" : "Enable HTTP access via port 80 and SSH access",
      "SecurityGroupIngress" : [
         {"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0"},
         {"IpProtocol" : "tcp", "FromPort" : 22, "ToPort" : 22, "CidrIp" : "0.0.0.0/0"}
      ]
   }
}
```

### YAML
<a name="quickref-rds-example-4.yaml"></a>

Contoh ini diekstrak dari contoh lengkap berikut: [Drupal\$1Single\$1Instance\$1With\$1RDS.template](https://s3.amazonaws.com/cloudformation-templates-us-east-1/Drupal_Single_Instance_With_RDS.template)

```
DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBName:
      Ref: DBName
    Engine: MySQL
    MasterUsername:
      Ref: DBUsername
    DBInstanceClass:
      Ref: DBClass
    DBSecurityGroups:
    - Ref: DBSecurityGroup
    AllocatedStorage:
      Ref: DBAllocatedStorage
    MasterUserPassword:
      Ref: DBPassword
DBSecurityGroup:
  Type: AWS::RDS::DBSecurityGroup
  Properties:
    DBSecurityGroupIngress:
      EC2SecurityGroupName:
        Ref: WebServerSecurityGroup
    GroupDescription: Frontend Access
WebServerSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Enable HTTP access via port 80 and SSH access
    SecurityGroupIngress:
    - IpProtocol: tcp
      FromPort: 80
      ToPort: 80
      CidrIp: 0.0.0.0/0
    - IpProtocol: tcp
      FromPort: 22
      ToPort: 22
      CidrIp: 0.0.0.0/0
```

## Beberapa grup keamanan VPC
<a name="scenario-multiple-vpc-security-groups"></a>

Contoh ini menunjukkan [AWS: :RDS:: DBSecurity Group](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) resource dengan otorisasi ingress untuk beberapa grup keamanan Amazon EC2 VPC di [AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroupingress.html): :RDS::. DBSecurity GroupIngress

### JSON
<a name="quickref-rds-example-5.json"></a>

```
{
   "Resources" : {
      "DBinstance" : {
         "Type" : "AWS::RDS::DBInstance",
         "Properties" : {
            "AllocatedStorage" : "5",
            "DBInstanceClass" : "db.t2.small",
           "DBName" : {"Ref": "MyDBName" },
            "DBSecurityGroups" : [ { "Ref" : "DbSecurityByEC2SecurityGroup" } ],
            "DBSubnetGroupName" : { "Ref" : "MyDBSubnetGroup" },
            "Engine" : "MySQL",
           "MasterUserPassword": { "Ref" : "MyDBPassword" },
           "MasterUsername"    : { "Ref" : "MyDBUsername" }
        },
         "DeletionPolicy" : "Snapshot"
      },
      "DbSecurityByEC2SecurityGroup" : {
         "Type" : "AWS::RDS::DBSecurityGroup",
         "Properties" : {
            "GroupDescription" : "Ingress for Amazon EC2 security group",
           "EC2VpcId" : { "Ref" : "MyVPC" },
            "DBSecurityGroupIngress" : [ {
               "EC2SecurityGroupId" : "sg-b0ff1111",
               "EC2SecurityGroupOwnerId" : "111122223333"
            }, {
               "EC2SecurityGroupId" : "sg-ffd722222",
               "EC2SecurityGroupOwnerId" : "111122223333"
            } ]
         }
      }
   }
}
```

### YAML
<a name="quickref-rds-example-5.yaml"></a>

```
Resources:
  DBinstance:
    Type: AWS::RDS::DBInstance
    Properties:
      AllocatedStorage: '5'
      DBInstanceClass: db.t2.small
      DBName:
        Ref: MyDBName
      DBSecurityGroups:
      - Ref: DbSecurityByEC2SecurityGroup
      DBSubnetGroupName:
        Ref: MyDBSubnetGroup
      Engine: MySQL
      MasterUserPassword:
        Ref: MyDBPassword
      MasterUsername:
        Ref: MyDBUsername
    DeletionPolicy: Snapshot
  DbSecurityByEC2SecurityGroup:
    Type: AWS::RDS::DBSecurityGroup
    Properties:
      GroupDescription: Ingress for Amazon EC2 security group
      EC2VpcId:
        Ref: MyVPC
      DBSecurityGroupIngress:
      - EC2SecurityGroupId: sg-b0ff1111
        EC2SecurityGroupOwnerId: '111122223333'
      - EC2SecurityGroupId: sg-ffd722222
        EC2SecurityGroupOwnerId: '111122223333'
```

## Instans database Amazon RDS dalam grup keamanan VPC
<a name="w2aac11c41c76c15"></a>

Contoh ini menunjukkan instance database Amazon RDS yang terkait dengan grup keamanan Amazon EC2 VPC.

### JSON
<a name="quickref-rds-example-6.json"></a>

```
{
  "DBEC2SecurityGroup": {
    "Type": "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription": "Open database for access",
      "SecurityGroupIngress" : [{
        "IpProtocol" : "tcp",
        "FromPort" : 3306,
        "ToPort" : 3306,
        "SourceSecurityGroupName" : { "Ref" : "WebServerSecurityGroup" }
      }]
    }
  },
  "DBInstance" : {
    "Type": "AWS::RDS::DBInstance",
    "Properties": {
      "DBName"            : { "Ref" : "DBName" },
      "Engine"            : "MySQL",
      "MultiAZ"           : { "Ref": "MultiAZDatabase" },
      "MasterUsername"    : { "Ref" : "DBUser" },
      "DBInstanceClass"   : { "Ref" : "DBClass" },
      "AllocatedStorage"  : { "Ref" : "DBAllocatedStorage" },
      "MasterUserPassword": { "Ref" : "DBPassword" },
      "VPCSecurityGroups" : [ { "Fn::GetAtt": [ "DBEC2SecurityGroup", "GroupId" ] } ]
    }
  }
}
```

### YAML
<a name="quickref-rds-example-6.yaml"></a>

```
DBEC2SecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Open database for access
    SecurityGroupIngress:
    - IpProtocol: tcp
      FromPort: 3306
      ToPort: 3306
      SourceSecurityGroupName:
        Ref: WebServerSecurityGroup
DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBName:
      Ref: DBName
    Engine: MySQL
    MultiAZ:
      Ref: MultiAZDatabase
    MasterUsername:
      Ref: DBUser
    DBInstanceClass:
      Ref: DBClass
    AllocatedStorage:
      Ref: DBAllocatedStorage
    MasterUserPassword:
      Ref: DBPassword
    VPCSecurityGroups:
    - !GetAtt DBEC2SecurityGroup.GroupId
```

# Cuplikan templat Route 53
<a name="quickref-route53"></a>

**Topics**
+ [Rekaman sumber daya Amazon Route 53 yang ditetapkan menggunakan nama atau ID zona yang dihosting](#scenario-route53-recordset-by-host)
+ [Menggunakan RecordSetGroup untuk mengatur set catatan sumber daya tertimbang](#scenario-recordsetgroup-weighted)
+ [Menggunakan RecordSetGroup untuk menyiapkan kumpulan catatan sumber daya alias](#scenario-recordsetgroup-zoneapex)
+ [Catatan sumber daya alias ditetapkan untuk distribusi CloudFront](#scenario-user-friendly-url-for-cloudfront-distribution)

## Rekaman sumber daya Amazon Route 53 yang ditetapkan menggunakan nama atau ID zona yang dihosting
<a name="scenario-route53-recordset-by-host"></a>

Saat Anda membuat kumpulan catatan sumber daya Amazon Route 53, Anda harus menentukan zona yang dihosting tempat Anda ingin menambahkannya. CloudFormation menyediakan dua cara untuk menentukan zona yang dihosting:
+ Anda dapat secara eksplisit menentukan zona yang di-host menggunakan properti `HostedZoneId`.
+ Anda dapat CloudFormation menemukan zona yang dihosting menggunakan `HostedZoneName` properti. Jika Anda menggunakan `HostedZoneName` properti dan ada beberapa zona yang dihosting dengan nama yang sama, CloudFormation tidak membuat tumpukan.

### Menambahkan RecordSet menggunakan HostedZoneId
<a name="scenario-recordset-using-id"></a>

Contoh ini menambahkan kumpulan data sumber daya Amazon Route 53 yang berisi `SPF` catatan untuk nama domain `mysite.example.com` yang menggunakan `HostedZoneId` properti untuk menentukan zona yang dihosting.

#### JSON
<a name="quickref-route53-example-1.json"></a>

```
 1. "myDNSRecord" : {
 2.   "Type" : "AWS::Route53::RecordSet",
 3.   "Properties" : 
 4.   {
 5.     "HostedZoneId" : "Z3DG6IL3SJCGPX",
 6.     "Name" : "mysite.example.com.",
 7.     "Type" : "SPF",
 8.     "TTL" : "900",
 9.     "ResourceRecords" : [ "\"v=spf1 ip4:192.168.0.1/16 -all\"" ]
10.   }
11. }
```

#### YAML
<a name="quickref-route53-example-1.yaml"></a>

```
1. myDNSRecord:
2.   Type: AWS::Route53::RecordSet
3.   Properties:
4.     HostedZoneId: Z3DG6IL3SJCGPX
5.     Name: mysite.example.com.
6.     Type: SPF
7.     TTL: '900'
8.     ResourceRecords:
9.     - '"v=spf1 ip4:192.168.0.1/16 -all"'
```

### Menambahkan RecordSet menggunakan HostedZoneName
<a name="scenario-recordset-using-name"></a>

Contoh ini menambahkan data sumber daya Amazon Route 53 yang ditetapkan untuk nama domain “mysite.example.com” menggunakan `HostedZoneName` properti untuk menentukan zona yang dihosting.

#### JSON
<a name="quickref-route53-example-2.json"></a>

```
 1. "myDNSRecord2" : {
 2.             "Type" : "AWS::Route53::RecordSet",
 3.             "Properties" : {
 4.                 "HostedZoneName" : "example.com.",
 5.                 "Name" : "mysite.example.com.",
 6.                 "Type" : "A",
 7.                 "TTL" : "900",
 8.                 "ResourceRecords" : [
 9.                     "192.168.0.1",
10.                     "192.168.0.2"
11.                 ]
12.             }
13.         }
```

#### YAML
<a name="quickref-route53-example-2.yaml"></a>

```
 1. myDNSRecord2:
 2.   Type: AWS::Route53::RecordSet
 3.   Properties:
 4.     HostedZoneName: example.com.
 5.     Name: mysite.example.com.
 6.     Type: A
 7.     TTL: '900'
 8.     ResourceRecords:
 9.     - 192.168.0.1
10.     - 192.168.0.2
```

## Menggunakan RecordSetGroup untuk mengatur set catatan sumber daya tertimbang
<a name="scenario-recordsetgroup-weighted"></a>

Contoh ini menggunakan [AWS::Route53::RecordSetGrup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) untuk menyiapkan dua catatan CNAME untuk “example.com.” zona yang di-host. Properti `RecordSets` mengandung set catatan CNAME untuk nama DNS "mysite.example.com". Setiap set catatan mengandung sebuah pengidentifikasi (`SetIdentifier`) dan bobot (`Weight`). Proporsi lalu lintas internet yang dirutekan ke sumber daya didasarkan pada perhitungan berikut:
+ `Frontend One`: `140/(140+60)` = `140/200` = 70%
+ `Frontend Two`: `60/(140+60)` = `60/200` = 30%

Untuk informasi selengkapnya tentang kumpulan rekaman sumber daya tertimbang, lihat [Perutean tertimbang di Panduan Pengembang](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html) *Amazon Route 53*.

### JSON
<a name="quickref-route53-example-3.json"></a>

```
 1.         "myDNSOne" : {
 2.             "Type" : "AWS::Route53::RecordSetGroup",
 3.             "Properties" : {
 4.                 "HostedZoneName" : "example.com.",
 5.                 "Comment" : "Weighted RR for my frontends.",
 6.                 "RecordSets" : [
 7.                   {
 8.                     "Name" : "mysite.example.com.",
 9.                     "Type" : "CNAME",
10.                     "TTL" : "900",
11.                     "SetIdentifier" : "Frontend One",
12.                     "Weight" : "140",
13.                     "ResourceRecords" : ["example-ec2.amazonaws.com"]
14.                   },
15.                   {
16.                     "Name" : "mysite.example.com.",
17.                     "Type" : "CNAME",
18.                     "TTL" : "900",
19.                     "SetIdentifier" : "Frontend Two",
20.                     "Weight" : "60",
21.                     "ResourceRecords" : ["example-ec2-larger.amazonaws.com"]
22.                   }
23.                   ]
24.             }
25.         }
```

### YAML
<a name="quickref-route53-example-3.yaml"></a>

```
 1. myDNSOne:
 2.   Type: AWS::Route53::RecordSetGroup
 3.   Properties:
 4.     HostedZoneName: example.com.
 5.     Comment: Weighted RR for my frontends.
 6.     RecordSets:
 7.     - Name: mysite.example.com.
 8.       Type: CNAME
 9.       TTL: '900'
10.       SetIdentifier: Frontend One
11.       Weight: '140'
12.       ResourceRecords:
13.       - example-ec2.amazonaws.com
14.     - Name: mysite.example.com.
15.       Type: CNAME
16.       TTL: '900'
17.       SetIdentifier: Frontend Two
18.       Weight: '60'
19.       ResourceRecords:
20.       - example-ec2-larger.amazonaws.com
```

## Menggunakan RecordSetGroup untuk menyiapkan kumpulan catatan sumber daya alias
<a name="scenario-recordsetgroup-zoneapex"></a>

Contoh berikut menggunakan [AWS::Route53::RecordSetGrup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) untuk menyiapkan kumpulan catatan sumber daya alias bernama `example.com` yang merutekan lalu lintas ke penyeimbang beban ELB Versi 1 (Klasik) dan penyeimbang beban Versi 2 (Aplikasi atau Jaringan). [AliasTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-route53-recordset-aliastarget.html)Properti menentukan ID zona host dan nama DNS untuk `myELB` `LoadBalancer` dengan menggunakan fungsi `GetAtt` intrinsik. `GetAtt`mengambil properti `myELB` sumber daya yang berbeda, tergantung pada apakah Anda merutekan lalu lintas ke penyeimbang beban Versi 1 atau Versi 2:
+ Penyeimbang beban Versi 1: `CanonicalHostedZoneNameID` dan `DNSName`
+ Penyeimbang beban Versi 2: `CanonicalHostedZoneID` dan `DNSName`

Untuk informasi selengkapnya tentang kumpulan rekaman sumber daya alias, lihat [Memilih antara catatan alias dan non-alias](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html) di Panduan Pengembang *Route* 53.

### JSON untuk penyeimbang beban versi 1
<a name="quickref-route53-example-4.json"></a>

```
 1.       "myELB" : {
 2.         "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
 3.         "Properties" : {
 4.             "AvailabilityZones" : [ "us-east-1a" ],
 5.             "Listeners" : [ {
 6.                 "LoadBalancerPort" : "80",
 7.                 "InstancePort" : "80",
 8.                 "Protocol" : "HTTP"
 9.             } ]
10.         }
11.       },
12.       "myDNS" : {
13.         "Type" : "AWS::Route53::RecordSetGroup",
14.         "Properties" : {
15.           "HostedZoneName" : "example.com.",
16.           "Comment" : "Zone apex alias targeted to myELB LoadBalancer.",
17.           "RecordSets" : [
18.             {
19.               "Name" : "example.com.",
20.               "Type" : "A",
21.               "AliasTarget" : {
22.                   "HostedZoneId" : { "Fn::GetAtt" : ["myELB", "CanonicalHostedZoneNameID"] },
23.                   "DNSName" : { "Fn::GetAtt" : ["myELB","DNSName"] }
24.               }
25.             }
26.           ]
27.         }
28.     }
```

### YAML untuk penyeimbang beban versi 1
<a name="quickref-route53-example-4.yaml"></a>

```
 1. myELB:
 2.   Type: AWS::ElasticLoadBalancing::LoadBalancer
 3.   Properties:
 4.     AvailabilityZones:
 5.     - "us-east-1a"
 6.     Listeners:
 7.     - LoadBalancerPort: '80'
 8.       InstancePort: '80'
 9.       Protocol: HTTP
10. myDNS:
11.   Type: AWS::Route53::RecordSetGroup
12.   Properties:
13.     HostedZoneName: example.com.
14.     Comment: Zone apex alias targeted to myELB LoadBalancer.
15.     RecordSets:
16.     - Name: example.com.
17.       Type: A
18.       AliasTarget:
19.         HostedZoneId: !GetAtt 'myELB.CanonicalHostedZoneNameID'
20.         DNSName: !GetAtt 'myELB.DNSName'
```

### JSON untuk penyeimbang beban versi 2
<a name="quickref-route53-example-4-v2.json"></a>

```
 1.       "myELB" : {
 2.         "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
 3.         "Properties" : {
 4.             "Subnets" : [ 
 5.                 {"Ref": "SubnetAZ1"}, 
 6.                 {"Ref" : "SubnetAZ2"}
 7.             ]
 8.         }
 9.       },
10.       "myDNS" : {
11.         "Type" : "AWS::Route53::RecordSetGroup",
12.         "Properties" : {
13.           "HostedZoneName" : "example.com.",
14.           "Comment" : "Zone apex alias targeted to myELB LoadBalancer.",
15.           "RecordSets" : [
16.             {
17.               "Name" : "example.com.",
18.               "Type" : "A",
19.               "AliasTarget" : {
20.                   "HostedZoneId" : { "Fn::GetAtt" : ["myELB", "CanonicalHostedZoneID"] },
21.                   "DNSName" : { "Fn::GetAtt" : ["myELB","DNSName"] }
22.               }
23.             }
24.           ]
25.         }
26.     }
```

### YAML untuk penyeimbang beban versi 2
<a name="quickref-route53-example-4-v2.yaml"></a>

```
 1. myELB:
 2.   Type: AWS::ElasticLoadBalancingV2::LoadBalancer
 3.   Properties:
 4.     Subnets:
 5.     - Ref: SubnetAZ1
 6.     - Ref: SubnetAZ2
 7. myDNS:
 8.   Type: AWS::Route53::RecordSetGroup
 9.   Properties:
10.     HostedZoneName: example.com.
11.     Comment: Zone apex alias targeted to myELB LoadBalancer.
12.     RecordSets:
13.     - Name: example.com.
14.       Type: A
15.       AliasTarget:
16.         HostedZoneId: !GetAtt 'myELB.CanonicalHostedZoneID'
17.         DNSName: !GetAtt 'myELB.DNSName'
```

## Catatan sumber daya alias ditetapkan untuk distribusi CloudFront
<a name="scenario-user-friendly-url-for-cloudfront-distribution"></a>

Contoh berikut membuat catatan alias A yang mengarahkan nama domain kustom ke CloudFront distribusi yang ada. `myHostedZoneID`diasumsikan sebagai referensi ke `AWS::Route53::HostedZone` sumber daya aktual dalam template atau parameter yang sama. `myCloudFrontDistribution`mengacu pada sumber `AWS::CloudFront::Distribution` daya dalam template yang sama. Catatan alias menggunakan ID zona CloudFront host standar (`Z2FDTNDATAQYW2`) dan secara otomatis menyelesaikan nama domain distribusi menggunakan. `Fn::GetAtt` Pengaturan ini memungkinkan lalu lintas web dialihkan dari domain khusus ke CloudFront distribusi tanpa memerlukan alamat IP.

**catatan**  
Ketika Anda membuat kumpulan catatan sumber daya alias, Anda harus menentukan `Z2FDTNDATAQYW2` untuk `HostedZoneId` properti. Kumpulan catatan sumber daya alias untuk tidak CloudFront dapat dibuat di zona pribadi.

### JSON
<a name="quickref-route53-example-5.json"></a>

```
 1. {
 2.     "myDNS": {
 3.         "Type": "AWS::Route53::RecordSetGroup",
 4.         "Properties": {
 5.             "HostedZoneId": {
 6.                 "Ref": "myHostedZoneID"
 7.             },
 8.             "RecordSets": [
 9.                 {
10.                     "Name": {
11.                         "Ref": "myRecordSetDomainName"
12.                     },
13.                     "Type": "A",
14.                     "AliasTarget": {
15.                         "HostedZoneId": "Z2FDTNDATAQYW2",
16.                         "DNSName": {
17.                             "Fn::GetAtt": [
18.                                 "myCloudFrontDistribution",
19.                                 "DomainName"
20.                             ]
21.                         },
22.                         "EvaluateTargetHealth": false
23.                     }
24.                 }
25.             ]
26.         }
27.     }
28. }
```

### YAML
<a name="quickref-route53-example-5.yaml"></a>

```
 1. myDNS:
 2.   Type: AWS::Route53::RecordSetGroup
 3.   Properties:
 4.     HostedZoneId: !Ref myHostedZoneID
 5.     RecordSets:
 6.       - Name: !Ref myRecordSetDomainName
 7.         Type: A
 8.         AliasTarget:
 9.           HostedZoneId: Z2FDTNDATAQYW2
10.           DNSName: !GetAtt 
11.             - myCloudFrontDistribution
12.             - DomainName
13.           EvaluateTargetHealth: false
```

# Cuplikan template Amazon S3
<a name="quickref-s3"></a>

Gunakan contoh template Amazon S3 ini untuk membantu mendeskripsikan bucket Amazon S3 Anda. CloudFormation Untuk contoh lainnya, lihat bagian [Contoh](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html#aws-resource-s3-bucket--examples) di `AWS::S3::Bucket` sumber daya.

**Topics**
+ [Membuat bucket Amazon S3 dengan default](#scenario-s3-bucket)
+ [Membuat bucket Amazon S3 untuk hosting situs web dan dengan `DeletionPolicy`](#scenario-s3-bucket-website)
+ [Pembuatan situs web statis menggunakan domain kustom](#scenario-s3-bucket-website-customdomain)

## Membuat bucket Amazon S3 dengan default
<a name="scenario-s3-bucket"></a>

Contoh ini menggunakan a [AWS::S3::Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html)untuk membuat bucket dengan pengaturan default.

### JSON
<a name="quickref-s3-example-1.json"></a>

```
1. "myS3Bucket" : {
2.       "Type" : "AWS::S3::Bucket"
3.       }
```

### YAML
<a name="quickref-s3-example-1.yaml"></a>

```
1. MyS3Bucket:
2.     Type: AWS::S3::Bucket
```

## Membuat bucket Amazon S3 untuk hosting situs web dan dengan `DeletionPolicy`
<a name="scenario-s3-bucket-website"></a>

Contoh ini membuat bucket sebagai situs web dan menonaktifkan Blokir Akses Publik (izin baca publik diperlukan untuk bucket yang disiapkan untuk hosting situs web). Kebijakan bucket publik kemudian ditambahkan ke bucket. Karena sumber daya bucket ini memiliki `DeletionPolicy` atribut yang disetel ke`Retain`, tidak CloudFormation akan menghapus bucket ini saat menghapus tumpukan. `Output`Bagian ini digunakan `Fn::GetAtt` untuk mengambil `WebsiteURL` atribut dan `DomainName` atribut `S3Bucket` sumber daya.

**catatan**  
Contoh berikut mengasumsikan pengaturan `BlockPublicPolicy` dan `RestrictPublicBuckets` Blokir Akses Publik telah dinonaktifkan di tingkat akun. 

### JSON
<a name="quickref-s3-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion": "2010-09-09",
 3.     "Resources": {
 4.         "S3Bucket": {
 5.             "Type": "AWS::S3::Bucket",
 6.             "Properties": {
 7.                 "PublicAccessBlockConfiguration": {
 8.                     "BlockPublicAcls": false,
 9.                     "BlockPublicPolicy": false,
10.                     "IgnorePublicAcls": false,
11.                     "RestrictPublicBuckets": false
12.                 },
13.                 "WebsiteConfiguration": {
14.                     "IndexDocument": "index.html",
15.                     "ErrorDocument": "error.html"
16.                 }
17.             },
18.             "DeletionPolicy": "Retain",
19.             "UpdateReplacePolicy": "Retain"
20.         },
21.         "BucketPolicy": {
22.             "Type": "AWS::S3::BucketPolicy",
23.             "Properties": {
24.                 "PolicyDocument": {
25.                     "Id": "MyPolicy",
26.                     "Version": "2012-10-17", 		 	 	 
27.                     "Statement": [
28.                         {
29.                             "Sid": "PublicReadForGetBucketObjects",
30.                             "Effect": "Allow",
31.                             "Principal": "*",
32.                             "Action": "s3:GetObject",
33.                             "Resource": {
34.                                 "Fn::Join": [
35.                                     "",
36.                                     [
37.                                         "arn:aws:s3:::",
38.                                         {
39.                                             "Ref": "S3Bucket"
40.                                         },
41.                                         "/*"
42.                                     ]
43.                                 ]
44.                             }
45.                         }
46.                     ]
47.                 },
48.                 "Bucket": {
49.                     "Ref": "S3Bucket"
50.                 }
51.             }
52.         }
53.     },
54.     "Outputs": {
55.         "WebsiteURL": {
56.             "Value": {
57.                 "Fn::GetAtt": [
58.                     "S3Bucket",
59.                     "WebsiteURL"
60.                 ]
61.             },
62.             "Description": "URL for website hosted on S3"
63.         },
64.         "S3BucketSecureURL": {
65.             "Value": {
66.                 "Fn::Join": [
67.                     "",
68.                     [
69.                         "https://",
70.                         {
71.                             "Fn::GetAtt": [
72.                                 "S3Bucket",
73.                                 "DomainName"
74.                             ]
75.                         }
76.                     ]
77.                 ]
78.             },
79.             "Description": "Name of S3 bucket to hold website content"
80.         }
81.     }
82. }
```

### YAML
<a name="quickref-s3-example-2.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Resources:
 3.   S3Bucket:
 4.     Type: AWS::S3::Bucket
 5.     Properties:
 6.       PublicAccessBlockConfiguration:
 7.         BlockPublicAcls: false
 8.         BlockPublicPolicy: false
 9.         IgnorePublicAcls: false
10.         RestrictPublicBuckets: false
11.       WebsiteConfiguration:
12.         IndexDocument: index.html
13.         ErrorDocument: error.html
14.     DeletionPolicy: Retain
15.     UpdateReplacePolicy: Retain
16.   BucketPolicy:
17.     Type: AWS::S3::BucketPolicy
18.     Properties:
19.       PolicyDocument:
20.         Id: MyPolicy
21.         Version: 2012-10-17 		 	 	 
22.         Statement:
23.           - Sid: PublicReadForGetBucketObjects
24.             Effect: Allow
25.             Principal: '*'
26.             Action: 's3:GetObject'
27.             Resource: !Join 
28.               - ''
29.               - - 'arn:aws:s3:::'
30.                 - !Ref S3Bucket
31.                 - /*
32.       Bucket: !Ref S3Bucket
33. Outputs:
34.   WebsiteURL:
35.     Value: !GetAtt 
36.       - S3Bucket
37.       - WebsiteURL
38.     Description: URL for website hosted on S3
39.   S3BucketSecureURL:
40.     Value: !Join 
41.       - ''
42.       - - 'https://'
43.         - !GetAtt 
44.           - S3Bucket
45.           - DomainName
46.     Description: Name of S3 bucket to hold website content
```

## Pembuatan situs web statis menggunakan domain kustom
<a name="scenario-s3-bucket-website-customdomain"></a>

Anda dapat menggunakan Route 53 dengan domain terdaftar. Contoh berikut mengasumsikan bahwa Anda telah membuat zona yang dihosting di Route 53 untuk domain Anda. Contoh ini membuat dua bucket untuk hosting situs web. Bucket root meng-host konten, dan bucket lainnya mengalihkan permintaan `www.domainname.com` ke bucket root. Kumpulan catatan memetakan nama domain Anda ke titik akhir Amazon S3. 

Anda juga perlu menambahkan kebijakan bucket, seperti yang ditunjukkan pada contoh di atas.

Untuk informasi selengkapnya tentang penggunaan domain kustom, lihat [Tutorial: Mengonfigurasi situs web statis menggunakan domain kustom yang terdaftar dengan Route 53](https://docs.aws.amazon.com/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html) di *Panduan Pengguna Layanan Penyimpanan Sederhana Amazon*.

**catatan**  
Contoh berikut mengasumsikan pengaturan `BlockPublicPolicy` dan `RestrictPublicBuckets` Blokir Akses Publik telah dinonaktifkan di tingkat akun. 

### JSON
<a name="quickref-s3-example-3.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Mappings" : {
        "RegionMap" : {
            "us-east-1" : { "S3hostedzoneID" : "Z3AQBSTGFYJSTF", "websiteendpoint" : "s3-website-us-east-1.amazonaws.com" },
            "us-west-1" : { "S3hostedzoneID" : "Z2F56UZL2M1ACD", "websiteendpoint" : "s3-website-us-west-1.amazonaws.com" },
            "us-west-2" : { "S3hostedzoneID" : "Z3BJ6K6RIION7M", "websiteendpoint" : "s3-website-us-west-2.amazonaws.com" },            
            "eu-west-1" : { "S3hostedzoneID" : "Z1BKCTXD74EZPE", "websiteendpoint" : "s3-website-eu-west-1.amazonaws.com" },
            "ap-southeast-1" : { "S3hostedzoneID" : "Z3O0J2DXBE1FTB", "websiteendpoint" : "s3-website-ap-southeast-1.amazonaws.com" },
            "ap-southeast-2" : { "S3hostedzoneID" : "Z1WCIGYICN2BYD", "websiteendpoint" : "s3-website-ap-southeast-2.amazonaws.com" },
            "ap-northeast-1" : { "S3hostedzoneID" : "Z2M4EHUR26P7ZW", "websiteendpoint" : "s3-website-ap-northeast-1.amazonaws.com" },
            "sa-east-1" : { "S3hostedzoneID" : "Z31GFT0UA1I2HV", "websiteendpoint" : "s3-website-sa-east-1.amazonaws.com" }
        }
    },
    "Parameters": {
        "RootDomainName": {
            "Description": "Domain name for your website (example.com)",
            "Type": "String"
        }
    },
    "Resources": {
        "RootBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName" : {"Ref":"RootDomainName"},
                "PublicAccessBlockConfiguration": {
                    "BlockPublicAcls": false,
                    "BlockPublicPolicy": false,
                    "IgnorePublicAcls": false,
                    "RestrictPublicBuckets": false
                },
                "WebsiteConfiguration": {
                    "IndexDocument":"index.html",
                    "ErrorDocument":"404.html"
                }
            }
        },
        "WWWBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": {
                    "Fn::Join": ["", ["www.", {"Ref":"RootDomainName"}]]
                },
                "AccessControl": "BucketOwnerFullControl",
                "WebsiteConfiguration": {
                    "RedirectAllRequestsTo": {
                        "HostName": {"Ref": "RootBucket"}
                    }
                }
            }
        },
        "myDNS": {
            "Type": "AWS::Route53::RecordSetGroup",
            "Properties": {
                "HostedZoneName": {
                    "Fn::Join": ["", [{"Ref": "RootDomainName"}, "."]]
                },
                "Comment": "Zone apex alias.",
                "RecordSets": [
                    {
                        "Name": {"Ref": "RootDomainName"},
                        "Type": "A",
                        "AliasTarget": {
                            "HostedZoneId": {"Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "S3hostedzoneID"]},
                            "DNSName": {"Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "websiteendpoint"]}
                        }
                    },
                    {
                        "Name": {
                            "Fn::Join": ["", ["www.", {"Ref":"RootDomainName"}]]
                        },
                        "Type": "CNAME",
                        "TTL" : "900",
                        "ResourceRecords" : [
                            {"Fn::GetAtt":["WWWBucket", "DomainName"]}
                        ]
                    }
                ]
            }
        }
    },
    "Outputs": {
        "WebsiteURL": {
            "Value": {"Fn::GetAtt": ["RootBucket", "WebsiteURL"]},
            "Description": "URL for website hosted on S3"
        }
    }
}
```

### YAML
<a name="quickref-s3-example-3.yaml"></a>

```
Parameters:
  RootDomainName:
    Description: Domain name for your website (example.com)
    Type: String
Mappings:
  RegionMap:
    us-east-1:
      S3hostedzoneID: Z3AQBSTGFYJSTF
      websiteendpoint: s3-website-us-east-1.amazonaws.com
    us-west-1:
      S3hostedzoneID: Z2F56UZL2M1ACD
      websiteendpoint: s3-website-us-west-1.amazonaws.com
    us-west-2:
      S3hostedzoneID: Z3BJ6K6RIION7M
      websiteendpoint: s3-website-us-west-2.amazonaws.com
    eu-west-1:
      S3hostedzoneID: Z1BKCTXD74EZPE
      websiteendpoint: s3-website-eu-west-1.amazonaws.com
    ap-southeast-1:
      S3hostedzoneID: Z3O0J2DXBE1FTB
      websiteendpoint: s3-website-ap-southeast-1.amazonaws.com
    ap-southeast-2:
      S3hostedzoneID: Z1WCIGYICN2BYD
      websiteendpoint: s3-website-ap-southeast-2.amazonaws.com
    ap-northeast-1:
      S3hostedzoneID: Z2M4EHUR26P7ZW
      websiteendpoint: s3-website-ap-northeast-1.amazonaws.com
    sa-east-1:
      S3hostedzoneID: Z31GFT0UA1I2HV
      websiteendpoint: s3-website-sa-east-1.amazonaws.com
Resources:
  RootBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref RootDomainName
      PublicAccessBlockConfiguration:
        BlockPublicAcls: false
        BlockPublicPolicy: false
        IgnorePublicAcls: false
        RestrictPublicBuckets: false
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: 404.html
  WWWBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub
        - www.${Domain}
        - Domain: !Ref RootDomainName
      AccessControl: BucketOwnerFullControl
      WebsiteConfiguration:
        RedirectAllRequestsTo:
          HostName: !Ref RootBucket
  myDNS:
    Type: AWS::Route53::RecordSetGroup
    Properties:
      HostedZoneName: !Sub 
        - ${Domain}.
        - Domain: !Ref RootDomainName
      Comment: Zone apex alias.
      RecordSets:
        - Name: !Ref RootDomainName
          Type: A
          AliasTarget:
            HostedZoneId: !FindInMap [ RegionMap, !Ref 'AWS::Region', S3hostedzoneID]
            DNSName: !FindInMap [ RegionMap, !Ref 'AWS::Region', websiteendpoint]
        - Name: !Sub
            - www.${Domain}
            - Domain: !Ref RootDomainName
          Type: CNAME
          TTL: 900
          ResourceRecords:
            - !GetAtt WWWBucket.DomainName
Outputs:
  WebsiteURL:
    Value: !GetAtt RootBucket.WebsiteURL
    Description: URL for website hosted on S3
```

# Cuplikan template Amazon SNS
<a name="quickref-sns"></a>

Contoh ini menunjukkan sumber daya topik Amazon SNS. Ini membutuhkan alamat email yang valid.

## JSON
<a name="quickref-sns-example-1.json"></a>

```
1. "MySNSTopic" : {
2.     "Type" : "AWS::SNS::Topic",
3.     "Properties" : {
4.         "Subscription" : [ {
5.             "Endpoint" : "add valid email address",
6.             "Protocol" : "email"
7.         } ]
8.     }
9. }
```

## YAML
<a name="quickref-sns-example-1.yaml"></a>

```
1. MySNSTopic:
2.   Type: AWS::SNS::Topic
3.   Properties:
4.     Subscription:
5.     - Endpoint: "add valid email address"
6.       Protocol: email
```

# Cuplikan template Amazon SQS
<a name="scenario-sqs-queue"></a>

Contoh ini menunjukkan antrian Amazon SQS.

## JSON
<a name="scenario-sqs-queue-example-1.json"></a>

```
1. "MyQueue" : {
2.     "Type" : "AWS::SQS::Queue",
3.     "Properties" : {
4.         "VisibilityTimeout" : "value"
5.     }
6. }
```

## YAML
<a name="scenario-sqs-queue-example-1.yaml"></a>

```
1. MyQueue:
2.   Type: AWS::SQS::Queue
3.   Properties:
4.     VisibilityTimeout: value
```

# Cuplikan template Amazon Timestream
<a name="scenario-timestream-queue"></a>

Amazon TimeStream untuk InfluxDB memudahkan pengembang dan DevOps tim aplikasi untuk menjalankan database InfluxDB yang dikelola sepenuhnya untuk aplikasi deret waktu nyata menggunakan sumber terbuka. AWS APIs Anda dapat dengan cepat membuat database InfluxDB yang menangani beban kerja deret waktu yang menuntut. Dengan beberapa panggilan API sederhana, Anda dapat mengatur, memigrasi, mengoperasikan, dan menskalakan database InfluxDB AWS dengan penambalan, pencadangan, dan pemulihan perangkat lunak otomatis. Anda juga dapat menemukan sampel ini di [awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream-influxdb](https://github.com/awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream-influxdb) on. GitHub

**Topics**
+ [Sampel minimal menggunakan nilai default](#scenario-timestream-influxdb-example-1)
+ [Contoh yang lebih lengkap dengan parameter](#scenario-timestream-influxdb-example-2)

 CloudFormation Template ini membuat sumber daya berikut yang diperlukan untuk berhasil membuat, menyambungkan, dan memantau Amazon Timestream untuk instans InfluxDB:

**Amazon VPC**
+ `VPC`
+ Satu atau lebih `Subnet`
+ `InternetGateway`
+ `RouteTable`
+ `SecurityGroup`

**Amazon S3**
+ `Bucket`

**Amazon Timestream**
+ `InfluxDBInstance`

## Sampel minimal menggunakan nilai default
<a name="scenario-timestream-influxdb-example-1"></a>

Contoh ini menyebarkan instans multi-AZ dan dapat diakses publik menggunakan nilai default jika memungkinkan.

### JSON
<a name="scenario-timestream-influxdb-example-1.json"></a>

```
{
  "Metadata": {
    "AWS::CloudFormation::Interface": {
      "ParameterGroups": [
        {
          "Label": {"default": "Amazon Timestream for InfluxDB Configuration"},
          "Parameters": [
            "DbInstanceName",
            "InfluxDBPassword"
          ]
        }
      ],
      "ParameterLabels": {
        "VPCCIDR": {"default": "VPC CIDR"}
      }
    }
  },
  "Parameters": {
    "DbInstanceName": {
      "Description": "The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.",
      "Type": "String",
      "Default": "mydbinstance",
      "MinLength": 3,
      "MaxLength": 40,
      "AllowedPattern": "^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$"
    },
    "InfluxDBPassword": {
      "Description": "The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "NoEcho": true,
      "MinLength": 8,
      "MaxLength": 64,
      "AllowedPattern": "^[a-zA-Z0-9]+$"
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {"CidrBlock": "10.0.0.0/16"}
    },
    "InternetGateway": {"Type": "AWS::EC2::InternetGateway"},
    "InternetGatewayAttachment": {
      "Type": "AWS::EC2::VPCGatewayAttachment",
      "Properties": {
        "InternetGatewayId": {"Ref": "InternetGateway"},
        "VpcId": {"Ref": "VPC"}
      }
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            0,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            0,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": true
      }
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            1,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            1,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": true
      }
    },
    "RouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "Properties": {
        "VpcId": {"Ref": "VPC"}
      }
    },
    "DefaultRoute": {
      "Type": "AWS::EC2::Route",
      "DependsOn": "InternetGatewayAttachment",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {"Ref": "InternetGateway"}
      }
    },
    "Subnet1RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet1"}
      }
    },
    "Subnet2RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet2"}
      }
    },
    "InfluxDBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupName": "influxdb-sg",
        "GroupDescription": "Security group allowing port 8086 ingress for InfluxDB",
        "VpcId": {"Ref": "VPC"}
      }
    },
    "InfluxDBSecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {"Ref": "InfluxDBSecurityGroup"},
        "IpProtocol": "tcp",
        "CidrIp": "0.0.0.0/0",
        "FromPort": 8086,
        "ToPort": 8086
      }
    },
    "InfluxDBLogsS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DeletionPolicy": "Retain"
    },
    "InfluxDBLogsS3BucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {"Ref": "InfluxDBLogsS3Bucket"},
        "PolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "s3:PutObject",
              "Effect": "Allow",
              "Resource": {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*"},
              "Principal": {"Service": "timestream-influxdb.amazonaws.com"}
            },
            {
              "Action": "s3:*",
              "Effect": "Deny",
              "Resource": [
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/*"},
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}"}
              ],
              "Principal": "*",
              "Condition": {
                "Bool": {"aws:SecureTransport": false}
              }
            }
          ]
        }
      }
    },
    "DbInstance": {
      "Type": "AWS::Timestream::InfluxDBInstance",
      "DependsOn": "InfluxDBLogsS3BucketPolicy",
      "Properties": {
        "AllocatedStorage": 20,
        "DbInstanceType": "db.influx.medium",
        "Name": {"Ref": "DbInstanceName"},
        "Password": {"Ref": "InfluxDBPassword"},
        "PubliclyAccessible": true,
        "DeploymentType": "WITH_MULTIAZ_STANDBY",
        "VpcSecurityGroupIds": [
          {"Ref": "InfluxDBSecurityGroup"}
        ],
        "VpcSubnetIds": [
          {"Ref": "Subnet1"},
          {"Ref": "Subnet2"}
        ],
        "LogDeliveryConfiguration": {
          "S3Configuration": {
            "BucketName": {"Ref": "InfluxDBLogsS3Bucket"},
            "Enabled": true
          }
        }
      }
    }
  },
  "Outputs": {
    "VPC": {
      "Description": "A reference to the VPC used to create network resources",
      "Value": {"Ref": "VPC"}
    },
    "Subnets": {
      "Description": "A list of the subnets created",
      "Value": {
        "Fn::Join": [
          ",",
          [
            {"Ref": "Subnet1"},
            {"Ref": "Subnet2"}
          ]
        ]
      }
    },
    "Subnet1": {
      "Description": "A reference to the subnet in the 1st Availability Zone",
      "Value": {"Ref": "Subnet1"}
    },
    "Subnet2": {
      "Description": "A reference to the subnet in the 2nd Availability Zone",
      "Value": {"Ref": "Subnet2"}
    },
    "InfluxDBSecurityGroup": {
      "Description": "Security group with port 8086 ingress rule",
      "Value": {"Ref": "InfluxDBSecurityGroup"}
    },
    "InfluxDBLogsS3Bucket": {
      "Description": "S3 Bucket containing InfluxDB logs from the DB instance",
      "Value": {"Ref": "InfluxDBLogsS3Bucket"}
    },
    "DbInstance": {
      "Description": "A reference to the Timestream for InfluxDB DB instance",
      "Value": {"Ref": "DbInstance"}
    },
    "InfluxAuthParametersSecretArn": {
      "Description": "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password.",
      "Value": {
        "Fn::GetAtt": [
          "DbInstance",
          "InfluxAuthParametersSecretArn"
        ]
      }
    },
    "Endpoint": {
      "Description": "The endpoint URL to connect to InfluxDB",
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://",
            {
              "Fn::GetAtt": [
                "DbInstance",
                "Endpoint"
              ]
            },
            ":8086"
          ]
        ]
      }
    }
  }
}
```

### YAML
<a name="scenario-timestream-influxdb-example-1.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Label:
          default: "Amazon Timestream for InfluxDB Configuration"
        Parameters:
          - DbInstanceName
          - InfluxDBPassword
    ParameterLabels:
      VPCCIDR:
        default: VPC CIDR

Parameters:
  DbInstanceName:
    Description: The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.
    Type: String
    Default: mydbinstance
    MinLength: 3
    MaxLength: 40
    AllowedPattern: ^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$
  InfluxDBPassword:
    Description: The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 64
    AllowedPattern: ^[a-zA-Z0-9]+$

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  InternetGateway:
    Type: AWS::EC2::InternetGateway
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: true
  Subnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [1, !GetAZs  '']
      CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: true
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  DefaultRoute:
    Type: AWS::EC2::Route
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet1
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet2
  InfluxDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "influxdb-sg"
      GroupDescription: "Security group allowing port 8086 ingress for InfluxDB"
      VpcId: !Ref VPC
  InfluxDBSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref InfluxDBSecurityGroup
      IpProtocol: tcp
      CidrIp: 0.0.0.0/0
      FromPort: 8086
      ToPort: 8086
  InfluxDBLogsS3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
  InfluxDBLogsS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref InfluxDBLogsS3Bucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*
            Principal:
              Service: timestream-influxdb.amazonaws.com
          - Action: "s3:*"
            Effect: Deny
            Resource:
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/*
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}
            Principal: "*"
            Condition:
              Bool:
                aws:SecureTransport: false
  DbInstance:
    Type: AWS::Timestream::InfluxDBInstance
    DependsOn: InfluxDBLogsS3BucketPolicy
    Properties:
      AllocatedStorage: 20
      DbInstanceType: db.influx.medium
      Name: !Ref DbInstanceName
      Password: !Ref InfluxDBPassword
      PubliclyAccessible: true
      DeploymentType: WITH_MULTIAZ_STANDBY
      VpcSecurityGroupIds: 
        - !Ref InfluxDBSecurityGroup
      VpcSubnetIds:
        - !Ref Subnet1
        - !Ref Subnet2
      LogDeliveryConfiguration:
        S3Configuration:
          BucketName: !Ref InfluxDBLogsS3Bucket
          Enabled: true

Outputs:
  # Network Resources
  VPC:
    Description: A reference to the VPC used to create network resources
    Value: !Ref VPC
  Subnets:
    Description: A list of the subnets created
    Value: !Join [",", [!Ref Subnet1, !Ref Subnet2]]
  Subnet1:
    Description: A reference to the subnet in the 1st Availability Zone
    Value: !Ref Subnet1
  Subnet2:
    Description: A reference to the subnet in the 2nd Availability Zone
    Value: !Ref Subnet2
  InfluxDBSecurityGroup:
    Description: Security group with port 8086 ingress rule
    Value: !Ref InfluxDBSecurityGroup

  # Timestream for InfluxDB Resources
  InfluxDBLogsS3Bucket:
    Description: S3 Bucket containing InfluxDB logs from the DB instance
    Value: !Ref InfluxDBLogsS3Bucket
  DbInstance:
    Description: A reference to the Timestream for InfluxDB DB instance
    Value: !Ref DbInstance
  InfluxAuthParametersSecretArn:
    Description: "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password."
    Value: !GetAtt DbInstance.InfluxAuthParametersSecretArn
  Endpoint:
    Description: The endpoint URL to connect to InfluxDB
    Value: !Join ["", ["https://", !GetAtt DbInstance.Endpoint, ":8086"]]
```

## Contoh yang lebih lengkap dengan parameter
<a name="scenario-timestream-influxdb-example-2"></a>

Contoh template ini secara dinamis mengubah sumber daya jaringan berdasarkan parameter yang disediakan. Parameter termasuk `PubliclyAccessible` dan`DeploymentType`.

### JSON
<a name="scenario-timestream-influxdb-example-2.json"></a>

```
{
  "Metadata": {
    "AWS::CloudFormation::Interface": {
      "ParameterGroups": [
        {
          "Label": {"default": "Network Configuration"},
          "Parameters": ["VPCCIDR"]
        },
        {
          "Label": {"default": "Amazon Timestream for InfluxDB Configuration"},
          "Parameters": [
            "DbInstanceName",
            "InfluxDBUsername",
            "InfluxDBPassword",
            "InfluxDBOrganization",
            "InfluxDBBucket",
            "DbInstanceType",
            "DbStorageType",
            "AllocatedStorage",
            "PubliclyAccessible",
            "DeploymentType"
          ]
        }
      ],
      "ParameterLabels": {
        "VPCCIDR": {"default": "VPC CIDR"}
      }
    }
  },
  "Parameters": {
    "VPCCIDR": {
      "Description": "Please enter the IP range (CIDR notation) for the new VPC",
      "Type": "String",
      "Default": "10.0.0.0/16"
    },
    "DbInstanceName": {
      "Description": "The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.",
      "Type": "String",
      "Default": "mydbinstance",
      "MinLength": 3,
      "MaxLength": 40,
      "AllowedPattern": "^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$"
    },
    "InfluxDBUsername": {
      "Description": "The username of the initial admin user created in InfluxDB. Must start with a letter and can't end with a hyphen or contain two consecutive hyphens. For example, my-user1. This username will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "Default": "admin",
      "MinLength": 1,
      "MaxLength": 64
    },
    "InfluxDBPassword": {
      "Description": "The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "NoEcho": true,
      "MinLength": 8,
      "MaxLength": 64,
      "AllowedPattern": "^[a-zA-Z0-9]+$"
    },
    "InfluxDBOrganization": {
      "Description": "The name of the initial organization for the initial admin user in InfluxDB. An InfluxDB organization is a workspace for a group of users.",
      "Type": "String",
      "Default": "org",
      "MinLength": 1,
      "MaxLength": 64
    },
    "InfluxDBBucket": {
      "Description": "The name of the initial InfluxDB bucket. All InfluxDB data is stored in a bucket. A bucket combines the concept of a database and a retention period (the duration of time that each data point persists). A bucket belongs to an organization.",
      "Type": "String",
      "Default": "bucket",
      "MinLength": 2,
      "MaxLength": 64,
      "AllowedPattern": "^[^_\\\"][^\\\"]*$"
    },
    "DeploymentType": {
      "Description": "Specifies whether the Timestream for InfluxDB is deployed as Single-AZ or with a MultiAZ Standby for High availability",
      "Type": "String",
      "Default": "WITH_MULTIAZ_STANDBY",
      "AllowedValues": [
        "SINGLE_AZ",
        "WITH_MULTIAZ_STANDBY"
      ]
    },
    "AllocatedStorage": {
      "Description": "The amount of storage to allocate for your DB storage type in GiB (gibibytes).",
      "Type": "Number",
      "Default": 400,
      "MinValue": 20,
      "MaxValue": 16384
    },
    "DbInstanceType": {
      "Description": "The Timestream for InfluxDB DB instance type to run InfluxDB on.",
      "Type": "String",
      "Default": "db.influx.medium",
      "AllowedValues": [
        "db.influx.medium",
        "db.influx.large",
        "db.influx.xlarge",
        "db.influx.2xlarge",
        "db.influx.4xlarge",
        "db.influx.8xlarge",
        "db.influx.12xlarge",
        "db.influx.16xlarge"
      ]
    },
    "DbStorageType": {
      "Description": "The Timestream for InfluxDB DB storage type to read and write InfluxDB data.",
      "Type": "String",
      "Default": "InfluxIOIncludedT1",
      "AllowedValues": [
        "InfluxIOIncludedT1",
        "InfluxIOIncludedT2",
        "InfluxIOIncludedT3"
      ]
    },
    "PubliclyAccessible": {
      "Description": "Configures the DB instance with a public IP to facilitate access.",
      "Type": "String",
      "Default": true,
      "AllowedValues": [
        true,
        false
      ]
    }
  },
  "Conditions": {
    "IsMultiAZ": {
      "Fn::Equals": [
        {"Ref": "DeploymentType"},
        "WITH_MULTIAZ_STANDBY"
      ]
    },
    "IsPublic": {
      "Fn::Equals": [
        {"Ref": "PubliclyAccessible"},
        true
      ]
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": {"Ref": "VPCCIDR"}
      }
    },
    "InternetGateway": {
      "Type": "AWS::EC2::InternetGateway",
      "Condition": "IsPublic"
    },
    "InternetGatewayAttachment": {
      "Type": "AWS::EC2::VPCGatewayAttachment",
      "Condition": "IsPublic",
      "Properties": {
        "InternetGatewayId": {"Ref": "InternetGateway"},
        "VpcId": {"Ref": "VPC"}
      }
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            0,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            0,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        }
      }
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet",
      "Condition": "IsMultiAZ",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            1,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            1,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        }
      }
    },
    "RouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "Properties": {
        "VpcId": {"Ref": "VPC"}
      }
    },
    "DefaultRoute": {
      "Type": "AWS::EC2::Route",
      "Condition": "IsPublic",
      "DependsOn": "InternetGatewayAttachment",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {"Ref": "InternetGateway"}
      }
    },
    "Subnet1RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet1"}
      }
    },
    "Subnet2RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Condition": "IsMultiAZ",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet2"}
      }
    },
    "InfluxDBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupName": "influxdb-sg",
        "GroupDescription": "Security group allowing port 8086 ingress for InfluxDB",
        "VpcId": {"Ref": "VPC"}
      }
    },
    "InfluxDBSecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {"Ref": "InfluxDBSecurityGroup"},
        "IpProtocol": "tcp",
        "CidrIp": "0.0.0.0/0",
        "FromPort": 8086,
        "ToPort": 8086
      }
    },
    "InfluxDBLogsS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DeletionPolicy": "Retain"
    },
    "InfluxDBLogsS3BucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {"Ref": "InfluxDBLogsS3Bucket"},
        "PolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "s3:PutObject",
              "Effect": "Allow",
              "Resource": {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*"},
              "Principal": {"Service": "timestream-influxdb.amazonaws.com"}
            },
            {
              "Action": "s3:*",
              "Effect": "Deny",
              "Resource": [
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/*"},
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}"}
              ],
              "Principal": "*",
              "Condition": {
                "Bool": {"aws:SecureTransport": false}
              }
            }
          ]
        }
      }
    },
    "DbInstance": {
      "Type": "AWS::Timestream::InfluxDBInstance",
      "DependsOn": "InfluxDBLogsS3BucketPolicy",
      "Properties": {
        "DbStorageType": {"Ref": "DbStorageType"},
        "AllocatedStorage": {"Ref": "AllocatedStorage"},
        "DbInstanceType": {"Ref": "DbInstanceType"},
        "Name": {"Ref": "DbInstanceName"},
        "Username": {"Ref": "InfluxDBUsername"},
        "Password": {"Ref": "InfluxDBPassword"},
        "Organization": {"Ref": "InfluxDBOrganization"},
        "Bucket": {"Ref": "InfluxDBBucket"},
        "PubliclyAccessible": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        },
        "DeploymentType": {"Ref": "DeploymentType"},
        "VpcSecurityGroupIds": [
          {"Ref": "InfluxDBSecurityGroup"}
        ],
        "VpcSubnetIds": {
          "Fn::If": [
            "IsMultiAZ",
            [
              {"Ref": "Subnet1"},
              {"Ref": "Subnet2"}
            ],
            [
              {"Ref": "Subnet1"}
            ]
          ]
        },
        "LogDeliveryConfiguration": {
          "S3Configuration": {
            "BucketName": {"Ref": "InfluxDBLogsS3Bucket"},
            "Enabled": true
          }
        }
      }
    }
  },
  "Outputs": {
    "VPC": {
      "Description": "A reference to the VPC used to create network resources",
      "Value": {"Ref": "VPC"}
    },
    "Subnets": {
      "Description": "A list of the subnets created",
      "Value": {
        "Fn::If": [
          "IsMultiAZ",
          {
            "Fn::Join": [
              ",",
              [
                {"Ref": "Subnet1"},
                {"Ref": "Subnet2"}
              ]
            ]
          },
          {"Ref": "Subnet1"}
        ]
      }
    },
    "Subnet1": {
      "Description": "A reference to the subnet in the 1st Availability Zone",
      "Value": {"Ref": "Subnet1"}
    },
    "Subnet2": {
      "Condition": "IsMultiAZ",
      "Description": "A reference to the subnet in the 2nd Availability Zone",
      "Value": {"Ref": "Subnet2"}
    },
    "InfluxDBSecurityGroup": {
      "Description": "Security group with port 8086 ingress rule",
      "Value": {"Ref": "InfluxDBSecurityGroup"}
    },
    "InfluxDBLogsS3Bucket": {
      "Description": "S3 Bucket containing InfluxDB logs from the DB instance",
      "Value": {"Ref": "InfluxDBLogsS3Bucket"}
    },
    "DbInstance": {
      "Description": "A reference to the Timestream for InfluxDB DB instance",
      "Value": {"Ref": "DbInstance"}
    },
    "InfluxAuthParametersSecretArn": {
      "Description": "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password.",
      "Value": {
        "Fn::GetAtt": [
          "DbInstance",
          "InfluxAuthParametersSecretArn"
        ]
      }
    },
    "Endpoint": {
      "Description": "The endpoint URL to connect to InfluxDB",
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://",
            {
              "Fn::GetAtt": [
                "DbInstance",
                "Endpoint"
              ]
            },
            ":8086"
          ]
        ]
      }
    }
  }
}
```

### YAML
<a name="scenario-timestream-influxdb-example-2.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: "Network Configuration"
        Parameters:
          - VPCCIDR
      -
        Label:
          default: "Amazon Timestream for InfluxDB Configuration"
        Parameters:
          - DbInstanceName
          - InfluxDBUsername
          - InfluxDBPassword
          - InfluxDBOrganization
          - InfluxDBBucket
          - DbInstanceType
          - DbStorageType
          - AllocatedStorage
          - PubliclyAccessible
          - DeploymentType
    ParameterLabels:
      VPCCIDR:
        default: VPC CIDR

Parameters:
  # Network Configuration
  VPCCIDR:
    Description: Please enter the IP range (CIDR notation) for the new VPC
    Type: String
    Default: 10.0.0.0/16
  # Timestream for InfluxDB Configuration
  DbInstanceName:
    Description: The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.
    Type: String
    Default: mydbinstance
    MinLength: 3
    MaxLength: 40    
    AllowedPattern: ^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$
  # InfluxDB initial user configurations
  InfluxDBUsername:
    Description: The username of the initial admin user created in InfluxDB. Must start with a letter and can't end with a hyphen or contain two consecutive hyphens. For example, my-user1. This username will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.
    Type: String
    Default: admin
    MinLength: 1
    MaxLength: 64
  InfluxDBPassword:
    Description: The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS in your account.
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 64
    AllowedPattern: ^[a-zA-Z0-9]+$
  InfluxDBOrganization:
    Description: The name of the initial organization for the initial admin user in InfluxDB. An InfluxDB organization is a workspace for a group of users.
    Type: String
    Default: org
    MinLength: 1
    MaxLength: 64
  InfluxDBBucket:
    Description: The name of the initial InfluxDB bucket. All InfluxDB data is stored in a bucket. A bucket combines the concept of a database and a retention period (the duration of time that each data point persists). A bucket belongs to an organization.
    Type: String
    Default: bucket
    MinLength: 2
    MaxLength: 64
    AllowedPattern: ^[^_\"][^\"]*$
  DeploymentType:
    Description: Specifies whether the Timestream for InfluxDB is deployed as Single-AZ or with a MultiAZ Standby for High availability
    Type: String
    Default: WITH_MULTIAZ_STANDBY
    AllowedValues:
      - SINGLE_AZ
      - WITH_MULTIAZ_STANDBY
  AllocatedStorage:
    Description: The amount of storage to allocate for your DB storage type in GiB (gibibytes).
    Type: Number
    Default: 400
    MinValue: 20
    MaxValue: 16384
  DbInstanceType:
    Description: The Timestream for InfluxDB DB instance type to run InfluxDB on.
    Type: String
    Default: db.influx.medium
    AllowedValues:
      - db.influx.medium
      - db.influx.large
      - db.influx.xlarge
      - db.influx.2xlarge
      - db.influx.4xlarge
      - db.influx.8xlarge
      - db.influx.12xlarge
      - db.influx.16xlarge
  DbStorageType:
    Description: The Timestream for InfluxDB DB storage type to read and write InfluxDB data.
    Type: String
    Default: InfluxIOIncludedT1
    AllowedValues:
      - InfluxIOIncludedT1
      - InfluxIOIncludedT2
      - InfluxIOIncludedT3
  PubliclyAccessible:
    Description: Configures the DB instance with a public IP to facilitate access.
    Type: String
    Default: true
    AllowedValues:
      - true
      - false

Conditions:
  IsMultiAZ: !Equals [!Ref DeploymentType, WITH_MULTIAZ_STANDBY]
  IsPublic: !Equals [!Ref PubliclyAccessible, true]

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCIDR
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Condition: IsPublic
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Condition: IsPublic
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: !If [IsPublic, true, false]
  Subnet2:
    Type: AWS::EC2::Subnet
    Condition: IsMultiAZ
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [1, !GetAZs  '']
      CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: !If [IsPublic, true, false]
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  DefaultRoute:
    Type: AWS::EC2::Route
    Condition: IsPublic
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet1
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Condition: IsMultiAZ
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet2
  InfluxDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "influxdb-sg"
      GroupDescription: "Security group allowing port 8086 ingress for InfluxDB"
      VpcId: !Ref VPC
  InfluxDBSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref InfluxDBSecurityGroup
      IpProtocol: tcp
      CidrIp: 0.0.0.0/0
      FromPort: 8086
      ToPort: 8086
  InfluxDBLogsS3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
  InfluxDBLogsS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref InfluxDBLogsS3Bucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*
            Principal:
              Service: timestream-influxdb.amazonaws.com
          - Action: "s3:*"
            Effect: Deny
            Resource:
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/*
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}
            Principal: "*"
            Condition:
              Bool:
                aws:SecureTransport: false
  DbInstance:
    Type: AWS::Timestream::InfluxDBInstance
    DependsOn: InfluxDBLogsS3BucketPolicy
    Properties:
      DbStorageType: !Ref DbStorageType
      AllocatedStorage: !Ref AllocatedStorage
      DbInstanceType: !Ref DbInstanceType
      Name: !Ref DbInstanceName
      Username: !Ref InfluxDBUsername
      Password: !Ref InfluxDBPassword
      Organization: !Ref InfluxDBOrganization
      Bucket: !Ref InfluxDBBucket
      PubliclyAccessible: !If [IsPublic, true, false]
      DeploymentType: !Ref DeploymentType
      VpcSecurityGroupIds: 
        - !Ref InfluxDBSecurityGroup
      VpcSubnetIds: !If
        - IsMultiAZ
        -
          - !Ref Subnet1
          - !Ref Subnet2
        -
          - !Ref Subnet1
      LogDeliveryConfiguration:
        S3Configuration:
          BucketName: !Ref InfluxDBLogsS3Bucket
          Enabled: true

Outputs:
  # Network Resources
  VPC:
    Description: A reference to the VPC used to create network resources
    Value: !Ref VPC
  Subnets:
    Description: A list of the subnets created
    Value: !If
      - IsMultiAZ
      - !Join [",", [!Ref Subnet1, !Ref Subnet2]]
      - !Ref Subnet1
  Subnet1:
    Description: A reference to the subnet in the 1st Availability Zone
    Value: !Ref Subnet1
  Subnet2:
    Condition: IsMultiAZ
    Description: A reference to the subnet in the 2nd Availability Zone
    Value: !Ref Subnet2
  InfluxDBSecurityGroup:
    Description: Security group with port 8086 ingress rule
    Value: !Ref InfluxDBSecurityGroup

  # Timestream for InfluxDB Resources
  InfluxDBLogsS3Bucket:
    Description: S3 Bucket containing InfluxDB logs from the DB instance
    Value: !Ref InfluxDBLogsS3Bucket
  DbInstance:
    Description: A reference to the Timestream for InfluxDB DB instance
    Value: !Ref DbInstance
  InfluxAuthParametersSecretArn:
    Description: "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password."
    Value: !GetAtt DbInstance.InfluxAuthParametersSecretArn
  Endpoint:
    Description: The endpoint URL to connect to InfluxDB
    Value: !Join ["", ["https://", !GetAtt DbInstance.Endpoint, ":8086"]]
```

# Menyebarkan tumpukan Windows berbasis menggunakan CloudFormation
<a name="cfn-windows-stacks"></a>

Halaman ini menyediakan tautan ke dokumentasi referensi teknis untuk CloudFormation sumber daya yang biasa digunakan dalam penerapan Windows berbasis.

CloudFormation memberikan dukungan untuk menyebarkan dan mengelola Microsoft Windows tumpukan melalui. Infrastructure as Code (IaC) Anda dapat menggunakan CloudFormation untuk penyediaan otomatis instans EC2 Windows berbasis, di SQL Server Amazon RDS, dan melalui. Microsoft Active Directory Directory Service

AWS menyediakan Gambar Mesin Amazon yang telah dikonfigurasi sebelumnya (AMIs) yang dirancang khusus untuk Windows platform untuk membantu Anda menerapkan aplikasi dengan cepat di Amazon EC2. Ini AMIs termasuk Microsoft pengaturan default dan penyesuaian AWS-spesifik. Dengan CloudFormation, Anda dapat memilih AMI yang sesuai, meluncurkan instance, dan mengaksesnya menggunakan Remote Desktop Connection, seperti yang Anda lakukan dengan yang lainWindows Server. Ini AMIs berisi komponen perangkat lunak penting, termasuk EC2Launch (versi bervariasi menurut Windows Server edisi),, AWS Systems Manager, CloudFormation, Alat AWS untuk PowerShell, dan berbagai driver jaringan, penyimpanan, dan grafis untuk memastikan kinerja dan kompatibilitas yang optimal dengan AWS layanan. Untuk informasi selengkapnya, lihat [Referensi AWSWindows AMI](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html).

CloudFormation juga mendukung alat konfigurasi perangkat lunak, seperti `UserData` skrip, yang dapat menjalankan PowerShell atau perintah batch ketika instance EC2 pertama kali boot up. Ini juga menawarkan skrip pembantu (`cfn-init`,, `cfn-signal``cfn-get-metadata`, dan`cfn-hup`) dan mendukung `AWS::CloudFormation::Init` metadata untuk mengelola paket, file, dan layanan pada instance. Windows

Untuk lingkungan perusahaan, CloudFormation memungkinkan penggabungan domain, manajemen Windows lisensi melalui model lisensi EC2, dan penanganan kredensi yang aman dengan. AWS Secrets Manager Dikombinasikan dengan template yang dikontrol versi dan penerapan berulang, CloudFormation membantu organisasi mempertahankan lingkungan yang konsisten, aman, dan dapat diskalakan di beberapa akun dan akunWindows. Wilayah AWS 

Untuk detail tentang CloudFormation sumber daya yang biasa digunakan dalam penerapan Windows berbasis, lihat topik referensi teknis berikut.


| Tipe sumber daya | Deskripsi | 
| --- | --- | 
|  [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)  |  Untuk meluncurkan instans Windows EC2.  | 
|  [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)  |  Untuk menentukan aturan firewall untuk Windows beban kerja.  | 
|  [AWS::AutoScaling::AutoScalingKelompok](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)  |  Untuk penskalaan instans Windows EC2.  | 
|  [AWS::DirectoryService::MicrosoftIKLAN](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html)  |  Untuk menyebarkan MicrosoftActive Directory.  | 
|  [AWS::FSx::FileSystem](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-fsx-filesystem.html)  |  Untuk menyebarkan FSx untuk Windows File Server.  | 
|  [AWS: :RDS:: DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)  |  Untuk penyediaan di SQL Server Amazon RDS.  | 
|  [AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html)  |  Digunakan dalam metadata EC2 untuk mengkonfigurasi instance.  Untuk informasi selengkapnya, lihat [Tumpukan berbasis bootstrap Windows CloudFormation](cfn-windows-stacks-bootstrapping.md).  | 
|  [AWS::SecretsManager::Secret](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-secretsmanager-secret.html)  |  Untuk mengelola kredensi dan kata sandi dengan aman. Windows  | 
|  [AWS::SSM::Parameter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ssm-parameter.html)  |  Untuk menyimpan nilai konfigurasi dengan aman.  | 
|  [AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-instanceprofile.html) [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)  |  Untuk memberikan izin ke aplikasi yang berjalan pada instans EC2.  | 

# Tumpukan berbasis bootstrap Windows CloudFormation
<a name="cfn-windows-stacks-bootstrapping"></a>

Topik ini menjelaskan cara mem-bootstrap Windows tumpukan dan memecahkan masalah pembuatan tumpukan. 

**Topics**
+ [Data pengguna dalam instans EC2](#cfn-windows-bootstrapping-user-data)
+ [CloudFormation skrip pembantu](#cfn-windows-bootstrapping-helper-scripts)
+ [Contoh bootstrap tumpukan Windows](#cfn-windows-bootstrapping-example)
+ [Melarikan diri dari garis miring terbalik di jalur file Windows](#cfn-windows-stacks-escape-backslashes)
+ [Kelola Windows layanan](#cfn-windows-stacks-manage-windows-services)
+ [Memecahkan masalah pembuatan tumpukan](#cfn-windows-stacks-troubleshooting)

## Data pengguna dalam instans EC2
<a name="cfn-windows-bootstrapping-user-data"></a>

Data pengguna adalah fitur Amazon EC2 yang memungkinkan Anda meneruskan skrip atau informasi konfigurasi ke instans EC2 saat diluncurkan. 

Untuk instans Windows EC2:
+ Anda dapat menggunakan skrip batch (menggunakan `<script>` tag) atau PowerShell skrip (menggunakan `<powershell>` tag).
+ Eksekusi skrip ditangani olehEC2Launch.

**penting**  
Jika Anda membuat Windows AMI sendiri untuk digunakan CloudFormation, pastikan EC2Launch v2 dikonfigurasi dengan benar. EC2Launchv2 diperlukan untuk alat CloudFormation bootstrap untuk menginisialisasi dan mengonfigurasi Windows instance dengan benar selama pembuatan tumpukan. Untuk informasi selengkapnya, lihat [Menggunakan agen EC2Launch v2 untuk melakukan tugas selama peluncuran instans Windows EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html) di Panduan Pengguna *Amazon EC2*.  
Untuk selengkapnya AWS Windows AMIs, lihat [Referensi AWSWindows AMI](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html).

## CloudFormation skrip pembantu
<a name="cfn-windows-bootstrapping-helper-scripts"></a>

Skrip pembantu adalah utilitas untuk mengkonfigurasi instance selama proses bootstrap. Digunakan dengan data pengguna Amazon EC2, mereka menyediakan opsi konfigurasi yang kuat.

CloudFormation menyediakan skrip pembantu Python berikut yang dapat Anda gunakan untuk menginstal perangkat lunak dan memulai layanan pada instans Amazon EC2 yang Anda buat sebagai bagian dari tumpukan Anda:
+  `cfn-init`— Gunakan untuk mengambil dan menafsirkan metadata sumber daya, menginstal paket, membuat file, dan memulai layanan.
+  `cfn-signal`— Gunakan untuk memberi sinyal dengan`CreationPolicy`, sehingga Anda dapat menyinkronkan sumber daya lain di tumpukan saat sumber daya atau aplikasi prasyarat siap.
+  `cfn-get-metadata`— Gunakan untuk mengambil metadata untuk sumber daya atau jalur ke kunci tertentu.
+  `cfn-hup`— Gunakan untuk memeriksa pembaruan metadata dan menjalankan kait khusus saat perubahan terdeteksi.

Anda memanggil skrip langsung dari templat Anda. Skrip bekerja bersama dengan metadata sumber daya yang didefinisikan dalam templat yang sama. Skrip berjalan di instans Amazon EC2 selama proses pembuatan tumpukan.

Untuk informasi selengkapnya, lihat [referensi skrip CloudFormation pembantu di Panduan Referensi CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) *Template*.

## Contoh bootstrap tumpukan Windows
<a name="cfn-windows-bootstrapping-example"></a>

Mari kita periksa contoh cuplikan dari Windows Server template yang melakukan tindakan berikut:
+ Meluncurkan instans EC2 bernama `TestInstance` dari Windows Server AMI 2022.
+ Membuat file uji sederhana untuk memverifikasi `cfn-init` berfungsi.
+ Mengkonfigurasi `cfn-hup` untuk manajemen konfigurasi yang sedang berlangsung.
+ Menggunakan a `CreationPolicy` untuk memastikan sinyal instance berhasil diselesaikan.

Skrip `cfn-init` pembantu digunakan untuk melakukan setiap tindakan ini berdasarkan informasi dalam `AWS::CloudFormation::Init` sumber daya dalam template.

`AWS::CloudFormation::Init`Bagian ini diberi nama `TestInstance` dan dimulai dengan deklarasi berikut.

```
TestInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      configSets:
        default:
          - create_files
          - start_services
```

Setelah ini, `files` bagian dari `AWS::CloudFormation::Init` dideklarasikan.

```
      create_files:
        files:
          c:\cfn\test.txt:
            content: !Sub |
              Hello from ${AWS::StackName}
          c:\cfn\cfn-hup.conf:
            content: !Sub |
              [main]
              stack=${AWS::StackName}
              region=${AWS::Region}
              interval=2
          c:\cfn\hooks.d\cfn-auto-reloader.conf:
            content: !Sub |
              [cfn-auto-reloader-hook]
              triggers=post.update
              path=Resources.TestInstance.Metadata.AWS::CloudFormation::Init
              action=cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
```

Tiga file dibuat di sini dan ditempatkan di `C:\cfn` direktori pada instance server:
+ `test.txt`, file uji sederhana yang memverifikasi `cfn-init` berfungsi dengan benar dan dapat membuat file dengan konten dinamis.
+ `cfn-hup.conf`, file konfigurasi untuk `cfn-hup` dengan interval pemeriksaan 2 menit.
+ `cfn-auto-reloader.conf`, file konfigurasi untuk hook yang digunakan oleh `cfn-hup` untuk memulai pembaruan (panggilan`cfn-init`) saat metadata berubah. `AWS::CloudFormation::Init`

Berikutnya adalah `start_services` bagian, yang mengkonfigurasi Windows layanan.

```
      start_services:
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

Bagian ini memastikan bahwa `cfn-hup` layanan dimulai dan akan secara otomatis restart jika file konfigurasi dimodifikasi. Layanan memantau perubahan CloudFormation metadata dan berjalan kembali `cfn-init` saat pembaruan terdeteksi.

Selanjutnya adalah `Properties` bagian.

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Metadata:
    AWS::CloudFormation::Init:
      # ... metadata configuration ...
  Properties:
    InstanceType: t2.large
    ImageId: '{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base}}'
    SecurityGroupIds:
      - !Ref InstanceSecurityGroup
    KeyName: !Ref KeyPairName
    UserData:
      Fn::Base64: !Sub |
        <powershell>
        cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
        cfn-signal.exe -e $lastexitcode --stack ${AWS::StackName} --resource TestInstance --region ${AWS::Region}
        </powershell>
```

Di bagian ini, `UserData` properti berisi PowerShell skrip yang akan dieksekusi olehEC2Launch, dikelilingi oleh `<powershell>` tag. Skrip berjalan `cfn-init` dengan `default` ConfigSet, kemudian `cfn-signal` digunakan untuk melaporkan kode keluar kembali ke. CloudFormation `CreationPolicy`Ini digunakan untuk memastikan instance dikonfigurasi dengan benar sebelum pembuatan tumpukan dianggap selesai.

`ImageId`Properti menggunakan parameter publik Systems Manager Parameter Store untuk secara otomatis mengambil ID AMI Windows Server 2022 terbaru. Pendekatan ini menghilangkan kebutuhan untuk pemetaan AMI khusus wilayah dan memastikan Anda selalu mendapatkan AMI terbaru. Menggunakan parameter Systems Manager untuk AMI IDs adalah praktik terbaik untuk mempertahankan referensi AMI saat ini. Jika Anda berencana untuk terhubung ke instans Anda, pastikan `SecurityGroupIds` properti mereferensikan grup keamanan yang memungkinkan akses RDP.

`CreationPolicy`Ini dideklarasikan sebagai bagian dari properti sumber daya dan menentukan periode batas waktu. `cfn-signal`Perintah dalam sinyal data pengguna saat konfigurasi instance selesai:

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Properties:
    # ... other properties ...
```

Karena proses bootstrap minimal dan hanya membuat file dan memulai layanan, `CreationPolicy` menunggu 20 menit (PT20M) sebelum waktu habis. Batas waktu ditentukan menggunakan format durasi ISO 8601. Perhatikan bahwa Windows instance umumnya membutuhkan waktu lebih lama untuk diluncurkan daripada instance Linux, jadi uji secara menyeluruh untuk menentukan nilai batas waktu terbaik untuk kebutuhan Anda.

Jika semuanya berjalan dengan baik, `CreationPolicy` selesai berhasil dan Anda dapat mengakses Windows Server instance menggunakan alamat IP publiknya. Setelah pembuatan tumpukan selesai, ID instance dan alamat IP publik akan ditampilkan di tab **Output** CloudFormation konsol. 

```
Outputs:
  InstanceId:
    Value: !Ref TestInstance
    Description: Instance ID of the Windows Server
  PublicIP:
    Value: !GetAtt TestInstance.PublicIp
    Description: Public IP address of the Windows Server
```

Anda juga dapat memverifikasi secara manual bahwa bootstrap bekerja dengan benar dengan menghubungkan ke instance melalui RDP dan memeriksa apakah file tersebut `C:\cfn\test.txt` ada dan berisi konten yang diharapkan. Untuk informasi selengkapnya tentang menghubungkan ke Windows instans, lihat [Connect ke Windows instans menggunakan RDP di Panduan](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connecting_to_windows_instance.html) Pengguna *Amazon* EC2.

## Melarikan diri dari garis miring terbalik di jalur file Windows
<a name="cfn-windows-stacks-escape-backslashes"></a>

Saat mereferensikan Windows jalur dalam CloudFormation template, selalu ingat untuk menghindari garis miring terbalik (`\`) dengan benar sesuai dengan format templat yang Anda gunakan.
+ Untuk template JSON, Anda harus menggunakan garis miring terbalik ganda di jalur Windows file karena JSON memperlakukan garis miring terbalik sebagai karakter pelarian. Garis miring terbalik pertama lolos dari garis miring kedua, menghasilkan interpretasi garis miring terbalik tunggal.

  ```
  "commands" : {
    "1-extract" : {
      "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
    }
  }
  ```
+ Untuk template YAMAL, garis miring terbalik tunggal biasanya cukup.

  ```
  commands:
    1-extract:
      command: C:\SharePoint\SharePointFoundation2010.exe /extract:C:\SharePoint\SPF2010 /quiet /log:C:\SharePoint\SharePointFoundation2010-extract.log
  ```

## Kelola Windows layanan
<a name="cfn-windows-stacks-manage-windows-services"></a>

Anda mengelola Windows layanan dengan cara yang sama seperti layanan Linux, kecuali bahwa Anda menggunakan `windows` kunci alih-alih`sysvinit`. Contoh berikut memulai `cfn-hup` layanan, menyetelnya ke Otomatis, dan memulai ulang layanan jika `cfn-init` memodifikasi `c:\cfn\cfn-hup.conf` atau file `c:\cfn\hooks.d\cfn-auto-reloader.conf` konfigurasi.

```
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

Anda dapat mengelola Windows layanan lain dengan cara yang sama dengan menggunakan nama, bukan nama tampilan, untuk mereferensikan layanan.

## Memecahkan masalah pembuatan tumpukan
<a name="cfn-windows-stacks-troubleshooting"></a>

Jika tumpukan Anda gagal selama pembuatan, perilaku defaultnya adalah mengembalikan kegagalan. Meskipun ini biasanya merupakan default yang baik karena menghindari biaya yang tidak perlu, ini menyulitkan untuk men-debug mengapa pembuatan tumpukan Anda gagal.

Untuk menonaktifkan perilaku ini saat membuat atau memperbarui tumpukan Anda dengan CloudFormation konsol, pilih opsi **Pertahankan sumber daya yang berhasil disediakan** di bawah opsi **Kegagalan tumpukan**. Untuk informasi selengkapnya, lihat [Pilih cara menangani kegagalan saat menyediakan sumber daya](stack-failure-options.md). Ini memungkinkan Anda untuk masuk ke instance Anda dan melihat file log untuk menentukan masalah yang dihadapi saat menjalankan skrip startup Anda.

Log penting yang perlu dilihat adalah:
+ Log konfigurasi EC2 pada `%ProgramData%\Amazon\EC2Launch\log\agent.log`
+ **cfn-init**Log di `C:\cfn\log\cfn-init.log` (periksa kode keluar dan pesan kesalahan untuk titik kegagalan tertentu)

Untuk log lainnya, lihat topik berikut di *Panduan Pengguna Amazon EC2:*
+ [EC2Launchstruktur direktori](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2config-service.html#UsingConfigXML_WinAMI)
+ [EC2Launchstruktur direktori v2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html#ec2launch-v2-directory)

Untuk informasi selengkapnya tentang pemecahan masalah bootstrap, lihat [Bagaimana cara memecahkan masalah skrip pembantu yang tidak akan di-bootstrap dalam tumpukan dengan instance? CloudFormation Windows](https://repost.aws/knowledge-center/cloudformation-helper-scripts-windows) .

# Perluas kemampuan template Anda dengan CloudFormation tipe sumber daya yang disediakan
<a name="cloudformation-supplied-resource-types"></a>

CloudFormation menawarkan beberapa jenis sumber daya yang dapat Anda gunakan dalam template tumpukan Anda untuk memperluas kemampuannya di luar template tumpukan sederhana.

Jenis sumber daya ini meliputi:


| Tipe sumber daya | Deskripsi | Dokumentasi | 
| --- | --- | --- | 
|  Sumber daya khusus  |  Jenis `AWS::CloudFormation::CustomResource` sumber daya memungkinkan Anda membuat sumber daya khusus yang dapat melakukan tugas penyediaan tertentu atau menyertakan sumber daya yang tidak tersedia sebagai jenis CloudFormation sumber daya.  |  [Sumber daya khusus](template-custom-resources.md) | 
|  Makro  |  Jenis `AWS::CloudFormation::Macro` sumber daya mendefinisikan potongan kode yang dapat digunakan kembali yang dapat melakukan pemrosesan khusus pada CloudFormation templat. Makro dapat memodifikasi template Anda, menghasilkan sumber daya tambahan, atau melakukan operasi kustom lainnya selama pembuatan tumpukan atau pembaruan.  | [Makro templat](template-macros.md) | 
|  Tumpukan nested  |  Jenis `AWS::CloudFormation::Stack` sumber daya memungkinkan Anda membuat tumpukan bersarang di dalam CloudFormation templat Anda untuk arsitektur tumpukan yang lebih modular dan dapat digunakan kembali.  | [Tumpukan nested](using-cfn-nested-stacks.md) | 
|  StackSet  |  Jenis `AWS::CloudFormation::StackSet` sumber daya membuat atau memperbarui a CloudFormation StackSet, yang merupakan wadah untuk tumpukan yang dapat digunakan di beberapa Akun AWS dan Wilayah.  | [Mengelola tumpukan dengan StackSets](what-is-cfnstacksets.md) | 
|  Kondisi menunggu  |  Jenis `AWS::CloudFormation::WaitCondition` sumber daya menghentikan pembuatan tumpukan atau pembaruan hingga kondisi tertentu terpenuhi, seperti keberhasilan penyelesaian proses yang berjalan lama atau ketersediaan sumber daya eksternal.   | [Ketentuan tunggu](using-cfn-waitcondition.md) | 
|  Tunggu kondisi pegangan  |  Jenis `AWS::CloudFormation::WaitConditionHandle` sumber daya bekerja sama dengan tipe `AWS::CloudFormation::WaitCondition` sumber daya. Ini menyediakan URL presigned yang digunakan untuk mengirim sinyal yang menunjukkan bahwa kondisi tertentu telah terpenuhi. Sinyal-sinyal ini memungkinkan pembuatan tumpukan atau proses pembaruan untuk dilanjutkan.  | [Ketentuan tunggu](using-cfn-waitcondition.md) | 

# Buat logika penyediaan khusus dengan sumber daya khusus
<a name="template-custom-resources"></a>

Sumber daya khusus menyediakan cara bagi Anda untuk menulis logika penyediaan khusus ke dalam CloudFormation templat Anda dan CloudFormation menjalankannya kapan saja Anda membuat, memperbarui (jika Anda mengubah sumber daya khusus), atau menghapus tumpukan. Ini dapat berguna ketika persyaratan penyediaan Anda melibatkan logika kompleks atau alur kerja yang tidak dapat diekspresikan dengan CloudFormation tipe sumber daya bawaan.

Misalnya, Anda mungkin ingin menyertakan sumber daya yang tidak tersedia sebagai tipe CloudFormation sumber daya. Anda dapat menyertakan sumber daya tersebut dengan menggunakan sumber daya kustom. Dengan begitu, Anda masih dapat mengelola semua sumber daya terkait Anda dalam satu tumpukan.

Untuk menentukan sumber daya kustom dalam CloudFormation template Anda, Anda menggunakan `AWS::CloudFormation::CustomResource` atau jenis `Custom::MyCustomResourceTypeName` sumber daya. Sumber daya khusus memerlukan satu properti, token layanan, yang menentukan ke mana permintaan CloudFormation dikirim, seperti topik Amazon SNS atau fungsi Lambda.

Topik berikut memberikan informasi tentang cara menggunakan sumber daya khusus.

**Topics**
+ [Cara kerja sumber daya kustom](#how-custom-resources-work)
+ [Batas waktu respons](#response-timeout)
+ [CloudFormation permintaan sumber daya kustom dan referensi respons](crpg-ref.md)
+ [Sumber daya khusus yang didukung Amazon SNS](template-custom-resources-sns.md)
+ [Sumber daya khusus yang didukung Lambda](template-custom-resources-lambda.md)

**catatan**  
 CloudFormation Registri dan sumber daya khusus masing-masing menawarkan manfaatnya sendiri. Sumber daya khusus menawarkan manfaat berikut:  
Anda tidak perlu mendaftarkan sumber daya.
Anda dapat menyertakan seluruh sumber daya sebagai bagian dari templat tanpa mendaftar.
Mendukung`Create`,`Update`, dan `Delete` operasi
Keuntungan yang ditawarkan sumber daya berbasis registri meliputi:  
Mendukung pemodelan, penyediaan, dan pengelolaan sumber daya aplikasi pihak ketiga
Mendukung operasi `Create`, `Read`, `Update`, `Delete`, dan `List` (`CRUDL`)
Mendukung deteksi penyimpangan pada jenis sumber daya privat dan pihak ketiga
Tidak seperti sumber daya khusus, sumber daya berbasis registri tidak perlu mengaitkan topik Amazon SNS atau fungsi Lambda untuk melakukan operasi. `CRUDL` Untuk informasi selengkapnya, lihat [Mengelola ekstensi dengan CloudFormation registri](registry.md).

## Cara kerja sumber daya kustom
<a name="how-custom-resources-work"></a>

Proses umum untuk menyiapkan sumber daya kustom baru mencakup langkah-langkah berikut. Langkah-langkah ini melibatkan dua peran: *penyedia sumber daya kustom* yang memiliki sumber daya kustom dan *pengembang template* yang membuat template yang menyertakan jenis sumber daya kustom. Ini bisa menjadi orang yang sama, tetapi jika tidak, penyedia sumber daya khusus harus bekerja dengan pengembang template.

1. Penyedia sumber daya kustom menulis logika yang menentukan cara menangani permintaan dari CloudFormation dan melakukan tindakan pada sumber daya kustom. 

1. Penyedia sumber daya khusus membuat topik Amazon SNS atau fungsi Lambda tempat CloudFormation dapat mengirim permintaan. Topik Amazon SNS atau fungsi Lambda harus berada di Wilayah yang sama tempat tumpukan akan dibuat.

1. Penyedia sumber daya khusus memberikan ARN topik Amazon SNS atau ARN fungsi Lambda kepada pengembang template.

1. Pengembang template mendefinisikan sumber daya kustom dalam CloudFormation template mereka. Ini termasuk token layanan dan parameter data input apa pun. Token layanan dan struktur data input ditentukan oleh penyedia sumber daya khusus. Token layanan menentukan topik Amazon SNS ARN atau fungsi Lambda ARN dan selalu diperlukan, tetapi data input bersifat opsional tergantung pada sumber daya khusus.

Sekarang, setiap kali ada yang menggunakan template untuk membuat, memperbarui, atau menghapus sumber daya kustom, CloudFormation mengirimkan permintaan ke token layanan yang ditentukan, dan kemudian menunggu respons sebelum melanjutkan dengan operasi tumpukan. 

Berikut ini merangkum alur untuk membuat tumpukan dari template: 

1. CloudFormation mengirimkan permintaan ke token layanan yang ditentukan. Permintaan tersebut mencakup informasi seperti jenis permintaan dan URL bucket Amazon S3 yang telah ditandatangani sebelumnya, tempat sumber daya kustom mengirimkan tanggapan. Untuk informasi selengkapnya tentang apa saja yang disertakan dalam permintaan, lihat [CloudFormation permintaan sumber daya kustom dan referensi respons](crpg-ref.md).

   Data sampel berikut menunjukkan apa yang CloudFormation termasuk dalam `Create` permintaan. Dalam contoh ini, `ResourceProperties` memungkinkan CloudFormation untuk membuat payload khusus untuk dikirim ke fungsi Lambda.

   ```
   {
      "RequestType" : "Create",
      "RequestId" : "unique id for this create request",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::TestResource",
      "LogicalResourceId" : "MyTestResource",
      "ResourceProperties" : {
         "Name" : "Value",
         "List" : [ "1", "2", "3" ]
      }
   }
   ```

1. Penyedia sumber daya kustom memproses CloudFormation permintaan dan mengembalikan respons `SUCCESS` atau `FAILED` ke URL yang telah ditandatangani sebelumnya. Penyedia sumber daya khusus memberikan respons dalam file berformat JSON dan mengunggahnya ke URL S3 yang telah ditandatangani sebelumnya. Untuk informasi selengkapnya, lihat [Mengunggah objek dengan presigned URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html) di *Panduan Pengguna Layanan Penyimpanan Sederhana Amazon*.

   Sebagai tanggapan, penyedia sumber daya kustom juga dapat menyertakan pasangan nama-nilai yang dapat diakses oleh pengembang template. Misalnya, respons dapat menyertakan data output jika permintaan berhasil atau pesan kesalahan jika permintaan gagal. Untuk informasi selengkapnya tentang respons, lihat [CloudFormation permintaan sumber daya kustom dan referensi respons](crpg-ref.md).
**penting**  
Jika pasangan nama-nilai berisi informasi sensitif, Anda harus menggunakan `NoEcho` bidang untuk menutupi output dari sumber daya kustom. Jika tidak, nilai terlihat melalui APIs nilai properti permukaan (seperti`DescribeStackEvents`).  
Untuk informasi selengkapnya tentang penggunaan `NoEcho` untuk menutupi informasi sensitif, lihat praktik [Jangan menanamkan kredensial dalam templat Anda](security-best-practices.md#creds) terbaik.

   Penyedia sumber daya khusus bertanggung jawab untuk mendengarkan dan menanggapi permintaan. Misalnya, untuk notifikasi Amazon SNS, penyedia sumber daya khusus harus mendengarkan dan menanggapi notifikasi yang dikirim ke topik tertentu ARN. CloudFormation menunggu dan mendengarkan respons di lokasi URL yang telah ditandatangani sebelumnya.

   Data contoh berikut menunjukkan apa yang mungkin disertakan oleh sumber daya kustom dalam respons:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique id for this create request",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MyTestResource",
      "PhysicalResourceId" : "TestResource1",
      "Data" : {
         "OutputName1" : "Value1",
         "OutputName2" : "Value2",
      }
   }
   ```

1. Setelah mendapat `SUCCESS` respons, CloudFormation lanjutkan dengan operasi tumpukan. Jika respons `FAILED` atau tidak ada respons dikembalikan, operasi gagal. Data output apa pun dari sumber daya kustom disimpan di lokasi URL pre-signed. Pengembang template dapat mengambil data tersebut dengan menggunakan fungsi [Fn:: GetAtt](resources-section-structure.md#resource-properties-getatt).

**catatan**  
Jika Anda menggunakan AWS PrivateLink, sumber daya khusus di VPC harus memiliki akses ke bucket S3 CloudFormation -spesifik. Sumber daya kustom harus mengirim respons ke URL pre-signed Amazon S3. Jika mereka tidak dapat mengirim tanggapan ke Amazon S3, tidak CloudFormation akan menerima respons dan operasi tumpukan gagal. Untuk informasi selengkapnya, lihat [Akses CloudFormation menggunakan endpoint antarmuka ()AWS PrivateLink](vpc-interface-endpoints.md).

## Batas waktu respons
<a name="response-timeout"></a>

Batas waktu default untuk sumber daya kustom Anda adalah 3600 detik (1 jam). Jika tidak ada respons yang diterima selama waktu ini, operasi tumpukan gagal.

Anda dapat menyesuaikan nilai batas waktu berdasarkan berapa lama Anda mengharapkan respons dari sumber daya kustom. Misalnya, saat menyediakan sumber daya khusus yang memanggil fungsi Lambda yang diharapkan merespons dalam waktu lima menit, Anda dapat mengatur batas waktu lima menit dalam template tumpukan dengan menentukan properti. `ServiceTimeout` Untuk informasi selengkapnya, lihat [CloudFormation permintaan sumber daya kustom dan referensi respons](crpg-ref.md). Dengan cara ini, jika ada kesalahan dalam fungsi Lambda yang menyebabkannya macet, CloudFormation akan gagal operasi tumpukan setelah lima menit alih-alih menunggu satu jam penuh. 

Namun, berhati-hatilah untuk tidak menetapkan nilai batas waktu terlalu rendah. Untuk menghindari batas waktu yang tidak terduga, pastikan sumber daya kustom Anda memiliki cukup waktu untuk melakukan tindakan yang diperlukan dan mengembalikan respons.

# CloudFormation permintaan sumber daya kustom dan referensi respons
<a name="crpg-ref"></a>

CloudFormation mengelola sumber daya kustom melalui protokol permintaan-respons yang berkomunikasi dengan penyedia sumber daya kustom Anda. Setiap permintaan menyertakan jenis permintaan (`Create`,`Update`, atau`Delete`) dan mengikuti alur kerja tingkat tinggi ini:

1. Pengembang template mendefinisikan sumber daya kustom dengan `ServiceToken` dan `ServiceTimeout` di template dan memulai operasi tumpukan.

1. CloudFormation mengirimkan permintaan JSON ke penyedia sumber daya khusus melalui SNS atau Lambda.

1. Penyedia sumber daya kustom memproses permintaan dan mengembalikan respons JSON ke URL bucket Amazon S3 yang telah ditetapkan sebelumnya sebelum periode batas waktu berakhir.

1. CloudFormation membaca respons dan melanjutkan dengan operasi tumpukan. Jika tidak ada respons yang diterima sebelum periode batas waktu berakhir, permintaan dianggap tidak berhasil, dan operasi tumpukan gagal.

Untuk informasi selengkapnya, lihat [Cara kerja sumber daya kustom](template-custom-resources.md#how-custom-resources-work).

Bagian ini menjelaskan struktur, parameter, dan respons yang diharapkan untuk setiap jenis permintaan.

**catatan**  
Ukuran total badan respons tidak dapat melebihi 4096 byte.

## Pengaturan templat
<a name="crpg-ref-template-setup"></a>

Saat mendefinisikan sumber daya kustom dalam templat, pengembang templat menggunakan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html)properti berikut:

`ServiceToken`  
Topik Amazon SNS ARN atau Lambda berfungsi ARN dari Wilayah yang sama dengan tumpukan.  
*Wajib*: Ya  
*Tipe*: String

`ServiceTimeout`  
Waktu maksimum, dalam hitungan detik, sebelum waktu operasi sumber daya kustom habis. Itu harus nilai antara 1 dan 3600. Default: 3600 detik (1 jam).  
*Wajib*: Tidak  
*Tipe*: String

Properti sumber daya tambahan didukung. Properti sumber daya akan dimasukkan seperti `ResourceProperties` dalam permintaan. Penyedia sumber daya khusus harus menentukan properti mana yang valid dan nilainya yang dapat diterima.

## Permintaan objek
<a name="crpg-ref-requesttypes"></a>

------
#### [ Create ]

Saat pengembang template membuat tumpukan yang berisi sumber daya khusus, CloudFormation kirimkan permintaan dengan `RequestType` set ke`Create`.

Buat permintaan berisi bidang berikut:

`RequestType`  
`Create`.  
*Wajib*: Ya  
*Tipe*: String

`RequestId`  
ID unik untuk permintaan tersebut.  
Menggabungkan `StackId` dengan `RequestId` formulir nilai yang dapat Anda gunakan untuk mengidentifikasi permintaan secara unik pada sumber daya khusus tertentu.  
*Wajib*: Ya  
*Tipe*: String

`StackId`  
Nama Sumber Daya Amazon (ARN) yang mengidentifikasi tumpukan yang berisi sumber daya khusus.  
Menggabungkan `StackId` dengan `RequestId` formulir nilai yang dapat Anda gunakan untuk mengidentifikasi permintaan secara unik pada sumber daya khusus tertentu.  
*Wajib*: Ya  
*Tipe*: String

`ResponseURL`  
URL respons mengidentifikasi bucket S3 yang telah ditetapkan sebelumnya yang menerima tanggapan dari penyedia sumber daya kustom ke. CloudFormation  
*Wajib*: Ya  
*Tipe*: String

`ResourceType`  
Jenis sumber daya yang dipilih developer templat dari sumber daya kustom di templat CloudFormation . Nama jenis sumber daya kustom dapat memiliki panjang hingga 60 karakter dan dapat mencakup alfanumerik dan karakter berikut: `_@-`.  
*Wajib*: Ya  
*Tipe*: String

`LogicalResourceId`  
Nama template yang dipilih pengembang (ID logis) dari sumber daya kustom dalam template. CloudFormation   
*Wajib*: Ya  
*Tipe*: String

`ResourceProperties`  
Bidang ini berisi isi `Properties` objek yang dikirim oleh pengembang template. Isinya ditentukan oleh penyedia sumber daya khusus.  
*Wajib*: Tidak  
*Jenis*: objek JSON

*Contoh*

```
{
   "RequestType" : "Create",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-create-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Update ]

Ketika pengembang template membuat perubahan pada properti sumber daya kustom dalam template dan memperbarui tumpukan, CloudFormation mengirimkan permintaan ke penyedia sumber daya kustom dengan `RequestType` set ke`Update`. Ini berarti bahwa kode sumber daya kustom Anda tidak harus mendeteksi perubahan sumber daya karena mengetahui bahwa propertinya telah berubah ketika jenis permintaan`Update`.

Permintaan Perbarui berisi bidang berikut:

`RequestType`  
`Update`.  
*Wajib*: Ya  
*Tipe*: String

`RequestId`  
ID unik untuk permintaan tersebut.  
Menggabungkan `StackId` dengan `RequestId` formulir nilai yang dapat Anda gunakan untuk mengidentifikasi permintaan secara unik pada sumber daya khusus tertentu.  
*Wajib*: Ya  
*Tipe*: String

`StackId`  
Nama Sumber Daya Amazon (ARN) yang mengidentifikasi tumpukan yang berisi sumber daya khusus.  
Menggabungkan `StackId` dengan `RequestId` formulir nilai yang dapat Anda gunakan untuk mengidentifikasi permintaan secara unik pada sumber daya khusus tertentu.  
*Wajib*: Ya  
*Tipe*: String

`ResponseURL`  
URL respons mengidentifikasi bucket S3 yang telah ditetapkan sebelumnya yang menerima tanggapan dari penyedia sumber daya kustom ke. CloudFormation  
*Wajib*: Ya  
*Tipe*: String

`ResourceType`  
Jenis sumber daya yang dipilih developer templat dari sumber daya kustom di templat CloudFormation . Nama jenis sumber daya kustom dapat memiliki panjang hingga 60 karakter dan dapat mencakup alfanumerik dan karakter berikut: `_@-`. Anda tidak dapat mengubah jenis selama pembaruan.  
*Wajib*: Ya  
*Tipe*: String

`LogicalResourceId`  
Nama template yang dipilih pengembang (ID logis) dari sumber daya kustom dalam template. CloudFormation   
*Wajib*: Ya  
*Tipe*: String

`PhysicalResourceId`  
ID fisik yang ditentukan penyedia sumber daya khusus yang unik untuk penyedia tersebut.  
*Wajib*: Ya  
*Tipe*: String

`ResourceProperties`  
Bidang ini berisi isi `Properties` objek yang dikirim oleh pengembang template. Isinya ditentukan oleh penyedia sumber daya khusus.  
*Wajib*: Tidak  
*Jenis*: objek JSON

`OldResourceProperties`  
Digunakan hanya untuk `Update` permintaan. Nilai properti sumber daya yang sebelumnya dideklarasikan oleh pengembang template dalam CloudFormation template.  
*Wajib*: Ya  
*Jenis*: objek JSON

*Contoh*

```
{
   "RequestType" : "Update",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-update-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "new-string",
      "key2" : [ "new-list" ],
      "key3" : { "key4" : "new-map" }
   },
   "OldResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Delete ]

Ketika pengembang template menghapus tumpukan atau menghapus sumber daya kustom dari template dan kemudian memperbarui tumpukan, CloudFormation mengirimkan permintaan dengan `RequestType` set ke`Delete`.

Hapus permintaan berisi bidang berikut:

`RequestType`  
`Delete`.  
*Wajib*: Ya  
*Tipe*: String

`RequestId`  
ID unik untuk permintaan tersebut.  
*Wajib*: Ya  
*Tipe*: String

`StackId`  
Nama Sumber Daya Amazon (ARN) yang mengidentifikasi tumpukan yang berisi sumber daya khusus.  
*Wajib*: Ya  
*Tipe*: String

`ResponseURL`  
URL respons mengidentifikasi bucket S3 yang telah ditetapkan sebelumnya yang menerima tanggapan dari penyedia sumber daya kustom ke. CloudFormation  
*Wajib*: Ya  
*Tipe*: String

`ResourceType`  
Jenis sumber daya yang dipilih developer templat dari sumber daya kustom di templat CloudFormation . Nama jenis sumber daya kustom dapat memiliki panjang hingga 60 karakter dan dapat mencakup alfanumerik dan karakter berikut: `_@-`.  
*Wajib*: Ya  
*Tipe*: String

`LogicalResourceId`  
Nama template yang dipilih pengembang (ID logis) dari sumber daya kustom dalam template. CloudFormation   
*Wajib*: Ya  
*Tipe*: String

`PhysicalResourceId`  
ID fisik yang ditentukan penyedia sumber daya khusus yang unik untuk penyedia tersebut.  
*Wajib*: Ya  
*Tipe*: String

`ResourceProperties`  
Bidang ini berisi isi `Properties` objek yang dikirim oleh pengembang template. Isinya ditentukan oleh penyedia sumber daya khusus.  
*Wajib*: Tidak  
*Jenis*: objek JSON

*Contoh*

```
{
   "RequestType" : "Delete",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-delete-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------

## Objek respons
<a name="crpg-ref-responses"></a>

Penyedia sumber daya kustom mengirimkan respons ke URL yang telah ditandatangani sebelumnya untuk semua jenis permintaan. Jika penyedia sumber daya kustom tidak mengirim respons, CloudFormation tunggu hingga waktu operasi habis.

Responsnya harus berupa objek JSON dengan bidang berikut:

`Status`  
Harus `SUCCESS` atau `FAILED`.  
*Wajib*: Ya  
*Tipe*: String

`RequestId`  
ID unik untuk permintaan tersebut. Salin nilai ini persis seperti yang muncul dalam permintaan.  
*Wajib*: Ya  
*Tipe*: String

`StackId`  
Nama Sumber Daya Amazon (ARN) yang mengidentifikasi tumpukan yang berisi sumber daya khusus. Salin nilai ini persis seperti yang muncul dalam permintaan.  
*Wajib*: Ya  
*Tipe*: String

`LogicalResourceId`  
Nama template yang dipilih pengembang (ID logis) dari sumber daya kustom dalam template. CloudFormation Salin nilai ini persis seperti yang muncul dalam permintaan.  
*Wajib*: Ya  
*Tipe*: String

`PhysicalResourceId`  
Nilai ini harus menjadi pengidentifikasi yang unik untuk vendor sumber daya khusus, dan dapat berukuran hingga 1 KB. Nilai harus berupa string yang tidak kosong dan harus identik untuk semua tanggapan untuk sumber daya yang sama.  
Saat memperbarui sumber daya kustom, nilai yang dikembalikan untuk `PhysicalResourceId` menentukan perilaku pembaruan. Jika nilainya tetap sama, CloudFormation anggap itu pembaruan normal. Jika nilai berubah, CloudFormation menafsirkan pembaruan sebagai pengganti dan mengirimkan permintaan hapus ke sumber daya lama. Untuk informasi selengkapnya, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).  
*Wajib*: Ya  
*Tipe*: String

`Reason`  
Menjelaskan alasan respons kegagalan.  
Diperlukan jika `Status` adalah `FAILED`. Sebaliknya, ini bersifat opsional.  
*Wajib*: Bersyarat  
*Tipe*: String

`NoEcho`  
Menunjukkan apakah akan menutupi output dari sumber daya kustom saat diambil dengan menggunakan `Fn::GetAtt` fungsi. Jika disetel ke`true`, semua nilai yang dikembalikan ditutupi dengan tanda bintang (\$1\$1\$1\$1\$1), *kecuali yang disimpan di bagian `Metadata` template*. CloudFormation tidak mengubah, memodifikasi, atau menyunting informasi apa pun yang Anda sertakan di `Metadata` bagian ini. Nilai default-nya adalah `false`.  
Untuk informasi selengkapnya tentang penggunaan `NoEcho` untuk menutupi informasi sensitif, lihat praktik [Jangan menanamkan kredensial dalam templat Anda](security-best-practices.md#creds) terbaik.  
Hanya tersedia untuk `Create` dan `Update` tanggapan. Tidak didukung untuk `Delete` tanggapan.  
*Wajib*: Tidak  
*Jenis:* Boolean

`Data`  
Pasangan nama-nilai yang ditentukan penyedia sumber daya khusus untuk dikirim dengan respons. Anda dapat mengakses nilai yang disediakan di sini dengan nama di template dengan`Fn::GetAtt`.  
Hanya tersedia untuk `Create` dan `Update` tanggapan. Tidak didukung untuk `Delete` tanggapan.  
Jika pasangan nama-nilai berisi informasi sensitif, Anda harus menggunakan `NoEcho` bidang untuk menutupi output dari sumber daya kustom. Jika tidak, nilai terlihat melalui APIs nilai properti permukaan (seperti`DescribeStackEvents`).
*Wajib*: Tidak  
*Jenis*: objek JSON

### Contoh Respon Sukses
<a name="crpg-ref-success-response-examples"></a>

#### `Create`dan `Update` Respon
<a name="crpg-ref-success-response-example-1"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id",
   "NoEcho": true,
   "Data": {
      "key1": "value1",
      "key2": "value2"
   }
}
```

#### `Delete` Respons
<a name="crpg-ref-success-response-example-2"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id"
}
```

### Contoh Respon Gagal
<a name="crpg-ref-failed-response-example"></a>

```
{
   "Status": "FAILED",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id",
   "PhysicalResourceId": "provider-defined-physical-id",
   "Reason": "Required failure reason string"
}
```

# Sumber daya khusus yang didukung Amazon SNS
<a name="template-custom-resources-sns"></a>

Topik berikut menunjukkan cara mengonfigurasi sumber daya kustom dengan token layanan yang menentukan topik Amazon SNS CloudFormation yang mengirimkan permintaan. Anda juga mempelajari urutan peristiwa dan pesan yang dikirim dan diterima sebagai hasil dari pembuatan, pembaruan, dan penghapusan tumpukan sumber daya kustom.

Dengan sumber daya khusus dan Amazon SNS, Anda dapat mengaktifkan skenario seperti menambahkan sumber daya baru ke tumpukan dan menyuntikkan data dinamis ke dalam tumpukan. Misalnya, saat Anda membuat tumpukan, CloudFormation dapat mengirim `Create` permintaan ke topik yang dipantau oleh aplikasi yang berjalan di instans Amazon EC2. Notifikasi Amazon SNS memicu aplikasi untuk melakukan tugas penyediaan tambahan, seperti mengambil kumpulan alamat IP Elastis yang terdaftar yang diizinkan. Setelah selesai, aplikasi mengirimkan respons (dan data keluaran apa pun) yang memberi tahu CloudFormation untuk melanjutkan operasi tumpukan.

Saat Anda menentukan topik Amazon SNS sebagai target sumber daya kustom, CloudFormation mengirim pesan ke topik SNS yang ditentukan selama operasi tumpukan yang melibatkan sumber daya kustom. Untuk memproses pesan ini dan melakukan tindakan yang diperlukan, Anda harus memiliki titik akhir yang didukung berlangganan topik SNS.

Untuk pengenalan sumber daya khusus dan cara kerjanya, lihat[Cara kerja sumber daya kustom](template-custom-resources.md#how-custom-resources-work). Untuk informasi tentang Amazon SNS dan cara kerjanya, lihat Panduan [Pengembang Layanan Pemberitahuan Sederhana Amazon](https://docs.aws.amazon.com/sns/latest/dg/).

## Menggunakan Amazon SNS untuk membuat sumber daya khusus
<a name="walkthrough-custom-resources-sns-adding-nonaws-resource"></a>

**Topics**
+ [Langkah 1: Pembuatan tumpukan](#crpg-walkthrough-stack-creation)
+ [Langkah 2: Pembaruan tumpukan](#crpg-walkthrough-stack-updates)
+ [Langkah 3: Penghapusan tumpukan](#crpg-walkthrough-stack-deletion)

### Langkah 1: Pembuatan tumpukan
<a name="crpg-walkthrough-stack-creation"></a>

1. <a name="crpg-walkthrough-stack-creation-customer-template"></a>Pengembang template membuat CloudFormation tumpukan yang berisi sumber daya khusus. 

   Dalam contoh template di bawah ini, kita menggunakan nama jenis sumber daya kustom `Custom::SeleniumTester` untuk sumber daya kustom dengan ID logis`MySeleniumTest`. Nama jenis sumber daya kustom harus alfanumerik dan dapat memiliki panjang maksimum 60 karakter. 

   Jenis sumber daya kustom dideklarasikan dengan token layanan, properti khusus penyedia opsional, dan GetAtt atribut [Fn::](resources-section-structure.md#resource-properties-getatt) opsional yang ditentukan oleh penyedia sumber daya kustom. Properti dan atribut ini dapat digunakan untuk meneruskan informasi dari pengembang template ke penyedia sumber daya khusus dan sebaliknya. Token layanan menentukan topik Amazon SNS yang telah dikonfigurasi oleh penyedia sumber daya.

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "MySeleniumTest" : {
            "Type": "Custom::SeleniumTester",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest",
               "seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
            }
         }
      },
      "Outputs" : {
         "topItem" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
         },
         "numRespondents" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
         }
      }
   }
   ```
**catatan**  
Nama dan nilai data yang diakses `Fn::GetAtt` dikembalikan oleh penyedia sumber daya kustom selama respons penyedia CloudFormation. Jika penyedia sumber daya khusus adalah pihak ketiga, maka pengembang templat harus mendapatkan nama nilai pengembalian ini dari penyedia sumber daya khusus.

1. <a name="crpg-walkthrough-stack-creation-provider-request"></a>CloudFormation mengirimkan notifikasi Amazon SNS ke penyedia sumber daya dengan `"RequestType" : "Create"` yang berisi informasi tentang tumpukan, properti sumber daya khusus dari templat tumpukan, dan URL S3 untuk respons.

   Topik SNS yang digunakan untuk mengirim notifikasi disematkan dalam template di `ServiceToken` properti. Untuk menghindari penggunaan nilai hardcode, pengembang template dapat menggunakan parameter template sehingga nilai dimasukkan pada saat tumpukan diluncurkan.

   Contoh berikut menunjukkan permintaan `Create` sumber daya kustom yang mencakup nama jenis sumber daya kustom, `Custom::SeleniumTester`, yang dibuat dengan `LogicalResourceId` dari `MySeleniumTester`:

   ```
   {
      "RequestType" : "Create",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Untuk informasi rinci tentang objek permintaan untuk `Create` permintaan, lihat [Referensi permintaan dan respons](crpg-ref.md) topiknya.

1. <a name="crpg-walkthrough-stack-creation-provider-response"></a>Penyedia sumber daya kustom memproses data yang dikirim oleh pengembang template dan menentukan apakah `Create` permintaan berhasil. Penyedia sumber daya kemudian menggunakan URL S3 yang dikirim oleh CloudFormation untuk mengirim respons salah satu `SUCCESS` atau`FAILED`.

   Tergantung pada jenis respons, bidang respon yang berbeda akan diperkirakan oleh CloudFormation. Untuk informasi tentang bidang respons untuk jenis permintaan tertentu, lihat dokumentasi untuk jenis permintaan tersebut di [Referensi permintaan dan respons](crpg-ref.md) bagian.

   Menanggapi permintaan buat atau perbarui, penyedia sumber daya kustom dapat mengembalikan elemen data di `Data` bidang respons. Ini adalah pasangan nilai nama, dan *nama* sesuai dengan atribut `Fn::GetAtt` yang digunakan dengan sumber daya kustom dalam templat tumpukan. *Nilai* adalah data yang dikembalikan ketika pengembang template memanggil `Fn::GetAtt` sumber daya dengan nama atribut.

   Berikut ini adalah contoh respons sumber daya kustom:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "Data" : {
         "resultsPage" : "http://www.myexampledomain/test-results/guid",
         "lastUpdate" : "2012-11-14T03:30Z"
      }
   }
   ```

   Untuk informasi rinci tentang objek respons untuk `Create` permintaan, lihat [Referensi permintaan dan respons](crpg-ref.md) topiknya.

   `LogicalResourceId`Bidang `StackId``RequestId`,, dan harus disalin kata demi kata dari permintaan.

1. <a name="crpg-walkthrough-stack-creation-stack-status"></a> CloudFormation mendeklarasikan status tumpukan sebagai `CREATE_COMPLETE` atau`CREATE_FAILED`. Jika tumpukan berhasil dibuat, pengembang template dapat menggunakan nilai output dari sumber daya kustom yang dibuat dengan mengaksesnya dengan [Fn::](resources-section-structure.md#resource-properties-getatt). GetAtt

   Sebagai contoh, templat sumber daya kustom yang digunakan untuk ilustrasi menggunakan `Fn::GetAtt` untuk menyalin output sumber daya ke dalam output tumpukan:

   ```
   "Outputs" : {
      "topItem" : {
         "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
      },
      "numRespondents" : {
         "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
      }
   }
   ```

### Langkah 2: Pembaruan tumpukan
<a name="crpg-walkthrough-stack-updates"></a>

Untuk memperbarui tumpukan yang ada, Anda harus mengirimkan templat yang menentukan pembaruan untuk properti sumber daya dalam tumpukan, seperti yang ditunjukkan pada contoh di bawah ini. CloudFormation hanya memperbarui sumber daya yang memiliki perubahan yang ditentukan dalam templat. Untuk informasi selengkapnya, lihat [Memahami perilaku pembaruan sumber daya tumpukan](using-cfn-updating-stacks-update-behaviors.md).

Anda dapat memperbarui sumber daya kustom yang memerlukan penggantian sumber daya fisik pokok. Saat Anda memperbarui sumber daya kustom dalam CloudFormation templat, CloudFormation kirimkan permintaan pembaruan ke sumber daya kustom tersebut. Jika sumber daya kustom memerlukan pengganti, sumber daya kustom baru harus mengirim respons dengan ID fisik baru. Saat CloudFormation menerima respons, itu membandingkan `PhysicalResourceId` antara sumber daya kustom lama dan baru. Jika berbeda, CloudFormation mengenali pembaruan sebagai pengganti dan mengirimkan permintaan hapus ke sumber daya lama, seperti yang ditunjukkan pada[Langkah 3: Penghapusan tumpukan](#crpg-walkthrough-stack-deletion).

**catatan**  
Jika Anda tidak membuat perubahan pada sumber daya kustom, CloudFormation tidak akan mengirim permintaan ke sana selama pembaruan tumpukan.

1. <a name="crpg-walkthrough-stack-updates-customer-template"></a>Pengembang template memulai pembaruan ke tumpukan yang berisi sumber daya khusus. Selama pembaruan, pengembang template dapat menentukan Properti baru di template tumpukan.

   Berikut ini adalah contoh `Update` ke templat tumpukan menggunakan jenis sumber daya kustom:

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "MySeleniumTest" : {
            "Type": "Custom::SeleniumTester",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest",
               "seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
                  "http://mynewsite.com" ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
            }
         }
      },
      "Outputs" : {
         "topItem" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
         },
         "numRespondents" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
         }
      }
   }
   ```

1. <a name="crpg-walkthrough-stack-updates-provider-request"></a>CloudFormation mengirimkan pemberitahuan Amazon SNS ke penyedia sumber daya dengan `"RequestType" : "Update"` yang berisi informasi serupa dengan `Create` panggilan, kecuali bahwa `OldResourceProperties` bidang berisi properti sumber daya lama, dan ResourceProperties berisi properti sumber daya yang diperbarui (jika ada).

   Berikut ini adalah contoh permintaan `Update`:

   ```
   {
      "RequestType" : "Update",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      },
      "OldResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Untuk informasi rinci tentang objek permintaan untuk `Update` permintaan, lihat [Referensi permintaan dan respons](crpg-ref.md) topiknya.

1. <a name="crpg-walkthrough-stack-updates-provider-response"></a>Penyedia sumber daya khusus memproses data yang dikirim oleh CloudFormation. Sumber daya kustom melakukan pembaruan dan mengirimkan respons dari salah satu `SUCCESS` atau `FAILED` ke URL S3. CloudFormation kemudian membandingkan sumber daya kustom lama dan baru. `PhysicalResourceIDs` Jika berbeda, CloudFormation mengakui bahwa pembaruan memerlukan penggantian dan mengirimkan permintaan hapus ke sumber daya lama. Contoh berikut menunjukkan respon penyedia sumber daya kustom untuk `Update` permintaan.

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester2"
   }
   ```

   Untuk informasi rinci tentang objek respons untuk `Update` permintaan, lihat [Referensi permintaan dan respons](crpg-ref.md) topiknya.

   `LogicalResourceId`Bidang `StackId``RequestId`,, dan harus disalin kata demi kata dari permintaan.

1. <a name="crpg-walkthrough-stack-updates-stack-status"></a>CloudFormation mendeklarasikan status tumpukan sebagai `UPDATE_COMPLETE` atau`UPDATE_FAILED`. Jika pembaruan gagal, tumpukan akan kembali. Jika tumpukan berhasil diperbarui, pengembang templat dapat mengakses nilai keluaran baru apa pun dari sumber daya kustom yang dibuat dengannya`Fn::GetAtt`.

### Langkah 3: Penghapusan tumpukan
<a name="crpg-walkthrough-stack-deletion"></a>

1. <a name="crpg-walkthrough-stack-deletion-customer-template"></a>Pengembang template menghapus tumpukan yang berisi sumber daya khusus. CloudFormationmendapatkan properti saat ini yang ditentukan dalam template tumpukan bersama dengan topik SNS, dan bersiap untuk membuat permintaan ke penyedia sumber daya khusus.

1. <a name="crpg-walkthrough-stack-deletion-provider-request"></a>CloudFormation mengirimkan notifikasi Amazon SNS ke penyedia sumber daya dengan `"RequestType" : "Delete"` yang berisi informasi terkini tentang tumpukan, properti sumber daya khusus dari templat tumpukan, dan URL S3 untuk respons.

   Setiap kali Anda menghapus tumpukan atau membuat pembaruan yang menghapus atau menggantikan sumber daya kustom, CloudFormation bandingkan `PhysicalResourceId` antara sumber daya kustom lama dan baru. Jika berbeda, CloudFormation mengenali pembaruan sebagai pengganti dan mengirimkan permintaan hapus untuk sumber daya lama (`OldPhysicalResource`), seperti yang ditunjukkan pada contoh `Delete` permintaan berikut.

   ```
   {
      "RequestType" : "Delete",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      }
   }
   ```

   Untuk informasi rinci tentang objek permintaan untuk `Delete` permintaan, lihat [Referensi permintaan dan respons](crpg-ref.md) topiknya.

   `DescribeStackResource`, `DescribeStackResources`, dan `ListStackResources` menampilkan nama yang ditetapkan pengguna jika telah ditentukan.

1. <a name="crpg-walkthrough-stack-deletion-provider-response"></a>Penyedia sumber daya kustom memproses data yang dikirim oleh CloudFormation dan menentukan apakah `Delete` permintaan berhasil. Penyedia sumber daya kemudian menggunakan URL S3 yang dikirim oleh CloudFormation untuk mengirim respons salah satu `SUCCESS` atau`FAILED`. Agar berhasil menghapus tumpukan dengan sumber daya kustom, penyedia sumber daya kustom harus berhasil merespons permintaan penghapusan.

   Berikut ini adalah contoh respons penyedia sumber daya kustom terhadap `Delete` permintaan:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1"
   }
   ```

   Untuk informasi rinci tentang objek respons untuk `Delete` permintaan, lihat [Referensi permintaan dan respons](crpg-ref.md) topiknya.

   `LogicalResourceId`Bidang `StackId``RequestId`,, dan harus disalin kata demi kata dari permintaan.

1. <a name="crpg-walkthrough-stack-updates-stack-status-delete"></a>CloudFormation mendeklarasikan status tumpukan sebagai `DELETE_COMPLETE` atau`DELETE_FAILED`.

# Sumber daya khusus yang didukung Lambda
<a name="template-custom-resources-lambda"></a>

Saat Anda mengaitkan fungsi Lambda dengan sumber daya khusus, fungsi tersebut akan dipanggil setiap kali sumber daya kustom dibuat, diperbarui, atau dihapus. CloudFormation memanggil API Lambda untuk memanggil fungsi dan meneruskan semua data permintaan (seperti jenis permintaan dan properti sumber daya) ke fungsi. Kekuatan dan kemampuan penyesuaian fungsi Lambda dalam kombinasi dengan CloudFormation memungkinkan berbagai skenario, seperti mencari IDs AMI secara dinamis selama pembuatan tumpukan, atau mengimplementasikan dan menggunakan fungsi utilitas, seperti fungsi pembalikan string.

Untuk pengenalan sumber daya khusus dan cara kerjanya, lihat[Cara kerja sumber daya kustom](template-custom-resources.md#how-custom-resources-work).

**Topics**
+ [Walkthrough: Buat mekanisme penundaan dengan sumber daya khusus yang didukung Lambda](walkthrough-lambda-backed-custom-resources.md)
+ [Modul `cfn-response`](cfn-lambda-function-code-cfnresponsemodule.md)

# Walkthrough: Buat mekanisme penundaan dengan sumber daya khusus yang didukung Lambda
<a name="walkthrough-lambda-backed-custom-resources"></a>

Panduan ini menunjukkan kepada Anda cara mengonfigurasi dan meluncurkan sumber daya kustom yang didukung Lambda menggunakan templat sampel. CloudFormation Template ini menciptakan mekanisme penundaan yang menjeda penerapan tumpukan untuk waktu yang ditentukan. Ini dapat berguna ketika Anda perlu memperkenalkan penundaan yang disengaja selama penyediaan sumber daya, seperti saat menunggu sumber daya stabil sebelum sumber daya dependen dibuat.

**catatan**  
Meskipun sumber daya kustom yang didukung Lambda sebelumnya direkomendasikan untuk mengambil IDs AMI, kami sekarang merekomendasikan penggunaan AWS Systems Manager parameter. Pendekatan ini membuat template Anda lebih dapat digunakan kembali dan lebih mudah dirawat. Untuk informasi selengkapnya, lihat [Dapatkan nilai plaintext dari Systems Manager Parameter Store](dynamic-references-ssm.md). 

**Topics**
+ [Ikhtisar](#walkthrough-lambda-backed-custom-resources-overview)
+ [Templat sampel](#walkthrough-lambda-backed-custom-resources-sample-template)
+ [Contoh panduan templat](#walkthrough-lambda-backed-custom-resources-sample-template-walkthrough)
+ [Prasyarat](#walkthrough-lambda-backed-custom-resources-prerequisites)
+ [Meluncurkan tumpukan](#walkthrough-lambda-backed-custom-resources-createfunction-createstack)
+ [Membersihkan sumber daya](#walkthrough-lambda-backed-custom-resources-createfunction-cleanup)
+ [Informasi Terkait](#w2aac11c45b9c24b9c23)

## Ikhtisar
<a name="walkthrough-lambda-backed-custom-resources-overview"></a>

Templat tumpukan sampel yang digunakan dalam panduan ini membuat sumber daya kustom yang didukung Lambda. Sumber daya khusus ini memperkenalkan penundaan yang dapat dikonfigurasi (60 detik secara default) selama pembuatan tumpukan. Penundaan terjadi selama pembaruan tumpukan hanya ketika properti sumber daya kustom diubah.

Template menyediakan sumber daya berikut:
+ sumber daya khusus,
+ fungsi Lambda, dan
+ peran IAM yang memungkinkan Lambda untuk menulis log ke. CloudWatch

Ini juga mendefinisikan dua output:
+ Waktu sebenarnya fungsi menunggu.
+ Pengidentifikasi unik yang dihasilkan selama setiap eksekusi fungsi Lambda.



**catatan**  
CloudFormation adalah layanan gratis tetapi Lambda mengenakan biaya berdasarkan jumlah permintaan untuk fungsi Anda dan waktu kode Anda dijalankan. [Untuk informasi selengkapnya tentang harga Lambda, lihat AWS Lambda harga.](https://aws.amazon.com/lambda/pricing/)

## Templat sampel
<a name="walkthrough-lambda-backed-custom-resources-sample-template"></a>

Anda dapat melihat template sampel sumber daya kustom yang didukung Lambda dengan mekanisme penundaan di bawah ini:

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-yaml"></a>

```
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
```

## Contoh panduan templat
<a name="walkthrough-lambda-backed-custom-resources-sample-template-walkthrough"></a>

Cuplikan berikut menjelaskan bagian yang relevan dari template sampel untuk membantu Anda memahami bagaimana fungsi Lambda dikaitkan dengan sumber daya khusus dan memahami hasilnya.

[AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)sumber daya `CFNWaiter`  
`AWS::Lambda::Function`Resource menentukan kode sumber fungsi, nama handler, lingkungan runtime, dan peran eksekusi Amazon Resource Name (ARN).  
`Handler`Properti diatur ke `index.handler` karena menggunakan kode sumber Python. [Untuk informasi selengkapnya tentang pengidentifikasi handler yang diterima saat menggunakan kode sumber fungsi inline, lihat Kode. AWS::Lambda::Function ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-zipfile)  
`Runtime`Ini ditentukan sebagai `python3.9` karena file sumber adalah kode Python.  
`Timeout`Ini diatur ke 900 detik.  
`Role`Properti menggunakan `Fn::GetAtt` fungsi untuk mendapatkan ARN dari peran `LambdaExecutionRole` eksekusi yang dideklarasikan dalam `AWS::IAM::Role` sumber daya dalam template.  
`Code`Properti mendefinisikan kode fungsi inline menggunakan fungsi Python. Fungsi Python dalam template sampel melakukan hal berikut:  
+ Buat ID unik menggunakan UUID
+ Periksa apakah permintaan tersebut adalah permintaan buat atau perbarui
+ Tidur selama durasi yang ditentukan `ServiceTimeout` selama `Create` atau `Update` permintaan
+ Kembalikan waktu tunggu dan ID unik

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-json"></a>

```
...
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-yaml"></a>

```
...
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
...
```

[AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)sumber daya `LambdaExecutionRole`  
`AWS::IAM:Role`Sumber daya menciptakan peran eksekusi untuk fungsi Lambda, yang mencakup kebijakan peran asumsi yang memungkinkan Lambda menggunakannya. Ini juga berisi kebijakan yang memungkinkan akses CloudWatch Log.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-json"></a>

```
...
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-yaml"></a>

```
...
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
...
```

[AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)sumber daya `CFNWaiterCustomResource`  
Sumber daya khusus menautkan ke fungsi Lambda dengan penggunaan ARN-nya. `!GetAtt CFNWaiter.Arn` Ini akan menerapkan waktu tunggu 60 detik untuk membuat dan memperbarui operasi, seperti yang diatur`ServiceTimeout`. Sumber daya hanya akan dipanggil untuk operasi pembaruan jika properti diubah.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-json"></a>

```
...
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-yaml"></a>

```
...
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
...
```

`Outputs`  
Template ini adalah `TimeWaited` dan`WaiterId`. `Outputs` `TimeWaited`Nilai menggunakan `Fn::GetAtt` fungsi untuk memberikan jumlah waktu sumber daya pelayan benar-benar menunggu. `WaiterId`Menggunakan `Fn::GetAtt` fungsi untuk memberikan ID unik yang dihasilkan dan terkait dengan eksekusi.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-json"></a>

```
...
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-yaml"></a>

```
...
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
...
```

## Prasyarat
<a name="walkthrough-lambda-backed-custom-resources-prerequisites"></a>

Anda harus memiliki izin IAM untuk menggunakan semua layanan terkait, seperti Lambda dan. CloudFormation

## Meluncurkan tumpukan
<a name="walkthrough-lambda-backed-custom-resources-createfunction-createstack"></a>

**Untuk membuat tumpukan**

1. Temukan template preferensi Anda (YAMAL atau JSON) dari [Templat sampel](#walkthrough-lambda-backed-custom-resources-sample-template) bagian dan simpan ke mesin Anda dengan nama. `samplelambdabackedcustomresource.template`

1. Buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/).

1. Dari halaman **Stacks**, pilih **Buat tumpukan** di kanan atas, lalu pilih **Dengan sumber daya baru (standar)**.

1. Untuk **Prasyarat - Siapkan template**, pilih **Pilih template yang ada**.

1. Untuk **Menentukan templat**, pilih **Unggah file templat**, lalu pilih **Pilih file**.

1. Pilih file `samplelambdabackedcustomresource.template` template yang Anda simpan sebelumnya.

1. Pilih **Berikutnya**.

1. Untuk **nama Stack**, ketik **SampleCustomResourceStack** dan pilih **Berikutnya**.

1. Untuk panduan ini, Anda tidak perlu menambahkan tanda atau menentukan pengaturan lanjutan, jadi pilih **Selanjutnya**.

1. Pastikan nama tumpukan terlihat benar, lalu pilih **Buat**.

Mungkin perlu beberapa menit CloudFormation untuk membuat tumpukan Anda. Untuk memantau kemajuan, tampilkan peristiwa tumpukan. Untuk informasi selengkapnya, lihat [Lihat informasi tumpukan dari CloudFormation konsol](cfn-console-view-stack-data-resources.md).

Jika pembuatan tumpukan berhasil, semua sumber daya dalam tumpukan, seperti fungsi Lambda dan sumber daya khusus, dibuat. Anda telah berhasil menggunakan fungsi Lambda dan sumber daya khusus.

[Jika fungsi Lambda mengembalikan kesalahan, lihat log fungsi di konsol CloudWatch Log.](https://console.aws.amazon.com/cloudwatch/home#logs:) Nama pengaliran log adalah ID fisik sumber daya kustom, yang dapat Anda temukan dengan melihat sumber daya tumpukan. Untuk informasi selengkapnya, [lihat Melihat data log](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData) di *Panduan CloudWatch Pengguna Amazon*.

## Membersihkan sumber daya
<a name="walkthrough-lambda-backed-custom-resources-createfunction-cleanup"></a>

Hapus tumpukan untuk membersihkan semua sumber daya tumpukan yang Anda buat sehingga Anda tidak dikenakan biaya untuk sumber daya yang tidak diperlukan.

**Untuk menghapus tumpukan**

1. Dari CloudFormation konsol, pilih **SampleCustomResourceStack**tumpukan.

1. Pilih **Tindakan**, dan kemudian **Hapus Tumpukan**.

1. Pada pesan konfirmasi, pilih **Ya, Hapus**.

Semua sumber daya yang telah Anda buat sebelumnya akan dihapus.

Sekarang setelah Anda memahami cara membuat dan menggunakan sumber daya kustom yang didukung Lambda, Anda dapat menggunakan contoh template dan kode dari panduan ini untuk membangun dan bereksperimen dengan tumpukan dan fungsi lain.

## Informasi Terkait
<a name="w2aac11c45b9c24b9c23"></a>
+ [CloudFormation Referensi Sumber Daya Kustom](crpg-ref.md)
+ [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)

# Modul `cfn-response`
<a name="cfn-lambda-function-code-cfnresponsemodule"></a>

Dalam CloudFormation template Anda, Anda dapat menentukan fungsi Lambda sebagai target sumber daya kustom. Saat Anda menggunakan `ZipFile` properti untuk menentukan kode sumber [fungsi](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) Anda, Anda dapat memuat `cfn-response` modul untuk mengirim respons dari fungsi Lambda Anda ke sumber daya khusus. `cfn-response`Modul ini adalah pustaka yang menyederhanakan pengiriman tanggapan ke sumber daya kustom yang memanggil fungsi Lambda Anda. Modul ini memiliki `send` metode yang mengirimkan [objek respons](crpg-ref.md#crpg-ref-responses) ke sumber daya khusus melalui URL presigned Amazon S3 (the). `ResponseURL`

Modul `cfn-response` tersedia hanya ketika Anda menggunakan properti `ZipFile` untuk menulis kode sumber Anda. Ini tidak tersedia untuk kode sumber yang disimpan di bucket Amazon S3. Untuk kode dalam bucket, Anda harus menulis fungsi Anda sendiri untuk mengirim tanggapan.

**catatan**  
Setelah mengeksekusi `send` metode, fungsi Lambda berakhir, jadi apa pun yang Anda tulis setelah metode itu diabaikan.

## Memuat modul `cfn-response`
<a name="cfn-lambda-function-code-cfnresponsemodule-loading"></a>

Untuk fungsi Node.js, gunakan fungsi `require()` untuk memuat modul `cfn-response`. Sebagai contoh, contoh kode berikut membuat objek `cfn-response` dengan nama `response`:

```
var response = require('cfn-response');
```

Untuk Python, gunakan pernyataan `import` untuk memuat modul `cfnresponse`, seperti yang ditunjukkan dalam contoh berikut:

**catatan**  
Gunakan pernyataan impor persis seperti ini. Jika Anda menggunakan varian lain dari pernyataan impor, CloudFormation tidak mencakup modul respon.

```
import cfnresponse
```

## Parameter metode `send`
<a name="cfn-lambda-function-code-cfnresponsemodule-send-parameters"></a>

Anda dapat menggunakan parameter berikut dengan metode `send`.

`event`  
Bidang dalam [permintaan sumber daya kustom](crpg-ref.md#crpg-ref-requesttypes).

`context`  
Objek, khusus untuk fungsi Lambda, yang dapat Anda gunakan untuk menentukan kapan fungsi dan callback telah menyelesaikan eksekusi, atau untuk mengakses informasi dari dalam lingkungan eksekusi Lambda. Untuk informasi selengkapnya, lihat [Membangun fungsi Lambda dengan Node.js](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html) di Panduan *AWS Lambda Pengembang*.

`responseStatus`  
Apakah fungsi berhasil diselesaikan. Gunakan konstanta modul `cfnresponse` untuk menentukan status: `SUCCESS` untuk eksekusi yang sukses dan `FAILED` untuk eksekusi yang gagal.

`responseData`  
Bidang `Data` dari [objek respons](crpg-ref.md#crpg-ref-responses) sumber daya kustom. Data tersebut merupakan daftar pasangan nama-nilai.

`physicalResourceId`  
Tidak wajib. Pengidentifikasi unik dari sumber daya kustom yang memanggil fungsi tersebut. Secara default, modul menggunakan nama aliran CloudWatch log Amazon Logs yang terkait dengan fungsi Lambda.  
Nilai yang dikembalikan untuk `PhysicalResourceId` dapat mengubah operasi pembaruan sumber daya kustom. Jika nilai yang dikembalikan sama, itu dianggap sebagai pembaruan normal. Jika nilai yang dikembalikan berbeda, CloudFormation mengenali pembaruan sebagai pengganti dan mengirimkan permintaan hapus ke sumber daya lama. Untuk informasi selengkapnya, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).

`noEcho`  
Tidak wajib. Menunjukkan apakah menutupi output dari sumber daya kustom ketika ia diambil dengan menggunakan fungsi `Fn::GetAtt`. Jika diatur ke `true`, semua nilai yang dikembalikan ditutupi dengan tanda bintang (\$1\$1\$1\$1\$1), kecuali untuk informasi yang tersimpan di lokasi yang ditentukan di bawah ini. Secara default, nilainya adalah `false`.  
Menggunakan `NoEcho` atribut tidak menutupi informasi apa pun yang disimpan sebagai berikut:  
+ Bagian `Metadata` template. CloudFormation tidak mengubah, memodifikasi, atau menyunting informasi apa pun yang Anda sertakan di `Metadata` bagian ini. Untuk informasi selengkapnya, lihat [Metadata](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ Bagian `Outputs` template. Untuk informasi selengkapnya, lihat [Output](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
+ `Metadata`Atribut definisi sumber daya. Untuk informasi lebih lanjut, lihat [Atribut `Metadata`](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Kami sangat menyarankan Anda untuk tidak menggunakan mekanisme ini untuk memasukkan informasi sensitif, seperti kata sandi atau rahasia.
Untuk informasi selengkapnya tentang penggunaan `NoEcho` untuk menutupi informasi sensitif, lihat praktik [Jangan menanamkan kredensial dalam templat Anda](security-best-practices.md#creds) terbaik.

## Contoh
<a name="cfn-lambda-function-code-cfnresponsemodule-examples"></a>

### Node.js
<a name="cfn-lambda-function-code-zipfile-examplenodejs"></a>

Dalam contoh Node.js berikut, fungsi Lambda inline mengambil nilai input dan mengalikannya dengan 5. Fungsi inline sangat berguna untuk fungsi yang lebih kecil karena memungkinkan Anda menentukan kode sumber secara langsung di template, alih-alih membuat paket dan mengunggahnya ke bucket Amazon S3. Fungsi ini menggunakan metode `cfn-response` `send` untuk mengirim hasil kembali ke sumber daya kustom yang memanggilnya.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplenodejs.json"></a>

```
"ZipFile": { "Fn::Join": ["", [
  "var response = require('cfn-response');",
  "exports.handler = function(event, context) {",
  "  var input = parseInt(event.ResourceProperties.Input);",
  "  var responseData = {Value: input * 5};",
  "  response.send(event, context, response.SUCCESS, responseData);",
  "};"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplenodejs-yaml"></a>

```
ZipFile: >
  var response = require('cfn-response');
  exports.handler = function(event, context) {
    var input = parseInt(event.ResourceProperties.Input);
    var responseData = {Value: input * 5};
    response.send(event, context, response.SUCCESS, responseData);
  };
```

### Python
<a name="cfn-lambda-function-code-zipfile-examplepython"></a>

Dalam contoh Python berikut, fungsi Lambda inline mengambil nilai integer dan mengalikannya dengan 5.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplepython.json"></a>

```
"ZipFile" : { "Fn::Join" : ["\n", [
  "import json",
  "import cfnresponse",
  "def handler(event, context):",
  "   responseValue = int(event['ResourceProperties']['Input']) * 5",
  "   responseData = {}",
  "   responseData['Data'] = responseValue",
  "   cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, \"CustomResourcePhysicalID\")"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplepython.yaml"></a>

```
ZipFile: |
  import json
  import cfnresponse
  def handler(event, context):
    responseValue = int(event['ResourceProperties']['Input']) * 5
    responseData = {}
    responseData['Data'] = responseValue
    cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID")
```

## Kode sumber modul
<a name="cfn-lambda-function-code-cfnresponsemodule-source"></a>

**Topics**
+ [Kode sumber Node.js asinkron](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async)
+ [Kode sumber Node.js](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs)
+ [Kode sumber Python](#cfn-lambda-function-code-cfnresponsemodule-source-python)

### Kode sumber Node.js asinkron
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async"></a>

Berikut ini adalah kode sumber modul respons untuk fungsi Node.js jika handler asinkron. Tinjau untuk memahami apa yang dilakukan modul dan untuk bantuan dengan menerapkan fungsi respon Anda sendiri.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0

exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    return new Promise((resolve, reject) => {
        var responseBody = JSON.stringify({
            Status: responseStatus,
            Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
            PhysicalResourceId: physicalResourceId || context.logStreamName,
            StackId: event.StackId,
            RequestId: event.RequestId,
            LogicalResourceId: event.LogicalResourceId,
            NoEcho: noEcho || false,
            Data: responseData
        });

        console.log("Response body:\n", responseBody);

        var https = require("https");
        var url = require("url");

        var parsedUrl = url.parse(event.ResponseURL);
        var options = {
            hostname: parsedUrl.hostname,
            port: 443,
            path: parsedUrl.path,
            method: "PUT",
            headers: {
                "content-type": "",
                "content-length": responseBody.length
            }
        };

        var request = https.request(options, function(response) {
            console.log("Status code: " + parseInt(response.statusCode));
            resolve(context.done());
        });

        request.on("error", function(error) {
            console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
            reject(context.done(error));
        });

        request.write(responseBody);
        request.end();
    })
}
 
function maskCredentialsAndSignature(message) {
    return message.replace(/X-Amz-Credential=[^&\s]+/i, 'X-Amz-Credential=*****')
        .replace(/X-Amz-Signature=[^&\s]+/i, 'X-Amz-Signature=*****');
}
```

### Kode sumber Node.js
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs"></a>

Berikut ini adalah kode sumber modul respons untuk fungsi Node.js jika handler tidak asinkron. Tinjau untuk memahami apa yang dilakukan modul dan untuk bantuan dengan menerapkan fungsi respon Anda sendiri.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0
 
exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    var responseBody = JSON.stringify({
        Status: responseStatus,
        Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
        PhysicalResourceId: physicalResourceId || context.logStreamName,
        StackId: event.StackId,
        RequestId: event.RequestId,
        LogicalResourceId: event.LogicalResourceId,
        NoEcho: noEcho || false,
        Data: responseData
    });

    console.log("Response body:\n", responseBody);

    var https = require("https");
    var url = require("url");

    var parsedUrl = url.parse(event.ResponseURL);
    var options = {
        hostname: parsedUrl.hostname,
        port: 443,
        path: parsedUrl.path,
        method: "PUT",
        headers: {
            "content-type": "",
            "content-length": responseBody.length
        }
    };

    var request = https.request(options, function(response) {
        console.log("Status code: " + parseInt(response.statusCode));
        context.done();
    });

    request.on("error", function(error) {
        console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
        context.done();
    });

    request.write(responseBody);
    request.end();
}
```

### Kode sumber Python
<a name="cfn-lambda-function-code-cfnresponsemodule-source-python"></a>

Berikut ini adalah kode sumber modul respon untuk fungsi Python:

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
 
from __future__ import print_function
import urllib3
import json
import re

SUCCESS = "SUCCESS"
FAILED = "FAILED"

http = urllib3.PoolManager()


def send(event, context, responseStatus, responseData, physicalResourceId=None, noEcho=False, reason=None):
    responseUrl = event['ResponseURL']

    responseBody = {
        'Status' : responseStatus,
        'Reason' : reason or "See the details in CloudWatch Log Stream: {}".format(context.log_stream_name),
        'PhysicalResourceId' : physicalResourceId or context.log_stream_name,
        'StackId' : event['StackId'],
        'RequestId' : event['RequestId'],
        'LogicalResourceId' : event['LogicalResourceId'],
        'NoEcho' : noEcho,
        'Data' : responseData
    }

    json_responseBody = json.dumps(responseBody)

    print("Response body:")
    print(json_responseBody)

    headers = {
        'content-type' : '',
        'content-length' : str(len(json_responseBody))
    }

    try:
        response = http.request('PUT', responseUrl, headers=headers, body=json_responseBody)
        print("Status code:", response.status)


    except Exception as e:

        print("send(..) failed executing http.request(..):", mask_credentials_and_signature(e))
 
 
def mask_credentials_and_signature(message):
    message = re.sub(r'X-Amz-Credential=[^&\s]+', 'X-Amz-Credential=*****', message, flags=re.IGNORECASE)
    return re.sub(r'X-Amz-Signature=[^&\s]+', 'X-Amz-Signature=*****', message, flags=re.IGNORECASE)
```

# Lakukan pemrosesan kustom pada CloudFormation template dengan makro template
<a name="template-macros"></a>

Dengan makro, Anda dapat melakukan pemrosesan khusus pada templat, dari tindakan sederhana seperti find-and-replace operasi hingga transformasi ekstensif seluruh templat.

Untuk mendapatkan gambaran tentang luasnya kemungkinan, pertimbangkan `AWS::Include` dan `AWS::Serverless` transformasi, yang merupakan makro yang dihosting oleh: CloudFormation
+ [AWS::Includetransform](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html) memungkinkan Anda untuk memasukkan cuplikan template boilerplate ke dalam template Anda.
+ [AWS::Serverlesstransform](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html) mengambil seluruh template yang ditulis dalam sintaks AWS Serverless Application Model (AWS SAM) dan mengubah dan memperluasnya menjadi template yang sesuai. CloudFormation Untuk informasi selengkapnya tentang aplikasi tanpa server dan AWS SAM, lihat Panduan [AWS Serverless Application Model Pengembang](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html).

**Topics**
+ [Penagihan](#template-macros-billing)
+ [Contoh makro](#template-macros-examples-list)
+ [Sumber daya terkait](#template-macros-related-resources)
+ [Ikhtisar CloudFormation makro](template-macros-overview.md)
+ [Buat definisi CloudFormation makro](template-macros-author.md)
+ [Contoh makro pengganti string sederhana](macros-example.md)
+ [Memecahkan masalah template yang diproses](template-macros-troubleshoot-processed-template.md)

## Penagihan
<a name="template-macros-billing"></a>

Saat makro berjalan, pemilik fungsi Lambda ditagih untuk biaya apa pun yang terkait dengan eksekusi fungsi tersebut.

`AWS::Include`Dan `AWS::Serverless` transformasi adalah makro yang dihosting oleh. CloudFormation Tidak ada biaya untuk menggunakannya.

## Contoh makro
<a name="template-macros-examples-list"></a>

Selain contoh di bagian ini, Anda dapat menemukan contoh makro, termasuk kode sumber dan templat, di [GitHub repositori](https://github.com/aws-cloudformation/aws-cloudformation-templates/tree/main/CloudFormation/MacrosExamples) kami. Contoh-contoh ini disediakan 'sebagaimana adanya' untuk tujuan instruksional.

## Sumber daya terkait
<a name="template-macros-related-resources"></a>
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html)
+ [CloudFormation Transformbagian template](transform-section-structure.md)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-transform.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-transform.html)
+ [AWS::Serverlessmengubah](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html)
+ [AWS::Includemengubah](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html)

# Ikhtisar CloudFormation makro
<a name="template-macros-overview"></a>

Ada dua langkah utama untuk memproses templat menggunakan makro: membuat makro itu sendiri, lalu menggunakan makro untuk melakukan pemrosesan pada templat Anda.

Untuk membuat definisi makro, Anda harus membuat yang berikut:
+ Fungsi Lambda untuk melakukan pemrosesan template. Fungsi Lambda ini menerima cuplikan atau seluruh templat, dan parameter tambahan apa pun yang Anda tentukan. Fungsi ini mengembalikan snippet templat yang diproses atau seluruh templat sebagai respons.
+ Sumber daya tipe [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html), yang memungkinkan pengguna untuk memanggil fungsi Lambda dari dalam CloudFormation templat. Sumber daya ini menentukan ARN dari fungsi Lambda untuk memanggil makro ini, dan properti opsional tambahan untuk membantu debugging. Untuk membuat sumber daya ini di dalam akun, buat templat yang menyertakan `AWS::CloudFormation::Macro` sumber daya, lalu buat tumpukan atau kumpulan tumpukan dengan izin yang dikelola sendiri dari templat. CloudFormation StackSetssaat ini tidak mendukung pembuatan atau pembaruan kumpulan tumpukan dengan izin yang dikelola layanan dari templat yang mereferensikan makro.

Untuk menggunakan makro, referensikan makro dalam templat Anda:
+ Untuk memproses bagian, atau bagian, dari template, referensi makro dalam `Fn::Transform` fungsi yang terletak relatif terhadap konten template yang ingin Anda ubah. Saat menggunakan `Fn::Transform`, Anda juga dapat melewati parameter tertentu yang diperlukan.
+ Untuk memproses seluruh template, referensikan makro di bagian [Transform](transform-section-structure.md) dari templat.

Selanjutnya, Anda biasanya membuat set perubahan dan kemudian menjalankannya. (Memproses makro dapat menambahkan beberapa sumber daya yang mungkin tidak Anda sadari. Untuk memastikan bahwa Anda mengetahui semua perubahan yang diperkenalkan oleh makro, kami sangat menyarankan agar Anda menggunakan set perubahan.) CloudFormation meneruskan konten template yang ditentukan, bersama dengan parameter tambahan yang ditentukan, ke fungsi Lambda yang ditentukan dalam sumber daya makro. Fungsi Lambda mengembalikan konten template yang diproses, baik itu cuplikan atau seluruh template.

Setelah semua makro dalam template dipanggil, CloudFormation menghasilkan set perubahan yang menyertakan konten template yang diproses. Setelah Anda meninjau set perubahan, jalankan untuk menerapkan perubahan.

![\[Gunakan fungsi Fn::Transform intrinsik atau Transform bagian template, untuk meneruskan konten template dan parameter terkait ke fungsi Lambda makro yang mendasari, yang mengembalikan konten template yang diproses.\]](http://docs.aws.amazon.com/id_id/AWSCloudFormation/latest/UserGuide/images/template-macro-use.png)


## Cara membuat tumpukan secara langsung
<a name="template-macros-change-sets"></a>

Untuk membuat atau memperbarui tumpukan menggunakan templat yang mereferensikan makro, Anda biasanya membuat set perubahan, lalu menjalankannya. Set perubahan menjelaskan tindakan yang akan diambil CloudFormation berdasarkan templat yang diproses. Memproses makro dapat menambahkan beberapa sumber daya yang mungkin tidak Anda sadari. Untuk memastikan bahwa Anda mengetahui semua perubahan yang diperkenalkan oleh makro, kami sangat menyarankan Anda menggunakan set perubahan. Setelah Anda meninjau set perubahan, Anda dapat menjalankannya untuk benar-benar menerapkan perubahan.

Makro dapat menambahkan sumber daya IAM ke template Anda. Untuk sumber daya ini, CloudFormation mengharuskan Anda untuk [mengakui kemampuan mereka](control-access-with-iam.md#using-iam-capabilities). Karena tidak CloudFormation dapat mengetahui sumber daya mana yang ditambahkan sebelum memproses template Anda, Anda mungkin perlu mengakui kemampuan IAM saat membuat set perubahan, tergantung pada apakah makro yang direferensikan berisi sumber daya IAM. Dengan begitu, ketika Anda menjalankan set perubahan, CloudFormation memiliki kemampuan yang diperlukan untuk membuat sumber daya IAM.

Untuk membuat atau memperbarui tumpukan langsung dari template yang diproses tanpa terlebih dahulu meninjau perubahan yang diusulkan dalam set perubahan, tentukan `CAPABILITY_AUTO_EXPAND` kemampuan selama `UpdateStack` permintaan `CreateStack` atau permintaan. Anda hanya boleh membuat tumpukan langsung dari templat tumpukan yang berisi makro jika Anda tahu apa yang dilakukan pemrosesan makro. Anda tidak dapat menggunakan set perubahan dengan makro set tumpukan; Anda harus memperbarui set tumpukan Anda secara langsung.

Untuk informasi selengkapnya, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html)atau [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html)di *Referensi AWS CloudFormation API*.

**penting**  
Jika templat set tumpukan Anda mereferensikan satu atau beberapa makro, Anda harus membuat set tumpukan langsung dari templat yang diproses, tanpa terlebih dahulu meninjau perubahan yang dihasilkan dalam set perubahan. Memproses makro dapat menambahkan beberapa sumber daya yang mungkin tidak Anda sadari. Sebelum Anda membuat atau memperbarui set tumpukan dari templat yang mereferensikan makro secara langsung, pastikan Anda mengetahui apa yang dilakukan pemrosesan makro.

Untuk mengurangi jumlah langkah untuk meluncurkan tumpukan dari template yang mereferensikan makro, Anda dapat menggunakan perintah `package` and `deploy` AWS CLI . Untuk informasi selengkapnya, lihat [Unggah artefak lokal ke bucket S3 dengan AWS CLI](using-cfn-cli-package.md) dan [Buat tumpukan yang mencakup transformasi](service_code_examples.md#deploy-sdk).

## Pertimbangan-pertimbangan
<a name="template-macros-considerations"></a>

Saat bekerja dengan makro, ingatlah catatan dan batasan berikut:
+ Makro hanya didukung di Wilayah AWS tempat Lambda tersedia. Untuk daftar Wilayah di mana Lambda tersedia, lihat [AWS Lambda titik akhir](https://docs.aws.amazon.com/general/latest/gr/lambda-service.html) dan kuota.
+ Setiap snippet templat yang diproses harus berupa JSON yang valid.
+ Setiap snippet templat yang diproses harus lulus pemeriksaan validasi untuk operasi membuat tumpukan, memperbarui tumpukan, membuat set tumpukan, atau memperbarui set tumpukan.
+ CloudFormation menyelesaikan makro terlebih dahulu, dan kemudian memproses template. Templat yang dihasilkan harus berupa JSON yang valid dan tidak boleh melebihi batas ukuran templat.
+ Karena urutan CloudFormation proses elemen dalam template, makro tidak dapat menyertakan modul dalam konten template yang diproses yang dikembalikan. CloudFormation Untuk informasi selengkapnya, lihat [Urutan evaluasi makro](template-macros-author.md#template-macros-order).
+ Saat menggunakan fitur update rollback, CloudFormation gunakan salinan template asli. Itu memutar kembali ke templat asli bahkan jika snippet yang disertakan diubah.
+ Menyertakan makro dalam makro tidak berfungsi karena kami tidak memproses makro secara rekursif.
+ Fungsi intrinsik `Fn::ImportValue` saat ini tidak didukung dalam makro.
+ Fungsi intrinsik yang termasuk dalam templat dievaluasi setelah makro apapun. Oleh karena itu, konten template yang diproses yang dikembalikan makro Anda dapat menyertakan panggilan ke fungsi intrinsik, dan mereka dievaluasi seperti biasa.
+ StackSets saat ini tidak mendukung pembuatan atau pembaruan kumpulan tumpukan dengan izin yang dikelola layanan dari templat yang mereferensikan makro. CloudFormation

## Cakupan akun makro dan izin
<a name="template-macros-permissions"></a>

Anda dapat menggunakan makro hanya di akun tempat mereka dibuat sebagai sumber daya. Nama makro harus unik dalam akun tertentu. Namun, Anda dapat membuat fungsionalitas yang sama tersedia di beberapa akun dengan mengaktifkan akses lintas akun pada fungsi Lambda yang mendasarinya, dan kemudian membuat definisi makro yang mereferensikan fungsi tersebut di beberapa akun. Dalam contoh di bawah ini, tiga akun berisi definisi makro yang masing-masing menunjuk ke fungsi Lambda yang sama.

![\[Dengan mengizinkan akses lintas akun pada fungsi Lambda AWS , memungkinkan Anda membuat makro di beberapa akun yang mereferensikan fungsi tersebut.\]](http://docs.aws.amazon.com/id_id/AWSCloudFormation/latest/UserGuide/images/template-macro-accounts.png)


Untuk membuat definisi makro, pengguna harus memiliki izin untuk membuat tumpukan atau tumpukan yang ditetapkan dalam akun yang ditentukan.

 CloudFormation Agar berhasil menjalankan makro yang disertakan dalam template, pengguna harus memiliki `Invoke` izin untuk fungsi Lambda yang mendasarinya. Untuk mencegah potensi eskalasi izin, CloudFormation meniru pengguna saat menjalankan makro.

Untuk informasi selengkapnya, lihat [Mengelola izin AWS Lambda di](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html) *Panduan AWS Lambda Pengembang* dan [Tindakan, sumber daya, dan kunci kondisi AWS Lambda](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslambda.html) di Referensi *Otorisasi Layanan*.

# Buat definisi CloudFormation makro
<a name="template-macros-author"></a>

Saat Anda membuat definisi makro, definisi makro membuat fungsi Lambda yang mendasarinya tersedia di akun yang ditentukan sehingga CloudFormation memanggilnya untuk memproses templat.

## Pemetaan acara
<a name="template-macros-event-mapping"></a>

Ketika CloudFormation memanggil fungsi Lambda makro, ia mengirimkan permintaan dalam format JSON dengan struktur berikut:

```
{
    "region" : "us-east-1",
    "accountId" : "$ACCOUNT_ID",
    "fragment" : { ... },
    "transformId" : "$TRANSFORM_ID",
    "params" : { ... },
    "requestId" : "$REQUEST_ID",
    "templateParameterValues" : { ... }
}
```
+ `region`

  Wilayah tempat makro berada.
+ `accountId`

  ID akun akun tempat makro menjalankan fungsi Lambda.
+ `fragment`

  Konten templat yang tersedia untuk pemrosesan kustom, dalam format JSON.
  + Untuk makro yang termasuk dalam bagian templat `Transform`, ini adalah seluruh templat kecuali untuk bagian `Transform`.
  + Untuk makro yang disertakan dalam panggilan fungsi intrinsik `Fn::Transform`, ini mencakup semua node saudara (dan turunannya) berdasarkan lokasi fungsi intrinsik dalam templat kecuali untuk fungsi `Fn::Transform` tersebut. Untuk informasi selengkapnya, lihat [Ruang lingkup template makro](#template-macros-scope).
+ `transformId`

  Nama makro yang memanggil fungsi ini.
+ `params`

  Untuk panggilan `Fn::Transform` fungsi, parameter apa pun yang ditentukan untuk fungsi tersebut. CloudFormation tidak mengevaluasi parameter ini sebelum meneruskannya ke fungsi.

  Untuk makro yang termasuk dalam bagian templat `Transform`, bagian ini kosong.
+ `requestId`

  ID permintaan yang memanggil fungsi ini.
+ `templateParameterValues`

  Parameter apa pun yang ditentukan di [Parameters](parameters-section-structure.md) bagian templat. CloudFormation mengevaluasi parameter ini sebelum meneruskannya ke fungsi.

## Format respons
<a name="template-macros-response-format"></a>

CloudFormation mengharapkan fungsi Lambda mengembalikan respons dalam format JSON berikut:

```
{
    "requestId" : "$REQUEST_ID",
    "status" : "$STATUS",
    "fragment" : { ... },
    "errorMessage": "optional error message for failures"
}
```
+ `requestId`

  ID permintaan yang memanggil fungsi ini. Ini harus sesuai dengan ID permintaan yang disediakan oleh CloudFormation saat menjalankan fungsi.
+ `status`

  Status permintaan (peka huruf besar kecil). Harus diatur ke`success`. CloudFormation memperlakukan setiap respon lain sebagai kegagalan.
+ `fragment`

  Konten template yang diproses CloudFormation untuk disertakan dalam template yang diproses, termasuk saudara kandung. CloudFormation menggantikan konten template yang diteruskan ke fungsi Lambda dengan fragmen template yang diterimanya dalam respons Lambda.

  Konten templat yang diproses harus berupa JSON yang valid, dan penyertaannya dalam templat yang diproses harus menghasilkan templat yang valid.

  Jika fungsi Anda tidak benar-benar mengubah konten templat yang diteruskan CloudFormation ke sana, tetapi Anda masih perlu menyertakan konten itu dalam templat yang diproses, fungsi Anda perlu mengembalikan konten templat itu ke CloudFormation dalam responsnya.
+ `errorMessage`

  Pesan kesalahan yang menjelaskan mengapa transformasi gagal. CloudFormation menampilkan pesan kesalahan ini di panel **Peristiwa** di halaman **Detail tumpukan** untuk tumpukan Anda.

  Contoh:

  ```
  Error creating change set: Transform
                              Akun AWS account
                              number::macro name failed with:
                              error message string.
  ```

## Buat definisi makro
<a name="create-a-macro-definition"></a>

**Untuk membuat definisi CloudFormation makro**

1. [Bangun fungsi Lambda](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html) yang akan menangani pemrosesan konten template. Hal ini dapat memproses setiap bagian dari template, sampai ke seluruh template. 

1. Buat CloudFormation template yang berisi jenis `AWS::CloudFormation::Macro` sumber daya dan tentukan `Name` dan `FunctionName` properti. `FunctionName`Properti harus berisi ARN dari fungsi Lambda untuk dipanggil saat menjalankan makro. CloudFormation 

1. (Opsional) Untuk membantu dalam debugging, Anda juga dapat menentukan `LogGroupName` dan `LogRoleArn` properti saat membuat jenis `AWS::CloudFormation::Macro` sumber daya untuk makro Anda. Properti ini memungkinkan Anda menentukan grup CloudWatch log Log yang CloudFormation mengirimkan informasi pencatatan kesalahan saat menjalankan fungsi Lambda dasar makro, dan peran tersebut CloudFormation harus diambil saat mengirim entri log ke log tersebut.

1. [Buat tumpukan](cfn-console-create-stack.md) menggunakan template dengan makro di akun yang ingin Anda gunakan. Atau, [buat kumpulan tumpukan dengan izin yang dikelola sendiri](stacksets-getting-started-create-self-managed.md) menggunakan templat dengan makro di akun administrator, lalu buat instance tumpukan di akun target.

1. Setelah CloudFormation berhasil membuat tumpukan yang berisi definisi makro, makro tersedia untuk digunakan dalam akun tersebut. Anda menggunakan makro dengan mereferensikannya di templat, di lokasi yang sesuai yang relevan dengan konten templat yang ingin Anda proses.

## Ruang lingkup template makro
<a name="template-macros-scope"></a>

Makro yang direferensikan di bagian `Transform` dari templat dapat memproses seluruh konten templat tersebut.

Makro yang direferensikan dalam suatu fungsi `Fn::Transform` dapat memproses konten salah satu elemen saudara (termasuk anak-anak) dari fungsi `Fn::Transform` tersebut dalam templat.

Misalnya, pada contoh templat di bawah ini, `AWS::Include` dapat memproses properti `MyBucket`, berdasarkan lokasi fungsi `Fn::Transform` yang memuatnya. `MyMacro` dapat memproses konten seluruh templat karena penyertaannya di bagian `Transform`.

```
# Start of processable content for MyMacro
AWSTemplateFormatVersion: 2010-09-09 
 Transform: [MyMacro]
 Resources:
    WaitCondition:
      Type: AWS::CloudFormation::WaitCondition
    MyBucket:
      Type: AWS::S3::Bucket
      # Start of processable content for AWS::Include
      Properties:
        BucketName: amzn-s3-demo-bucket1
        Tags: [{"key":"value"}] 
        'Fn::Transform':
          - Name: 'AWS::Include'
              Parameters:
                Location: s3://amzn-s3-demo-bucket2/MyFileName.yaml
        CorsConfiguration: []
        # End of processable content for AWS::Include
    MyEc2Instance:
      Type: AWS::EC2::Instance
      Properties:
        ImageID: ami-1234567890abcdef0
# End of processable content for MyMacro
```

## Urutan evaluasi makro
<a name="template-macros-order"></a>

Anda dapat mereferensikan beberapa makro dalam templat tertentu, termasuk transformasi yang dihosting oleh CloudFormation, seperti [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html)dan. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html)

Macro dievaluasi secara berurutan, berdasarkan lokasi mereka di templat, dari yang paling dalam hingga yang paling umum. Makro di lokasi yang sama dalam template dievaluasi secara serial berdasarkan urutan daftar.

Transformasi seperti `AWS::Include` dan `AWS::Transform` diperlakukan sama seperti makro lainnya dalam hal urutan tindakan dan cakupan.

Misalnya, dalam contoh templat di bawah ini, CloudFormation evaluasi `PolicyAdder` makro terlebih dahulu, karena makro ini adalah makro yang paling dalam di template. CloudFormation kemudian mengevaluasi `MyMacro` sebelum mengevaluasi `AWS::Serverless` karena tercantum sebelumnya `AWS::Serverless` di bagian. `Transform`

```
AWSTemplateFormatVersion: 2010-09-09
 Transform: [MyMacro, AWS::Serverless]
 Resources:
    WaitCondition:
      Type: AWS::CloudFormation::WaitCondition
    MyBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: amzn-s3-demo-bucket
        Tags: [{"key":"value"}]
        'Fn::Transform':
          - Name: PolicyAdder
        CorsConfiguration: []
    MyEc2Instance:
      Type: AWS::EC2::Instance
      Properties:
        ImageID: ami-1234567890abcdef0
```

# Contoh makro pengganti string sederhana
<a name="macros-example"></a>

Contoh berikut memandu Anda melalui proses menggunakan makro, dari mendefinisikan makro dalam template, hingga membuat fungsi Lambda untuk makro, dan kemudian menggunakan makro dalam template.

Dalam contoh ini, kita membuat makro sederhana yang menyisipkan string yang ditentukan di tempat konten target yang ditentukan dalam templat yang diproses. Kemudian kita akan menggunakannya untuk menyisipkan `WaitHandleCondition` kosong di lokasi yang ditentukan dalam templat yang diproses.

## Membuat makro
<a name="macros-example-definiton"></a>

Sebelum menggunakan makro, pertama-tama kita harus menyelesaikan dua hal: membuat fungsi Lambda yang melakukan pemrosesan template yang diinginkan, dan kemudian membuat fungsi Lambda itu tersedia dengan membuat definisi CloudFormation makro.

Contoh template berikut berisi definisi untuk contoh makro kita. Untuk membuat makro tersedia secara spesifik Akun AWS, buat tumpukan dari template. Definisi makro menentukan nama makro, deskripsi singkat, dan referensi ARN dari fungsi Lambda yang dipanggil ketika makro ini CloudFormation digunakan dalam template. (Kami belum menyertakan `LogRoleARN` properti `LogGroupName` atau untuk pencatatan kesalahan.) 

Dalam contoh ini, asumsikan bahwa tumpukan yang dibuat dari template ini diberi nama`JavaMacroFunc`. Karena `Name` properti makro diatur ke nama tumpukan, makro yang dihasilkan dinamai `JavaMacroFunc` juga.

```
AWSTemplateFormatVersion: 2010-09-09
  Resources:
    Macro:
      Type: AWS::CloudFormation::Macro
      Properties:
        Name: !Sub '${AWS::StackName}'
        Description: Adds a blank WaitConditionHandle named WaitHandle
        FunctionName: 'arn:aws:lambda:us-east-1:012345678910:function:JavaMacroFunc'
```

## Menggunakan makro
<a name="macros-example-usage"></a>

Untuk menggunakan makro kami, kami memasukkannya ke dalam template menggunakan fungsi `Fn::Transform` intrinsik.

Ketika kita membuat tumpukan menggunakan template di bawah ini, CloudFormation memanggil contoh makro kita. Fungsi Lambda yang mendasari menggantikan satu string tertentu dengan string lain yang ditentukan. Dalam hal ini, hasilnya kosong `AWS::CloudFormation::WaitConditionHandle` dimasukkan ke dalam template yang diproses.

```
Parameters:
  ExampleParameter:
    Type: String
    Default: 'SampleMacro'

Resources:
  2a:
    Fn::Transform:
      Name: "JavaMacroFunc"
      Parameters:
        replacement: 'AWS::CloudFormation::WaitConditionHandle'
        target: '$$REPLACEMENT$$'
    Type: '$$REPLACEMENT$$'
```
+ Makro untuk memanggil ditentukan sebagai`JavaMacroFunc`, yang berasal dari contoh definisi makro sebelumnya.
+ Makro melewati dua parameter, `target` dan `replacement`, yang mewakili string target dan nilai penggantian yang diinginkan.
+ Makro dapat beroperasi pada konten simpul `Type` karena merupakan `Type` saudara dari fungsi `Fn::Transform` yang mereferensikan makro.
+ Hasilnya `AWS::CloudFormation::WaitConditionHandle` dinamai`2a`.
+ Template juga berisi parameter template, `ExampleParameter`, yang juga dapat diakses oleh makro (tetapi tidak digunakan dalam hal ini).

## Data masukan Lambda
<a name="macros-example-request"></a>

Saat CloudFormation memproses contoh template kami selama pembuatan tumpukan, ia meneruskan pemetaan peristiwa berikut ke fungsi Lambda yang direferensikan dalam `JavaMacroFunc` definisi makro.
+ `region` : `us-east-1`
+ `accountId` : `012345678910`
+ `fragment` :

  ```
  {
    "Type": "$$REPLACEMENT$$"
  }
  ```
+ `transformId` : `012345678910::JavaMacroFunc`
+ `params` : 

  ```
  {
      "replacement": "AWS::CloudFormation::WaitConditionHandle",
      "target": "$$REPLACEMENT$$"
  }
  ```
+ `requestId` : `5dba79b5-f117-4de0-9ce4-d40363bfb6ab`
+ `templateParameterValues` :

  ```
  {
      "ExampleParameter": "SampleMacro"
  }
  ```

`fragment` berisi JSON yang mewakili fragmen templat yang dapat diproses makro. Fragmen ini terdiri dari saudara dari panggilan fungsi `Fn::Transform`, tetapi bukan fungsi panggilan itu sendiri. Juga, `params` berisi JSON yang mewakili parameter makro. Dalam hal ini, penggantian dan target. Demikian pula, `templateParameterValues` berisi JSON yang mewakili parameter yang ditentukan untuk templat secara keseluruhan.

## Kode fungsi Lambda
<a name="macros-example-function"></a>

Berikut ini adalah kode aktual untuk fungsi Lambda yang mendasari `JavaMacroFunc` contoh makro. Ini mengulangi fragmen templat yang disertakan dalam respons (baik dalam format string, daftar, maupun peta), mencari string target yang ditentukan. Jika menemukan string target yang ditentukan, fungsi Lambda menggantikan string target dengan string pengganti yang ditentukan. Jika tidak, fungsi membiarkan fragmen template tidak berubah. Kemudian, fungsi mengembalikan peta properti yang diharapkan, dibahas secara rinci di bawah ini, ke CloudFormation.

```
package com.macroexample.lambda.demo;

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler implements RequestHandler<Map<String, Object>, Map<String, Object>> {

	private static final String REPLACEMENT = "replacement";
	private static final String TARGET = "target";
	private static final String PARAMS = "params";
	private static final String FRAGMENT = "fragment";
	private static final String REQUESTID = "requestId";
	private static final String STATUS = "status";
	private static final String SUCCESS = "SUCCESS";
	private static final String FAILURE = "FAILURE";
    @Override
    public Map<String, Object> handleRequest(Map<String, Object> event, Context context) {
        // TODO: implement your handler
    	final Map<String, Object> responseMap = new HashMap<String, Object>();
        responseMap.put(REQUESTID, event.get(REQUESTID));
        responseMap.put(STATUS, FAILURE);
    	try {
	        if (!event.containsKey(PARAMS)) {
	        	throw new RuntimeException("Params are required");
	        }
	    	
	        final Map<String, Object> params = (Map<String, Object>) event.get(PARAMS);
	        if (!params.containsKey(REPLACEMENT) || !params.containsKey(TARGET)) {
	        	throw new RuntimeException("replacement or target under Params are required");
	        }
	    	
	    	final String replacement = (String) params.get(REPLACEMENT);
	    	final String target = (String) params.get(TARGET);
	    	final Object fragment = event.getOrDefault(FRAGMENT, new HashMap<String, Object>());
	    	final Object retFragment;
	    	if (fragment instanceof String) {
	    		retFragment = iterateAndReplace(replacement, target, (String) fragment);
	    	} else if (fragment instanceof List) {
	    		retFragment = iterateAndReplace(replacement, target, (List<Object>) fragment);
	    	} else if (fragment instanceof Map) {
	    		retFragment = iterateAndReplace(replacement, target, (Map<String, Object>) fragment);
	    	} else {
	    		retFragment = fragment;
	    	}
	        responseMap.put(STATUS, SUCCESS);
	        responseMap.put(FRAGMENT, retFragment);
	        return responseMap;
    	} catch (Exception e) {
    		e.printStackTrace();
    		context.getLogger().log(e.getMessage());
    		return responseMap;
    	}
    }
    
    private Map<String, Object> iterateAndReplace(final String replacement, final String target, final Map<String, Object> fragment) {
    	final Map<String, Object> retFragment = new HashMap<String, Object>();
    	final List<String> replacementKeys = new ArrayList<>();
    	fragment.forEach((k, v) -> {
    		if (v instanceof String) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (String)v));
    		} else if (v instanceof List) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (List<Object>)v));
    		} else if (v instanceof Map ) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (Map<String, Object>) v));
    		} else {
    			retFragment.put(k, v);
    		}
    	});
    	return retFragment;
    }

    private List<Object> iterateAndReplace(final String replacement, final String target, final List<Object> fragment) {
    	final List<Object> retFragment = new ArrayList<>();
    	fragment.forEach(o -> {
    		if (o instanceof String) {
    			retFragment.add(iterateAndReplace(replacement, target, (String) o));
    		} else if (o instanceof List) {
    			retFragment.add(iterateAndReplace(replacement, target, (List<Object>) o));
    		} else if (o instanceof Map) {
    			retFragment.add(iterateAndReplace(replacement, target, (Map<String, Object>) o));
    		} else {
    			retFragment.add(o);
    		}
    	});
    	return retFragment;
    }
    
    private String iterateAndReplace(final String replacement, final String target, final String fragment) {
    	System.out.println(replacement + " == " + target + " == " + fragment );
    	if (fragment != null AND_AND fragment.equals(target))
    		return replacement;
    	return fragment;
    }
}
```

## Respon fungsi Lambda
<a name="macros-example-response"></a>

Berikut ini adalah pemetaan yang fungsi Lambda kembali CloudFormation untuk diproses. 
+ `requestId` : `5dba79b5-f117-4de0-9ce4-d40363bfb6ab`
+ `status` : `SUCCESS`
+ `fragment` :

  ```
  {
    "Type": "AWS::CloudFormation::WaitConditionHandle"
  }
  ```

`requestId`Pencocokan yang dikirim dari CloudFormation, dan `status` nilai `SUCCESS` menunjukkan bahwa fungsi Lambda berhasil memproses fragmen template yang disertakan dalam permintaan. Dalam respons ini, `fragment` berisi JSON mewakili konten yang akan dimasukkan ke dalam templat yang diproses sebagai pengganti snippet templat asli.

## Template yang diproses yang dihasilkan
<a name="macros-example-processed"></a>

Setelah CloudFormation menerima respons yang berhasil dari fungsi Lambda, ia menyisipkan fragmen template yang dikembalikan ke dalam template yang diproses.

Di bawah ini adalah templat yang diproses yang dihasilkan untuk contoh kita. Panggilan fungsi `Fn::Transform` intrinsik yang mereferensikan `JavaMacroFunc` makro tidak lagi disertakan. Fragmen template yang dikembalikan oleh fungsi Lambda disertakan di lokasi yang sesuai, dengan hasil bahwa `"Type": "$$REPLACEMENT$$"` konten telah diganti. `"Type": "AWS::CloudFormation::WaitConditionHandle"`

```
{
    "Parameters": {
        "ExampleParameter": {
            "Default": "SampleMacro",
            "Type": "String"
        }
    },
    "Resources": {
        "2a": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        }
    }
}
```

# Memecahkan masalah template yang diproses
<a name="template-macros-troubleshoot-processed-template"></a>

Saat menggunakan makro, templat yang diproses dapat ditemukan di CloudFormation konsol.

Tahap template menunjukkan status pemrosesannya:
+ `Original`: Templat yang awalnya dikirimkan pengguna untuk membuat atau memperbarui tumpukan atau set tumpukan.
+ `Processed`: Template yang CloudFormation digunakan untuk membuat atau memperbarui tumpukan atau set tumpukan setelah memproses makro yang direferensikan. Templat yang diproses diformat sebagai JSON, bahkan jika templat asli diformat sebagai YAML.

Untuk pemecahan masalah, gunakan templat yang diproses. Jika template tidak mereferensikan makro, templat asli dan yang diproses akan serupa.

Untuk informasi selengkapnya, lihat [Lihat informasi tumpukan dari CloudFormation konsol](cfn-console-view-stack-data-resources.md).

Untuk menggunakan AWS CLI untuk mendapatkan template yang diproses, gunakan [get-template](service_code_examples.md#get-template-sdk)perintah.

## Batasan ukuran
<a name="template-macros-size-limitation"></a>

Ukuran maksimum untuk template tumpukan yang diproses adalah 51.200 byte ketika diteruskan langsung ke,, atau `ValidateTemplate` permintaan `CreateStack``UpdateStack`, atau 1 MB saat diteruskan sebagai objek S3 menggunakan URL template Amazon S3. Namun, selama pemrosesan CloudFormation memperbarui status sementara template karena secara serial memproses makro yang terkandung dalam template. Karena itu, ukuran template selama pemrosesan dapat sementara melebihi ukuran yang diizinkan dari templat yang diproses sepenuhnya. CloudFormation memungkinkan beberapa buffer untuk template dalam proses ini. Namun, Anda harus mendesain templat dan makro dengan mengingat ukuran maksimum yang diizinkan untuk templat tumpukan yang diproses.

Jika CloudFormation mengembalikan `Transformation data limit exceeded` kesalahan saat memproses template Anda, template Anda telah melebihi ukuran template maksimum yang CloudFormation memungkinkan selama pemrosesan.

Untuk mengatasi masalah ini, pertimbangkan untuk melakukan hal berikut:
+ Susun ulang templat Anda menjadi beberapa templat untuk menghindari melebihi ukuran maksimum untuk templat dalam proses. Contoh:
  + Gunakan templat tumpukan nested untuk merangkum bagian dari templat. Untuk informasi selengkapnya, lihat [Pisahkan template menjadi potongan-potongan yang dapat digunakan kembali menggunakan tumpukan bersarang](using-cfn-nested-stacks.md).
  + Buat beberapa tumpukan dan gunakan referensi lintas tumpukan untuk saling bertukar informasi. Untuk informasi selengkapnya, lihat [Lihat output sumber daya di tumpukan lain CloudFormation](walkthrough-crossstackref.md).
+ Kurangi ukuran fragmen templat yang dikembalikan oleh makro tertentu. CloudFormation tidak merusak konten fragmen yang dikembalikan oleh makro.

# Pisahkan template menjadi potongan-potongan yang dapat digunakan kembali menggunakan tumpukan bersarang
<a name="using-cfn-nested-stacks"></a>

Seiring pertumbuhan infrastruktur Anda, Anda mungkin menemukan diri Anda berulang kali membuat konfigurasi sumber daya yang identik di beberapa templat. Untuk menghindari redundansi ini, Anda dapat memisahkan konfigurasi umum ini menjadi template khusus. Kemudian, Anda dapat menggunakan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html)sumber daya di templat lain untuk mereferensikan templat khusus ini, membuat tumpukan bersarang.

Misalnya, Anda memiliki konfigurasi penyeimbang beban yang Anda gunakan untuk sebagian besar tumpukan Anda. Alih-alih menyalin dan menempelkan konfigurasi yang sama ke dalam templat, Anda dapat membuat templat khusus untuk penyeimbang beban. Kemudian, Anda dapat mereferensikan template ini dari dalam template lain yang memerlukan konfigurasi penyeimbang beban yang sama.

Tumpukan bersarang sendiri dapat berisi tumpukan bersarang lainnya, menghasilkan hierarki tumpukan, seperti yang ditunjukkan pada diagram di bawah ini. *Tumpukan root adalah tumpukan* tingkat atas yang menjadi milik semua tumpukan bersarang. Setiap tumpukan bersarang memiliki tumpukan induk langsung. Untuk tingkat pertama tumpukan bersarang, tumpukan root juga merupakan tumpukan induk.
+ Tumpukan A adalah tumpukan akar untuk seluruh tumpukan nest dalam hierarki.
+ Untuk tumpukan B, tumpukan A adalah tumpukan induk sekaligus tumpukan akar.
+ Untuk tumpukan D, tumpukan C adalah tumpukan induk; sedangkan untuk tumpukan C, tumpukan B adalah tumpukan induk.

![\[Tumpukan nest, yang dibuat sebagai bagian dari tumpukan lain, memiliki tumpukan induk langsung, dan tumpukan akar tingkat atas.\]](http://docs.aws.amazon.com/id_id/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [Sebelum dan sesudah contoh pemisahan template](#create-nested-stack-template)
+ [Contoh arsitektur tumpukan bersarang](#nested-stack-examples)
+ [Melakukan operasi tumpukan pada tumpukan bersarang](#perform-stack-operations-on-nested-stacks)
+ [Informasi Terkait](#nested-stacks-related-information)

## Sebelum dan sesudah contoh pemisahan template
<a name="create-nested-stack-template"></a>

Contoh ini menunjukkan bagaimana Anda dapat mengambil satu CloudFormation template besar dan mengaturnya kembali menjadi desain yang lebih terstruktur dan dapat digunakan kembali menggunakan templat bersarang. Awalnya, template “Sebelum tumpukan bersarang” menunjukkan semua sumber daya yang ditentukan dalam satu file. Ini bisa menjadi berantakan dan sulit dikelola seiring bertambahnya jumlah sumber daya. Template “After nesting stacks” membagi sumber daya menjadi template yang lebih kecil dan terpisah. Setiap tumpukan bersarang menangani serangkaian sumber daya terkait tertentu, membuat struktur keseluruhan lebih terorganisir dan lebih mudah dirawat.


| Sebelum tumpukan bersarang | Setelah tumpukan bersarang | 
| --- | --- | 
| <pre>AWSTemplateFormatVersion: 2010-09-09<br />Parameters:<br />  InstanceType:<br />    Type: String<br />    Default: t2.micro<br />    Description: The EC2 instance type<br />  <br />  Environment:<br />    Type: String<br />    Default: Production<br />    Description: The deployment environment<br /><br />Resources:<br />  MyEC2Instance:<br />    Type: AWS::EC2::Instance<br />    Properties:<br />      ImageId: ami-1234567890abcdef0<br />      InstanceType: !Ref InstanceType<br /><br />  MyS3Bucket:<br />    Type: AWS::S3::Bucket</pre> | <pre>AWSTemplateFormatVersion: 2010-09-09<br />Resources:<br />  MyFirstNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/first-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        InstanceType: t3.micro<br /><br />  MySecondNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/second-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        Environment: Testing<br />    DependsOn: MyFirstNestedStack</pre> | 

## Contoh arsitektur tumpukan bersarang
<a name="nested-stack-examples"></a>

Bagian ini menunjukkan arsitektur tumpukan bersarang yang terdiri dari tumpukan tingkat atas yang mereferensikan tumpukan bersarang. Tumpukan bersarang menerapkan fungsi Lambda Node.js, menerima nilai parameter dari tumpukan tingkat atas, dan mengembalikan output yang diekspos melalui tumpukan tingkat atas.

**Topics**
+ [Langkah 1: Buat template untuk tumpukan bersarang di sistem lokal Anda](#create-a-nested-stack-template)
+ [Langkah 2: Buat template untuk tumpukan tingkat atas pada sistem lokal Anda](#create-a-nested-stack-parent-template)
+ [Langkah 3: Package dan deploy template](#create-a-nested-stack-parent-template)

### Langkah 1: Buat template untuk tumpukan bersarang di sistem lokal Anda
<a name="create-a-nested-stack-template"></a>

Contoh berikut menunjukkan format template stack bersarang.

#### YAML
<a name="nested-stack-child-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Nested stack template for Lambda function deployment
 3. Parameters:
 4.   MemorySize:
 5.     Type: Number
 6.     Default: 128
 7.     MinValue: 128
 8.     MaxValue: 10240
 9.     Description: Lambda function memory allocation (128-10240 MB)
10. Resources:
11.   LambdaFunction:
12.     Type: AWS::Lambda::Function
13.     Properties:
14.       FunctionName: !Sub "${AWS::StackName}-Function"
15.       Runtime: nodejs18.x
16.       Handler: index.handler
17.       Role: !GetAtt LambdaExecutionRole.Arn
18.       Code:
19.         ZipFile: |
20.           exports.handler = async (event) => {
21.             return {
22.               statusCode: 200,
23.               body: JSON.stringify('Hello from Lambda!')
24.             };
25.           };
26.       MemorySize: !Ref MemorySize
27.   LambdaExecutionRole:
28.     Type: AWS::IAM::Role
29.     Properties:
30.       AssumeRolePolicyDocument:
31.         Version: '2012-10-17'
32.         Statement:
33.           - Effect: Allow
34.             Principal:
35.               Service: lambda.amazonaws.com
36.             Action: sts:AssumeRole
37.       ManagedPolicyArns:
38.         - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
39. Outputs:
40.   LambdaArn:
41.     Description: ARN of the created Lambda function
42.     Value: !GetAtt LambdaFunction.Arn
```

### Langkah 2: Buat template untuk tumpukan tingkat atas pada sistem lokal Anda
<a name="create-a-nested-stack-parent-template"></a>

Contoh berikut menunjukkan format template tumpukan tingkat atas dan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html)sumber daya yang mereferensikan tumpukan yang Anda buat pada langkah sebelumnya.

#### YAML
<a name="nested-stack-parent-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Top-level stack template that deploys a nested stack
 3. Resources:
 4.   NestedStack:
 5.     Type: AWS::CloudFormation::Stack
 6.     Properties:
 7.       TemplateURL: /path_to_template/nested-template.yaml
 8.       Parameters:
 9.         MemorySize: 256
10. Outputs:
11.   NestedStackLambdaArn:
12.     Description: ARN of the Lambda function from nested stack
13.     Value: !GetAtt NestedStack.Outputs.LambdaArn
```

### Langkah 3: Package dan deploy template
<a name="create-a-nested-stack-parent-template"></a>

**catatan**  
Saat bekerja dengan templat secara lokal, AWS CLI **package** perintah dapat membantu Anda menyiapkan templat untuk penerapan. Ini secara otomatis menangani unggahan artefak lokal ke Amazon S3 (`TemplateURL`termasuk) dan menghasilkan file template baru dengan referensi yang diperbarui ke lokasi S3 ini. Untuk informasi selengkapnya, lihat [Unggah artefak lokal ke bucket S3 dengan AWS CLI](using-cfn-cli-package.md). 

Selanjutnya, Anda dapat menggunakan [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html)perintah untuk mengunggah template bersarang ke bucket Amazon S3.

```
aws cloudformation package \
  --s3-bucket amzn-s3-demo-bucket \
  --template /path_to_template/top-level-template.yaml \
  --output-template-file packaged-template.yaml \
  --output json
```

Perintah menghasilkan template baru di jalur yang ditentukan oleh`--output-template-file`. Ini menggantikan `TemplateURL` referensi dengan lokasi Amazon S3, seperti yang ditunjukkan di bawah ini.

**Template yang dihasilkan**

```
AWSTemplateFormatVersion: 2010-09-09
Description: Top-level stack template that deploys a nested stack
Resources:
  NestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket/8b3bb7aa7abfc6e37e2d06b869484bed.template
      Parameters:
        MemorySize: 256
Outputs:
  NestedStackLambdaArn:
    Description: ARN of the Lambda function from nested stack
    Value:
      Fn::GetAtt:
      - NestedStack
      - Outputs.LambdaArn
```

Setelah Anda menjalankan **package** perintah, Anda dapat menggunakan template yang diproses menggunakan [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/)perintah. Untuk tumpukan bersarang yang berisi sumber daya IAM, Anda harus mengakui kemampuan IAM dengan menyertakan opsi. `--capabilities`

```
aws cloudformation deploy \
  --template-file packaged-template.yaml \
  --stack-name stack-name \
  --capabilities CAPABILITY_NAMED_IAM
```

## Melakukan operasi tumpukan pada tumpukan bersarang
<a name="perform-stack-operations-on-nested-stacks"></a>

Saat bekerja dengan tumpukan bersarang, Anda harus menanganinya dengan hati-hati selama operasi. Operasi tumpukan tertentu, seperti pembaruan tumpukan, harus dimulai dari tumpukan root daripada dilakukan langsung pada tumpukan bersarang. Saat Anda memperbarui tumpukan root, hanya tumpukan bersarang dengan perubahan templat yang akan diperbarui. 

Selain itu, keberadaan tumpukan bersarang dapat memengaruhi operasi pada tumpukan root. Misalnya, jika satu tumpukan bersarang macet dalam `UPDATE_ROLLBACK_IN_PROGRESS` status, tumpukan root akan menunggu hingga tumpukan bersarang itu menyelesaikan rollback-nya sebelum melanjutkan. Sebelum melanjutkan dengan operasi pembaruan, pastikan bahwa Anda memiliki izin IAM untuk membatalkan pembaruan tumpukan jika itu kembali. Untuk informasi selengkapnya, lihat [Kontrol CloudFormation akses dengan AWS Identity and Access Management](control-access-with-iam.md).

Gunakan prosedur berikut untuk menemukan tumpukan root dan tumpukan bersarang.

**Untuk melihat tumpukan akar suatu tumpukan nest**

1. Masuk ke Konsol Manajemen AWS dan buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Pada halaman **Stacks**, pilih nama tumpukan bersarang yang ingin Anda lihat tumpukan root.

   Tumpukan bersarang menampilkan **NESTED di atas nama tumpukannya**.

1. Pada tab **Stack info**, di bagian **Ikhtisar**, pilih nama tumpukan yang terdaftar sebagai **tumpukan Root**.

**Untuk melihat tumpukan nest yang dimiliki suatu tumpukan akar**

1. Dari tumpukan root yang tumpukan bersarangnya ingin Anda lihat, pilih tab **Resources**.

1. Di kolom **Type**, cari sumber daya tipe **AWS::CloudFormation::Stack**.

## Informasi Terkait
<a name="nested-stacks-related-information"></a>
+ [Membuat nest tumpukan yang ada](resource-import-nested-stacks.md)
+ [Memahami perilaku pembaruan sumber daya tumpukan](using-cfn-updating-stacks-update-behaviors.md)
+ [Lanjutkan memutar kembali dari pembaruan tumpukan bersarang yang gagal](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [Kegagalan rollback tumpukan bersarang](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)

# Buat kondisi tunggu di CloudFormation template
<a name="using-cfn-waitcondition"></a>

Topik ini menjelaskan cara membuat kondisi tunggu dalam template untuk mengoordinasikan pembuatan sumber daya tumpukan atau melacak kemajuan proses konfigurasi. Misalnya, Anda dapat memulai pembuatan sumber daya lain setelah konfigurasi aplikasi selesai sebagian, atau Anda dapat mengirim sinyal selama proses instalasi dan konfigurasi untuk melacak kemajuannya. 

Saat CloudFormation membuat tumpukan yang menyertakan kondisi tunggu:
+ Ini menciptakan kondisi tunggu seperti sumber daya lainnya dan menetapkan status kondisi tunggu ke`CREATE_IN_PROGRESS`.
+ CloudFormation menunggu sampai menerima jumlah sinyal keberhasilan yang diperlukan atau periode batas waktu tunggu telah kedaluwarsa. 
+ Jika menerima jumlah sinyal keberhasilan yang diperlukan sebelum periode batas waktu berakhir:
  + Status kondisi tunggu berubah menjadi `CREATE_COMPLETE`
  + Pembuatan tumpukan berlanjut
+ Jika batas waktu berakhir atau sinyal kegagalan diterima:
  + Status kondisi tunggu berubah menjadi `CREATE_FAILED`
  + Tumpukan gulungan kembali

**penting**  
Untuk sumber daya Amazon EC2 dan Auto Scaling, sebaiknya gunakan atribut alih-alih CreationPolicy kondisi tunggu. Tambahkan CreationPolicy atribut ke sumber daya tersebut, dan gunakan skrip pembantu sinyal cfn untuk memberi sinyal ketika proses pembuatan instance telah berhasil diselesaikan.  
Untuk informasi lebih lanjut, lihat [Atribut CreationPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-creationpolicy.html).

**catatan**  
Jika Anda menggunakan AWS PrivateLink, sumber daya di VPC yang merespons kondisi tunggu harus memiliki akses ke bucket Amazon Simple Storage Service (Amazon S3) CloudFormation khusus. Sumber daya harus mengirimkan respons kondisi tunggu ke URL Amazon S3 yang telah ditetapkan sebelumnya. Jika mereka tidak dapat mengirim tanggapan ke Amazon S3, tidak CloudFormation akan menerima respons dan operasi tumpukan gagal. Untuk informasi selengkapnya, lihat [Akses CloudFormation menggunakan endpoint antarmuka ()AWS PrivateLink](vpc-interface-endpoints.md) dan [Mengontrol akses dari titik akhir VPC dengan](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html) kebijakan bucket.

**Topics**
+ [Membuat kondisi tunggu di template Anda](#creating-wait-condition)
+ [Tunggu sintaks sinyal kondisi](#wait-condition-signal-syntax)
+ [Mengakses data sinyal](#wait-condition-access-signal-data)

## Membuat kondisi tunggu di template Anda
<a name="creating-wait-condition"></a>

**1. Tunggu kondisi pegangan**  
Anda mulai dengan mendefinisikan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitconditionhandle.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitconditionhandle.html)sumber daya dalam template stack. Sumber daya ini menghasilkan URL presigned yang diperlukan untuk mengirim sinyal. Ini memungkinkan Anda untuk mengirim sinyal tanpa harus memberikan AWS kredensi Anda. Contoh: 

```
Resources:
  MyWaitHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

**2. Kondisi menunggu**  
Selanjutnya, Anda menentukan [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitcondition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitcondition.html)sumber daya dalam template stack. Struktur dasar dari `AWS::CloudFormation::WaitCondition` terlihat seperti ini: 

```
  MyWaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    Properties:
      Handle: String
      Timeout: String
      Count: Integer
```

Sumber `AWS::CloudFormation::WaitCondition` daya memiliki dua properti yang diperlukan dan satu properti opsional.
+ `Handle`(wajib) - Referensi ke yang `WaitConditionHandle` dideklarasikan dalam template.
+ `Timeout`(wajib) — Jumlah detik CloudFormation untuk menunggu jumlah sinyal yang diperlukan untuk diterima. `Timeout`adalah properti terikat minimum, yang berarti batas waktu terjadi tidak lebih cepat dari waktu yang Anda tentukan, tetapi dapat terjadi segera setelahnya. Waktu maksimum yang dapat Anda tentukan adalah 43.200 detik (12 jam).
+ `Count`(opsional) — Jumlah sinyal sukses yang CloudFormation harus diterima sebelum menetapkan status kondisi tunggu itu `CREATE_COMPLETE` dan melanjutkan pembuatan tumpukan. Jika tidak ditentukan, nilai defaultnya adalah 1.

Biasanya, Anda ingin kondisi menunggu dimulai segera setelah pembuatan sumber daya tertentu. Anda melakukan ini dengan menambahkan `DependsOn` atribut ke kondisi tunggu. Saat Anda menambahkan `DependsOn` atribut ke kondisi tunggu, CloudFormation buat sumber daya di `DependsOn` atribut terlebih dahulu, lalu buat kondisi tunggu. Untuk informasi lebih lanjut, lihat [Atribut DependsOn](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html).

Contoh berikut menunjukkan kondisi tunggu yang: 
+ Dimulai setelah penciptaan `MyEC2Instance` sumber daya yang sukses
+ Menggunakan `MyWaitHandle` sumber daya sebagai `WaitConditionHandle`
+ Memiliki batas waktu 4500 detik
+ Memiliki default `Count` 1 (karena tidak ada `Count` properti yang ditentukan)

```
  MyWaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    DependsOn: MyEC2Instance
    Properties:
      Handle: !Ref MyWaitHandle
      Timeout: '4500'
```

**3. Mengirim sinyal**  
Untuk memberi sinyal keberhasilan atau kegagalan CloudFormation, Anda biasanya menjalankan beberapa kode atau skrip. Misalnya, aplikasi yang berjalan pada instans EC2 mungkin melakukan beberapa tugas konfigurasi tambahan dan kemudian mengirim sinyal CloudFormation untuk menunjukkan penyelesaian.

Sinyal harus dikirim ke URL yang telah ditentukan sebelumnya yang dihasilkan oleh pegangan kondisi tunggu. Anda menggunakan URL yang telah ditentukan sebelumnya untuk memberi sinyal keberhasilan atau kegagalan.

**Untuk mengirim sinyal**

1. Untuk mengambil URL presigned dalam template, gunakan fungsi `Ref` intrinsik dengan nama logis dari handle kondisi tunggu. 

   Seperti yang ditunjukkan pada contoh berikut, template Anda dapat mendeklarasikan instans Amazon EC2 dan meneruskan URL yang telah ditetapkan sebelumnya ke instans EC2 menggunakan properti Amazon EC2. `UserData` Hal ini memungkinkan skrip atau aplikasi yang berjalan pada instance tersebut untuk menandakan keberhasilan atau kegagalan. CloudFormation

   ```
     MyEC2Instance:
       Type: AWS::EC2::Instance
       Properties:
       InstanceType: t2.micro  # Example instance type
       ImageId: ami-055e3d4f0bbeb5878  # Change this as needed (Amazon Linux 2023 in us-west-2)
       UserData:
         Fn::Base64: 
           Fn::Join: 
             - ""
             - - "SignalURL="
               - { "Ref": "MyWaitHandle" }
   ```

   Ini menghasilkan `UserData` output yang mirip dengan:

   ```
   SignalURL=https://amzn-s3-demo-bucket.s3.amazonaws.com/....
   ```

   Catatan: Dalam Konsol Manajemen AWS dan alat baris perintah, URL presigned ditampilkan sebagai ID fisik dari sumber daya penanganan kondisi tunggu.

1. (Opsional) Untuk mendeteksi kapan tumpukan memasuki kondisi tunggu, Anda dapat menggunakan salah satu metode berikut:
   + Jika Anda membuat tumpukan dengan pemberitahuan yang diaktifkan, CloudFormation mengeluarkan pemberitahuan untuk setiap peristiwa tumpukan untuk topik tertentu. Jika Anda atau aplikasi Anda berlangganan topik itu, Anda dapat memantau pemberitahuan untuk peristiwa pembuatan penanganan kondisi tunggu dan mengambil URL yang telah ditandatangani dari pesan pemberitahuan.
   + Anda juga dapat memantau peristiwa tumpukan menggunakan Konsol Manajemen AWS, the AWS CLI, atau SDK.

1. Untuk mengirim sinyal, Anda mengirim pesan permintaan HTTP menggunakan URL yang telah ditandatangani. Metode permintaan harus `PUT` dan `Content-Type` header harus berupa string kosong atau dihilangkan. Pesan permintaan harus berupa struktur formulir JSON yang ditentukan dalam [Tunggu sintaks sinyal kondisi](#wait-condition-signal-syntax).

   Anda harus mengirim jumlah sinyal sukses yang ditentukan oleh `Count` properti agar dapat CloudFormation melanjutkan pembuatan tumpukan. Jika Anda memiliki `Count` yang lebih besar dari 1, `UniqueId` nilai untuk setiap sinyal harus unik di semua sinyal yang dikirim ke kondisi tunggu tertentu. `UniqueId`Ini adalah string alfanumerik arbitrer.

   `curl`Perintah adalah salah satu cara untuk mengirim sinyal. Contoh berikut menunjukkan baris `curl` perintah yang menandakan keberhasilan untuk kondisi menunggu.

   ```
   $ curl -T /tmp/a \
     "https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
   ```

   di mana file *`/tmp/a`* berisi struktur JSON berikut:

   ```
   {
      "Status" : "SUCCESS",
      "Reason" : "Configuration Complete",
      "UniqueId" : "ID1234",
      "Data" : "Application has completed configuration."
   }
   ```

   Contoh ini menunjukkan baris `curl` perintah yang mengirimkan sinyal sukses yang sama kecuali mengirimkan struktur JSON sebagai parameter pada baris perintah.

   ```
   $ curl -X PUT \
     -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' \
     "https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
   ```

## Tunggu sintaks sinyal kondisi
<a name="wait-condition-signal-syntax"></a>

Saat Anda mengirim sinyal ke URL yang dihasilkan oleh pegangan kondisi tunggu, Anda harus menggunakan format JSON berikut:

```
{
  "Status" : "StatusValue",
  "UniqueId" : "Some UniqueId",
  "Data" : "Some Data",
  "Reason" : "Some Reason"
}
```

### Sifat-sifat
<a name="wait-condition-signal-properties"></a>

`Status`Bidang harus menjadi salah satu dari nilai berikut:
+ `SUCCESS`
+ `FAILURE`

`UniqueId`Bidang mengidentifikasi sinyal ke CloudFormation. Jika `Count` properti kondisi tunggu lebih besar dari 1, `UniqueId` nilainya harus unik di semua sinyal yang dikirim untuk kondisi tunggu tertentu; jika tidak, CloudFormation akan mempertimbangkan sinyal transmisi ulang dari sinyal yang dikirim sebelumnya dengan yang sama `UniqueId` dan mengabaikannya.

`Data`Bidang dapat berisi informasi apa pun yang ingin Anda kirim kembali dengan sinyal. Anda dapat mengakses `Data` nilai dengan menggunakan GetAtt fungsi [Fn::](resources-section-structure.md#resource-properties-getatt) dalam template.

`Reason`Bidang ini adalah string tanpa batasan lain pada kontennya selain kepatuhan JSON.

## Mengakses data sinyal
<a name="wait-condition-access-signal-data"></a>

Untuk mengakses data yang dikirim oleh sinyal yang valid, Anda dapat membuat nilai output untuk kondisi tunggu di CloudFormation template Anda. Contoh:

```
Outputs:
  WaitConditionData:
    Description: The data passed back as part of signalling the WaitCondition
    Value: !GetAtt MyWaitCondition.Data
```

Anda kemudian dapat melihat data ini menggunakan [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html)perintah, atau tab **Output** CloudFormation konsol.

`Fn::GetAtt`Fungsi mengembalikan `UniqueId` dan `Data` sebagai name/value pasangan dalam struktur JSON. Contoh:

```
{"Signal1":"Application has completed configuration."}
```

# Buat konfigurasi sumber daya yang dapat digunakan kembali yang dapat disertakan di seluruh templat dengan modul CloudFormation
<a name="modules"></a>

*Modul* adalah cara Anda untuk mengemas konfigurasi sumber daya untuk dimasukkan di seluruh tumpukan templat, dengan cara yang transparan, mudah dikelola, dan berulang. Modul dapat merangkum konfigurasi layanan umum dan praktik terbaik sebagai blok bangunan modular yang dapat disesuaikan untuk Anda sertakan dalam templat tumpukan Anda. Modul memungkinkan Anda untuk menyertakan konfigurasi sumber daya yang menggabungkan praktik terbaik, pengetahuan domain ahli, dan pedoman yang diterima (untuk area seperti keamanan, kepatuhan, tata kelola, dan peraturan industri) dalam templat Anda, tanpa harus memiliki pengetahuan mendalam tentang seluk-beluk sumber daya implementasi.

Misalnya, pakar domain dalam jaringan dapat membuat modul yang berisi grup keamanan bawaan dan ingress/egress aturan yang mematuhi pedoman keamanan. Anda kemudian dapat memasukkan modul itu ke dalam template Anda untuk menyediakan infrastruktur jaringan yang aman di tumpukan Anda—tanpa harus menghabiskan waktu mencari tahu cara kerja subnet VPCs, grup keamanan, dan gateway. Dan karena modul berversi, jika pedoman keamanan berubah dari waktu ke waktu, penulis modul dapat membuat versi baru dari modul yang menggabungkan perubahan-perubahan tersebut.

Karakteristik penggunaan modul dalam templat meliputi:
+ **Prediktabilitas** — Modul harus mematuhi skema yang didaftarkan di CloudFormation registri, sehingga Anda tahu sumber daya apa yang dapat diselesaikan setelah Anda memasukkannya ke dalam templat Anda.
+ **Reusability** - Anda dapat menggunakan modul yang sama di beberapa template dan akun.
+ **Keterlacakan** — CloudFormation mempertahankan pengetahuan tentang sumber daya mana dalam tumpukan yang disediakan dari modul, memungkinkan Anda untuk dengan mudah memahami sumber perubahan sumber daya.
+ **Pengelolaan** - Setelah Anda mendaftarkan modul, Anda dapat mengelolanya melalui CloudFormation registri, termasuk pembuatan versi dan akun dan ketersediaan regional.

Sebuah modul dapat berisi:
+ Satu sumber daya atau lebih yang akan ditetapkan dari modul, bersama dengan data yang terkait, seperti output atau kondisi.
+ Semua parameter modul, yang memungkinkan Anda untuk menentukan nilai-nilai kustom setiap kali modul digunakan.

Untuk informasi tentang pengembangan modul, lihat [Mengembangkan modul](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/modules.html) di *Panduan Pengguna CloudFormation CLI*.

**Topics**
+ [Pertimbangan saat menggunakan modul](#module-considerations)
+ [Memahami pembuatan versi modul](module-versioning.md)
+ [Gunakan modul dari registri CloudFormation pribadi](modules-using.md)
+ [Gunakan parameter untuk menentukan nilai modul](module-using-params.md)
+ [Sumber daya modul referensi dalam CloudFormation templat](module-ref-resources.md)

## Pertimbangan saat menggunakan modul
<a name="module-considerations"></a>
+ Tidak ada biaya tambahan untuk menggunakan modul. Anda hanya membayar untuk sumber daya yang diselesaikan modul tersebut di tumpukan Anda.
+ CloudFormation kuota, seperti jumlah maksimum sumber daya yang diizinkan dalam tumpukan, atau ukuran maksimum badan templat, berlaku untuk templat yang diproses apakah sumber daya yang disertakan dalam templat itu berasal dari modul atau tidak. Untuk informasi selengkapnya, lihat [Memahami CloudFormation kuota](cloudformation-limits.md).
+ Tag yang Anda tentukan di tingkat tumpukan ditugaskan ke sumber daya individu yang berasal dari modul.
+ Skrip pembantu yang ditentukan pada tingkat modul tidak menyebar ke sumber daya individu yang terkandung dalam modul saat CloudFormation memproses template.
+ Output yang ditentukan dalam modul disebarkan ke output pada tingkat templat.

  Setiap output akan diberikan ID logis yang merupakan rangkaian dari nama logis modul dan nama output seperti yang didefinisikan dalam modul. Untuk informasi selengkapnya, lihat [Dapatkan output yang diekspor dari tumpukan yang diterapkan CloudFormation](using-cfn-stack-exports.md).
+ Parameter yang ditentukan dalam modul tidak disebarkan ke parameter pada tingkat templat.

  Namun, Anda dapat membuat parameter tingkat templat yang mereferensikan parameter tingkat modul. Lihat informasi yang lebih lengkap di [Gunakan parameter untuk menentukan nilai modul](module-using-params.md).

# Memahami pembuatan versi modul
<a name="module-versioning"></a>

 CloudFormation Registri bertindak sebagai repositori tempat Anda dapat mendaftar dan mengelola modul untuk digunakan di dalam Akun AWS dan Wilayah Anda. Anda dapat mendaftarkan modul dari berbagai sumber, termasuk AWS, penerbit pihak ketiga, dan ekstensi kustom Anda sendiri, dalam akun dan Wilayah Anda. Untuk informasi selengkapnya, lihat [Mengelola ekstensi dengan CloudFormation registri](registry.md).

Modul dapat memiliki versi yang berbeda, sehingga Anda dapat menentukan versi modul yang ingin Anda gunakan. Kemampuan pembuatan versi ini sangat berguna ketika Anda perlu memperbarui atau memodifikasi modul tanpa merusak tumpukan yang ada yang bergantung padanya.

Ingatlah pertimbangan berikut saat menggunakan beberapa versi modul:
+ Selama operasi tumpukan, CloudFormation gunakan versi modul apa pun yang saat ini terdaftar sebagai versi default di Akun AWS dan Wilayah tempat operasi tumpukan sedang dilakukan. Ini termasuk modul yang bersarang di modul lain.

  Oleh karena itu, ketahuilah bahwa jika Anda memiliki versi berbeda dari modul yang sama yang terdaftar sebagai versi default di akun atau Wilayah yang berbeda, menggunakan templat yang sama dapat menghasilkan hasil yang berbeda.
+ Selama operasi tumpukan, CloudFormation gunakan versi sumber daya apa pun yang saat ini terdaftar sebagai versi default di Akun AWS dan Wilayah tempat operasi tumpukan sedang dilakukan. Ini termasuk sumber daya yang dihasilkan dengan menyertakan modul.
+ Mengubah versi default dari modul tidak memulai setiap operasi pembaruan tumpukan. Namun, lain kali Anda melakukan operasi tumpukan dengan template apa pun yang berisi modul itu, seperti pembaruan tumpukan, CloudFormation akan menggunakan versi default baru dalam operasi.

  Satu pengecualian untuk ini adalah melakukan pembaruan tumpukan dengan **menggunakan templat sebelumnya** yang sudah ditentukan, seperti yang dijelaskan di bawah ini.
+ Untuk operasi pembaruan tumpukan, jika Anda menentukan opsi **gunakan templat sebelumnya**, CloudFormation gunakan templat yang diproses sebelumnya untuk pembaruan tumpukan, dan tidak memproses ulang modul untuk perubahan apa pun yang mungkin Anda buat.
+ Untuk menjamin hasil yang seragam, jika Anda menyertakan modul dalam template tumpukan untuk digunakan dengan kumpulan tumpukan, Anda harus memastikan bahwa versi modul yang sama ditetapkan sebagai versi default di semua akun dan Wilayah tempat Anda berencana untuk menerapkan instance tumpukan Anda. Ini termasuk untuk modul yang bersarang di modul lain. Untuk informasi selengkapnya, lihat [Mengelola tumpukan di seluruh akun dan Wilayah dengan StackSets](what-is-cfnstacksets.md).

## Persyaratan untuk mengaktifkan modul publik pihak ketiga
<a name="requirements-for-modules"></a>

Agar berhasil mengaktifkan modul publik pihak ketiga di akun dan Wilayah Anda, berikut ini harus benar untuk setiap ekstensi publik pihak ketiga (sumber daya atau modul) yang disertakan dalam modul:
+ **Aktivasi ekstensi** — Ekstensi harus diaktifkan di akun dan Wilayah tempat Anda ingin menggunakannya. Untuk informasi selengkapnya, lihat [Gunakan ekstensi publik pihak ketiga dari CloudFormation registri](registry-public.md).
+ **Pendaftaran alias** - Jika ekstensi dalam modul menggunakan alias nama tipe, ekstensi harus terdaftar di akun Anda dan Wilayah menggunakan nama jenis alias yang sama. Untuk informasi selengkapnya, lihat [Gunakan alias untuk merujuk ke ekstensi](registry-public.md#registry-public-enable-alias).
+ **Kompatibilitas versi** — Versi ekstensi yang saat ini diaktifkan harus menjadi salah satu versi utama yang didukung dari ekstensi yang ditentukan dalam modul.

Jika Anda tidak memiliki ekstensi publik pihak ketiga yang benar dan versi ekstensi diaktifkan, CloudFormation akan gagal operasi dengan kesalahan daftar ekstensi dan versi yang perlu diaktifkan sebelum modul dapat berhasil diaktifkan.

# Gunakan modul dari registri CloudFormation pribadi
<a name="modules-using"></a>

Topik ini menjelaskan cara menggunakan modul dalam CloudFormation template. Pikirkan modul sebagai bundel sumber daya yang telah dibuat sebelumnya yang dapat Anda tambahkan ke templat Anda.

Untuk menggunakan modul, langkah-langkahnya adalah sebagai berikut:
+ **Daftarkan modul** — Anda mendaftarkan modul dalam CloudFormation registri sebagai ekstensi pribadi. Pastikan itu terdaftar di Akun AWS dan Wilayah tempat Anda bekerja. Untuk informasi selengkapnya, lihat [CloudFormation konsep registri](registry-concepts.md).
+ **Sertakan dalam template Anda** - Tambahkan modul ke [Resources](resources-section-structure.md) bagian CloudFormation template Anda, seperti yang Anda lakukan dengan sumber daya lainnya. Anda juga harus menyediakan properti yang diperlukan untuk modul.
+ **Buat atau perbarui tumpukan** — Saat Anda memulai operasi tumpukan, buat templat yang CloudFormation diproses yang menyelesaikan modul apa pun yang disertakan ke dalam sumber daya yang sesuai. 
+ **Pratinjau perubahan** — Sebelum membuat perubahan, Anda dapat menggunakan set perubahan untuk melihat sumber daya apa yang akan ditambahkan atau diubah. Untuk informasi selengkapnya, lihat [Perbarui CloudFormation tumpukan menggunakan set perubahan](using-cfn-updating-stacks-changesets.md).

Perhatikan contoh berikut: Anda memiliki templat yang berisi sumber daya dan modul. Template berisi satu sumber daya individu`ResourceA`,, serta modul,`ModuleParent`. Modul itu berisi dua sumber daya`ResourceC`, `ResourceB` dan, serta modul bersarang,`ModuleChild`. `ModuleChild`berisi satu sumber daya,`ResourceD`. Jika Anda membuat tumpukan dari template ini, CloudFormation proses template dan menyelesaikan modul ke sumber daya yang sesuai. Tumpukan yang dihasilkan memiliki empat sumber daya: `ResourceA``ResourceB`,,`ResourceC`, dan`ResourceD`.

![\[Selama operasi tumpukan, CloudFormation menyelesaikan dua modul yang disertakan dalam template tumpukan ke dalam empat sumber daya yang sesuai.\]](http://docs.aws.amazon.com/id_id/AWSCloudFormation/latest/UserGuide/images/modules-resource-inclusion.png)


CloudFormation melacak sumber daya mana dalam tumpukan yang dibuat dari modul. Anda dapat melihat informasi ini di **Peristiwa**, **Sumber Daya**, dantab **Drifts** untuk tumpukan tertentu, dan itu juga termasuk dalam perubahan set pratinjau.

Modul dibedakan dari sumber daya dalam template karena mereka mematuhi empat bagian konvensi penamaan berikut, sebagai kebalikan dari konvensi tiga bagian khas yang digunakan oleh sumber daya:

```
organization::service::use-case::MODULE
```

# Gunakan parameter untuk menentukan nilai modul
<a name="module-using-params"></a>

Di CloudFormation, Anda dapat menggunakan parameter template untuk menyesuaikan tumpukan Anda dengan memberikan nilai input selama pembuatan atau pembaruan tumpukan. Parameter ini memungkinkan Anda untuk mengubah aspek-aspek tertentu dari tumpukan berdasarkan kebutuhan Anda. Untuk informasi selengkapnya tentang mendefinisikan parameter template, lihat[CloudFormation Parameterssintaks template](parameters-section-structure.md).

Demikian pula, modul juga dapat memiliki parameter. Parameter modul ini memungkinkan Anda untuk memasukkan nilai kustom ke modul dari template (atau modul lain) yang menggunakannya. Modul kemudian dapat menggunakan nilai-nilai kustom ini untuk menetapkan nilai properti untuk sumber daya yang dikandungnya.

Anda juga dapat menentukan parameter template yang mengatur properti modul, sehingga Anda dapat memasukkan nilai yang diteruskan ke modul pada saat operasi tumpukan. 

Jika modul berisi modul bersarang yang memiliki parameter modulnya sendiri, Anda dapat:
+ Menentukan nilai untuk parameter modul bersarang ini langsung di modul induk.
+ Mendefinisikan parameter modul yang sesuai dalam modul induk yang memungkinkan parameter modul bersarang untuk ditetapkan oleh templat (atau modul) di mana modul induk berada.

## Menggunakan parameter templat untuk menentukan nilai parameter modul
<a name="module-using-params-example-1"></a>

Contoh berikut menunjukkan cara menentukan parameter templat yang lulus nilai modul.

Template ini berisi `My::S3::SampleBucket::MODULE` mendefinisikan parameter template,`BucketName`, yang memungkinkan pengguna untuk menentukan nama bucket S3 selama operasi stack.

```
# Template containing My::S3::SampleBucket::MODULE
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: 'My::S3::SampleBucket::MODULE'
    Properties:
      BucketName: !Ref BucketName
```

## Menentukan properti pada sumber daya dalam modul anak dari modul induk
<a name="module-using-params-example-2"></a>

Contoh berikut menggambarkan cara menentukan nilai parameter dalam modul yang bersarang di modul lain.

Modul pertama ini, `My::S3::SampleBucketPrivate::MODULE`, akan menjadi modul anak. Ini mendefinisikan dua parameter: `BucketName` dan `AccessControl`. Nilai-nilai yang ditentukan untuk parameter ini digunakan untuk menentukan `BucketName` dan `AccessControl` properti `AWS::S3::Bucket` sumber daya yang dimuat modul. Berikut adalah fragmen templat untuk `My::S3::SampleBucketPrivate::MODULE`.

```
# My::S3::SampleBucketPrivate::MODULE
AWSTemplateFormatVersion: 2010-09-09
Description: A sample S3 Bucket with Versioning and DeletionPolicy.
Parameters:
  BucketName:
    Description: Name for the bucket
    Type: String
  AccessControl:
    Description: AccessControl for the bucket
    Type: String
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
      AccessControl: !Ref AccessControl
      DeletionPolicy: Retain
      VersioningConfiguration:
        Status: Enabled
```

Selanjutnya, modul sebelumnya bersarang dalam modul induk, `My::S3::SampleBucket::MODULE`. Modul induk, `My::S3::SampleBucket::MODULE`, menetapkan parameter modul anak dengan cara berikut:
+ Ini menetapkan `AccessControl` parameter `My::S3::SampleBucketPrivate::MODULE` untuk`Private`.
+ Untuk `BucketName`, ia mendefinisikan parameter modul, yang akan memungkinkan nama bucket untuk ditentukan dalam templat (atau modul) yang berisi `My::S3::SampleBucket::MODULE`.

```
# My::S3::SampleBucket::MODULE
AWSTemplateFormatVersion: 2010-09-09
Description: A sample S3 Bucket. With Private AccessControl.
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: 'My::S3::SampleBucketPrivate::MODULE'
    Properties:
      BucketName: !Ref BucketName
      AccessControl: Private
```

## Menentukan kendala untuk parameter modul
<a name="modules-using-parameters-constraints"></a>

Parameter modul tidak mendukung penegakan kendala. Untuk melakukan pemeriksaan kendala pada parameter modul, buat parameter template dengan batasan yang diinginkan. Kemudian, referensikan parameter template itu di parameter modul Anda. Untuk informasi selengkapnya tentang mendefinisikan parameter template, lihat[CloudFormation Parameterssintaks template](parameters-section-structure.md).

# Sumber daya modul referensi dalam CloudFormation templat
<a name="module-ref-resources"></a>

Dalam CloudFormation template, Anda sering perlu mengatur properti pada satu sumber daya berdasarkan nama atau properti sumber daya lain. Untuk informasi selengkapnya, lihat [Referensi sumber daya](resources-section-structure.md#using-cross-resource-references).

Untuk mereferensikan sumber daya yang terkandung dalam modul dalam CloudFormation template Anda, Anda harus menggabungkan dua nama logis:
+ Nama logis yang Anda berikan ke modul itu sendiri ketika Anda memasukkannya ke dalam template Anda.
+ Nama logis dari sumber daya tertentu dalam modul itu.

Anda dapat menggabungkan dua nama logis ini dengan atau tanpa menggunakan titik (.) di antara keduanya. Misalnya, jika nama logis modul adalah `MyModule` dan nama logis sumber daya adalah`MyBucket`, Anda dapat merujuk ke sumber daya itu sebagai salah satu `MyModule.MyBucket` atau`MyModuleMyBucket`.

Untuk menemukan nama logis sumber daya di dalam modul, Anda dapat berkonsultasi dengan skema modul, yang tersedia di CloudFormation registri atau dengan menggunakan [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html)operasi. Skema ini mencantumkan semua sumber daya dan nama logisnya yang merupakan bagian dari modul.

Setelah Anda memiliki nama logis lengkap, Anda dapat menggunakan CloudFormation fungsi seperti `GetAtt` dan `Ref` untuk mengakses nilai properti pada sumber daya modul. 

Misalnya, Anda memiliki `My::S3::SampleBucket::MODULE` modul yang berisi `AWS::S3::Bucket` sumber daya dengan nama logis`S3Bucket`. Untuk merujuk ke nama bucket ini menggunakan `Ref` fungsi, Anda menggabungkan nama modul dalam template (`MyBucket`) Anda dengan nama logis sumber daya dalam modul (`S3Bucket`). Nama logis lengkapnya adalah salah satu `MyBucket.S3Bucket` atau`MyBucketS3Bucket`.

**Contoh Templat**  
Contoh template berikut membuat bucket S3 menggunakan `My::S3::SampleBucket::MODULE` modul. Itu juga membuat antrian Amazon SQS dan mengatur namanya menjadi sama dengan nama bucket dari modul. Selain itu, template menampilkan Amazon Resource Name (ARN) dari bucket S3 yang dibuat.

```
# Template that uses My::S3::SampleBucket::MODULE
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: My::S3::SampleBucket::MODULE
    Properties:
      BucketName: !Ref BucketName
  exampleQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !Ref MyBucket.S3Bucket
Outputs:
  BucketArn:
    Value: !GetAtt MyBucket.S3Bucket.Arn
```