

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

# Tambahkan CloudFormation template ke produk Anda
<a name="cloudformation"></a>

AWS Marketplace penjual dapat mencantumkan produk berbasis AMI yang dikirimkan ke AWS Marketplace pembeli dengan menggunakan AWS CloudFormation templat. Menambahkan CloudFormation template ke produk berbasis AMI Anda memungkinkan pembeli Anda untuk menerapkan solusi Anda tanpa harus mengonfigurasi sumber daya dan dependensi secara manual. Anda dapat menggunakan templat untuk menentukan cluster atau arsitektur didistribusikan untuk produk atau untuk memilih kombinasi AMI yang berbeda atau konfigurasi produk. Solusi AMI tunggal dapat berisi maksimal tiga CloudFormation templat.

 CloudFormation Template dapat dikonfigurasi untuk mengirimkan satu Amazon Machine Image (AMI) dengan file konfigurasi terkait dan fungsi Lambda. Selain itu, Anda harus menyertakan diagram arsitektur untuk setiap template.

**Topics**
+ [Mempersiapkan CloudFormation template Anda](#aws-cloudformation-template-preparation)
+ [Diagram arsitektur](#topology-diagram)
+ [Mengkonversi CloudFormation template dari produk yang ada](#convert-cloudformation-templates)
+ [Menambahkan komponen aplikasi tanpa server](cloudformation-serverless-application.md)

## Mempersiapkan CloudFormation template Anda
<a name="aws-cloudformation-template-preparation"></a>

Untuk membangun CloudFormation template Anda, Anda harus memenuhi prasyarat template dan memberikan input dan parameter keamanan yang diperlukan. Saat mengirimkan CloudFormation template Anda, gunakan pedoman di bagian berikut.

### Prasyarat templat
<a name="template-prerequisites"></a>
+ Verifikasi bahwa template berhasil diluncurkan melalui CloudFormation konsol **di semua yang Wilayah AWS diaktifkan untuk produk Anda**. Anda dapat menggunakan [TaskCat alat ini](https://github.com/aws-quickstart/taskcat) untuk menguji template Anda.
+ AMIs yang disertakan dalam CloudFormation template Anda harus berupa AMI dari produk yang Anda terbitkan atau AMI yang dikelola AWS seperti Amazon Linux 2 terbaru. Jangan sertakan komunitas AMI atau AMI yang dimiliki dan dibagikan oleh Anda atau pihak ketiga lainnya. Untuk menggunakan AMI yang dikelola AWS, gunakan [parameter publik di AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-public-parameters.html) alih-alih melakukan hardcoding AMI. IDs Misalnya, dalam CloudFormation template tempat Anda menentukan ID AMI, Anda menggunakan referensi dinamis`ImageId: '{{resolve:ssm:/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id}}'`.
+ Buat templat sehingga tidak bergantung pada penggunaan di Availability Zone (AZ) tertentu. Tidak semua pelanggan memiliki akses ke semua AZs, dan AZs dipetakan secara berbeda untuk akun yang berbeda.
+ Jika Anda membuat solusi kluster menggunakan grup Auto Scaling, sebaiknya akun peristiwa penskalaan. Node baru harus bergabung dengan cluster berjalan secara otomatis.
+ Bahkan untuk produk single-node, kami merekomendasikan untuk menggunakan[Grup Auto Scaling](https://docs.aws.amazon.com/autoscaling/latest/userguide/create-asg-from-instance.html).
+ Jika solusi Anda melibatkan sekelompok peristiwa, pertimbangkan untuk menggunakan grup penempatan jika Anda ingin latensi jaringan rendah, throughput jaringan tinggi, atau keduanya di antara instans.
+ Untuk kemudahan peninjauan oleh AWS Marketplace tim dan transparansi kepada pelanggan, kami sarankan Anda menambahkan komentar di **UserData**bagian Anda.

### Persyaratan untuk detail AMI
<a name="ami-requirements-sse"></a>

**catatan**  
Jika Anda membuat **Amazon Machine Image (AMI) atau AMI dengan CloudFormation** halaman [produk server](https://aws.amazon.com//marketplace/management/products/server) portal penjual dan diminta untuk mengunduh [formulir pemuatan produk](https://docs.aws.amazon.com//marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product), lihat [Persyaratan untuk detail AMI menggunakan formulir pemuatan produk](#ami-requirements-product-load-form) sebagai gantinya.

[Saat menentukan `ImageId` properti sumber daya yang menyebarkan AMI Anda ke instans EC2 seperti [AWS::EC2::Instance](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-resource-ec2-instance.html),, dan [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html)sumber daya [AWS::AutoScaling::LaunchConfiguration](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html), Anda harus mereferensikan parameter templat.](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/parameters-section-structure.html) Jenis parameter harus berupa a`AWS::EC2::Image::Id`,`AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>`, atau`String`.

Anda dapat memberi nama parameter template ini nama parameter yang valid. AWS Marketplace [menyalin template Anda ke bucket Amazon S3 miliknya sendiri dan mengganti parameter yang ditentukan dengan parameter Parameter Store.AWS Systems Manager](https://docs.aws.amazon.com//systems-manager/latest/userguide/systems-manager-parameter-store.html) AWS Marketplace juga memperbarui deskripsi dan teks kendala untuk membuat nilai yang benar jelas bagi pembeli yang menerapkan template. Saat pembeli menerapkan template Anda, parameter tersebut akan menyelesaikan ID Wilayah AWS AMI -spesifik dari produk yang Anda publikasikan.

[Contoh template berikut mengilustrasikan parameter template referensi `ImageId` properti menggunakan fungsi intrinsik Ref.](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)

Contoh YAMG:

```
Parameters:
  ImageId:
    Type: AWS::EC2::Image::Id
    Default: ami-example1234567890
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref ImageId
```

Contoh JSON:

```
{
  "Parameters": {
    "ImageId": {
      "Type": "AWS::EC2::Image::Id",
      "Default": "ami-example1234567890"
    }
  },
  "Resources": {
    "MyInstance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "ImageId": {
          "Ref": "ImageId"
        }
      }
    }
  }
}
```

Jika Anda menerapkan instans EC2 di dalam [tumpukan bersarang alih-alih tumpukan](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html) root, ID AMI harus mewarisi nilainya secara dinamis dari tumpukan root. Edit root dan tumpukan bersarang Anda sehingga di tumpukan root, pengaturan nilai parameter template Anda akan menggantikan ID AMI yang digunakan dalam tumpukan bersarang ini.

### Persyaratan untuk detail AMI menggunakan formulir pemuatan produk
<a name="ami-requirements-product-load-form"></a>

**catatan**  
Saat Anda membuat **Amazon Machine Image (AMI) atau AMI dengan CloudFormation** halaman [produk server](https://aws.amazon.com//marketplace/management/products/server) portal penjual dan tidak segera diminta untuk mengunduh [formulir pemuatan produk](https://docs.aws.amazon.com//marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product), lihat [Persyaratan untuk detail AMI](#ami-requirements-sse) sebagai gantinya.

AMIs harus dalam tabel pemetaan untuk setiap Wilayah. AWS Marketplace Tim memperbarui AMI IDs setelah mereka dikloning. Sumber AMI Anda harus berada di `us-east-1` Wilayah. Wilayah lain dapat menggunakan placeholder.

Contoh YAMG:

```
Mappings: 
  RegionMap: 
      us-east-1: 
          ImageId: ami-0123456789abcdef0
      us-west-1: 
          ImageId: ami-xxxxxxxxxxxxxxxxx
      eu-west-1: 
          ImageId: ami-xxxxxxxxxxxxxxxxx
      ap-southeast-1: 
          ImageId: ami-xxxxxxxxxxxxxxxxx
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap 
        - RegionMap
        - !Ref AWS::Region
        - ImageId
```

### Persyaratan untuk templat tumpukan bersarang
<a name="nested-stack-template-requirements"></a>

**catatan**  
Bagian ini hanya berlaku untuk model penetapan harga yang tidak menggunakan [formulir pemuatan produk](https://docs.aws.amazon.com//marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product). Untuk model penetapan harga *yang menggunakan* formulir pemuatan produk, hanya string tetap yang diizinkan untuk `TemplateURL` properti tumpukan bersarang.

Jika template Anda menyertakan [tumpukan bersarang](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html), `TemplateURL` properti sumber daya tumpukan bersarang harus mereferensikan parameter template untuk nama bucket Amazon S3, Wilayah bucket, dan awalan key objek Amazon S3. Nama parameter untuk nama bucket harus`MPS3BucketName`, Bucket Region harus`MPS3BucketRegion`, dan untuk object key prefix harus. `MPS3KeyPrefix`

Tetapkan nilai default untuk parameter ini agar sesuai dengan bucket Amazon S3 tempat templat bersarang disimpan. Semua template bersarang harus dapat diakses publik. Saat Anda mengirimkan templat untuk diterbitkan, salin templat Anda ke bucket Amazon S3 miliknya sendiri dan memodifikasi properti ketiga parameter tersebut agar nilai default dan nilai yang diizinkan disetel agar sesuai dengan tempat AWS Marketplace salinan disimpan. AWS Marketplace juga memperbarui deskripsi dan teks kendala untuk membuat nilai yang benar jelas bagi pembeli yang menerapkan template.

Jika Anda memiliki beberapa level tumpukan bersarang, semua tumpukan bersarang yang membuat tumpukan bersarang tambahan harus dikonfigurasi sehingga `TemplateURL` properti mewarisi nilai nama bucket Amazon S3, Wilayah bucket Amazon S3, dan kunci objek Amazon S3 secara dinamis dari tumpukan root. Edit root dan tumpukan bersarang Anda sehingga di tumpukan root, atur nilai parameter template `MPS3BucketName``MPS3BucketRegion`, dan `MPS3KeyPrefix` ganti nilainya masing-masing di URL yang digunakan dalam tumpukan bersarang ini untuk membuat tumpukan bersarang tambahan.

[Contoh template berikut mengilustrasikan parameter template referensi `TemplateURL` properti menggunakan fungsi intrinsik Fn: :Sub.](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html)

Contoh YAMG:

```
AWSTemplateFormatVersion: '2010-09-09'
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: AWS Marketplace Parameters
        Parameters:
          - ImageId
          - MPS3BucketName
          - MPS3BucketRegion
          - MPS3KeyPrefix
Parameters:
  ImageId:
    Type: AWS::EC2::Image::Id
    Default: ami-example1234567890
    Description: The AMI that will be used to launch EC2 resources.
  MPS3BucketName:
    Type: String
    Default: sellerbucket
    Description: Name of the S3 bucket for your copy of the nested templates.
  MPS3BucketRegion:
    Type: String
    Default: us-east-1
    Description: AWS Region where the S3 bucket for your copy of the nested templates is hosted.
  MPS3KeyPrefix:
    Type: String
    Default: sellerproductfolder/
    Description: S3 key prefix that is used to simulate a folder for your copy of the nested templates.
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref ImageId
  NestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub https://${MPS3BucketName}.s3.${MPS3BucketRegion}.${AWS::URLSuffix}/${MPS3KeyPrefix}nested-template.yaml
```

Contoh JSON:

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Metadata": {
        "AWS::CloudFormation::Interface": {
            "ParameterGroups": [
                {
                    "Label": {
                        "default": "AWS Marketplace Parameters"
                    },
                    "Parameters": [
                        "ImageId",
                        "MPS3BucketName",
                        "MPS3BucketRegion",
                        "MPS3KeyPrefix"
                    ]
                }
            ]
        }
    },
    "Parameters": {
        "ImageId": {
            "Type": "AWS::EC2::Image::Id",
            "Default": "ami-example1234567890",
            "Description": "The AMI that will be used to launch EC2 resources."
        },
        "MPS3BucketName": {
            "Type": "String",
            "Default": "sellerbucket",
            "Description": "Name of the S3 bucket for your copy of the nested templates."
        },
        "MPS3BucketRegion": {
            "Type": "String",
            "Default": "us-east-1",
            "Description": "AWS Region where the S3 bucket for your copy of the nested templates is hosted."
        },
        "MPS3KeyPrefix": {
            "Type": "String",
            "Default": "sellerproductfolder/",
            "Description": "S3 key prefix that is used to simulate a folder for your copy of the nested templates."
        }
    },
    "Resources": {
        "EC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": {
                    "Ref": "ImageId"
                }
            }
        },
        "NestedStack": {
            "Type": "AWS::CloudFormation::Stack",
            "Properties": {
                "TemplateURL": {
                    "Fn::Sub": "https://${MPS3BucketName}.s3.${MPS3BucketRegion}.${AWS::URLSuffix}/${MPS3KeyPrefix}nested-template.yaml"
                }
            }
        }
    }
}
```

**catatan**  
[AWS::CloudFormation::Interface](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-interface.html)digunakan untuk menentukan bagaimana parameter dikelompokkan dan diurutkan di AWS CloudFormation konsol saat pembeli menerapkan template Anda.

### Parameter input templat
<a name="template-input-parameters"></a>
+ Parameter input ke template tidak boleh menyertakan AWS kredensyal AWS Marketplace pelanggan (seperti kata sandi, kunci publik, kunci pribadi, atau sertifikat).
+ Untuk parameter input sensitif seperti kata sandi, pilih `NoEcho` properti dan aktifkan ekspresi reguler yang lebih kuat. Untuk parameter input lainnya, atur input yang paling umum bersama dengan teks pembantu yang sesuai.
+ Gunakan tipe CloudFormation parameter untuk input jika tersedia.
+ Gunakan`AWS::CloudFormation::Interface`untuk kelompok dan mengurutkan parameter masukan.
+ Jangan menetapkan nilai default apa pun untuk parameter input berikut:
**catatan**  
Pelanggan harus menyediakan ini sebagai parameter input.
  + Rentang CIDR default yang memungkinkan masuknya ke port akses jarak jauh dari internet publik
  + Rentang CIDR default yang memungkinkan masuknya ke port koneksi database dari internet publik
  + Kata sandi default untuk pengguna atau database

### Jaringan dan parameter keamanan
<a name="networksecurity-parameters"></a>
+ Pastikan bahwa port SSH default (22) atau RDP port (3389) tidak terbuka untuk 0.0.0.0.
+ Alih-alih menggunakan virtual private cloud (VPC) default, sebaiknya Anda membuat VPC dengan daftar kontrol akses (ACLs) dan grup keamanan yang sesuai. 
+ Template Anda tidak dapat meminta kunci akses jangka panjang dari pengguna atau membuatnya untuk mengakses AWS sumber daya. Jika aplikasi AMI Anda memerlukan akses ke AWS layanan di akun pembeli, aplikasi tersebut harus menggunakan [peran IAM untuk Amazon EC2](/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html).
+ Tetapkan peran dan kebijakan IAM ke[Berikan hak istimewa yang paling rendah](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)dan aktifkan akses tulis hanya jika benar-benar diperlukan. Misalnya, jika aplikasi Anda hanya perlu`S3:GET`,`PUT`, dan`DELETE`operasi, tentukan tindakan tersebut saja. Kami tidak merekomendasikan penggunaan`S3:*`dalam kasus ini. 

Setelah template Anda diterima, AWS Marketplace validasi konfigurasi dan informasi produk dan memberikan umpan balik untuk setiap revisi yang diperlukan.

## Diagram arsitektur
<a name="topology-diagram"></a>

Anda harus memberikan diagram arsitektur untuk setiap template. Untuk mempelajari lebih lanjut tentang diagram, lihat [Apa itu diagram arsitektur?](https://aws.amazon.com/what-is/architecture-diagramming/)

Diagram harus memenuhi kriteria berikut:
+ Ilustrasikan penerapan standar pada. AWS
+ Menggambarkan secara logis di mana sumber daya dikerahkan. Misalnya, sumber daya seperti instans Amazon EC2 berada di subnet yang benar.
+ Gunakan ikon AWS produk terbaru untuk setiap Layanan AWS dikerahkan melalui CloudFormation template. Untuk mengunduh rangkaian ikon arsitektur saat ini, lihat [Ikon AWS Arsitektur](https://aws.amazon.com/architecture/icons/).
+ Sertakan metadata untuk semua layanan yang digunakan oleh template. CloudFormation 
+ Sertakan semua jaringan, VPCs, dan subnet yang digunakan oleh template. CloudFormation 
+ Tampilkan poin integrasi, termasuk aset pihak ketiga, APIs dan aset hibrida lokal.
+ Diagram harus berukuran 1100 x 700 piksel. Pertahankan proporsi diagram asli tanpa peregangan atau pemotongan.

## Mengkonversi CloudFormation template dari produk yang ada
<a name="convert-cloudformation-templates"></a>

**catatan**  
Bagian ini untuk penjual dengan AMI yang sudah ada dengan CloudFormation produk yang menggunakan [formulir pemuatan produk](https://docs.aws.amazon.com/marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product) untuk mempublikasikan templat mereka dan sekarang ingin memperbarui templat itu tanpa menggunakan formulir pemuatan produk. Jika Anda menerbitkan produk baru, lihat [Mempersiapkan CloudFormation templat Anda](https://docs.aws.amazon.com/marketplace/latest/userguide/cloudformation.html#aws-cloudformation-template-preparation).  
Jika Anda membuat **Amazon Machine Image (AMI) atau AMI dengan CloudFormation** halaman [produk server](https://aws.amazon.com//marketplace/management/products/server) portal penjual dan diminta untuk mengunduh [formulir pemuatan produk](https://docs.aws.amazon.com//marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product), lihat[Persyaratan untuk detail AMI menggunakan formulir pemuatan produk](#ami-requirements-product-load-form).

Jika Anda ingin menggunakan pengalaman swalayan untuk memperbarui produk yang sudah ada yang sebelumnya menggunakan [formulir pemuatan produk](https://docs.aws.amazon.com/marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product) untuk dipublikasikan, Anda harus membuat perubahan pada CloudFormation templat yang ada.

Tabel berikut menjelaskan perbedaan antara menggunakan formulir beban produk dan pengalaman swalayan:


****  

|  | Formulir beban produk | Pengalaman swalayan | 
| --- | --- | --- | 
| Nilai ImageId properti untuk sumber daya EC2 | Mereferensikan tabel pemetaan untuk ID AMI Anda. Untuk informasi selengkapnya, lihat [Persyaratan untuk detail AMI menggunakan formulir pemuatan produk](#ami-requirements-product-load-form).  | Mereferensikan parameter template untuk ID AMI Anda. Untuk informasi selengkapnya, lihat [Persyaratan untuk detail AMI](#ami-requirements-sse).  | 
| Nilai TemplateURL properti untuk tumpukan bersarang | Harus berupa string tetap dan tidak dapat menggunakan fungsi intrinsik. | Bisa dinamis dengan menggunakan fungsi intrinsik. Harus referensi satu set parameter template. Untuk informasi selengkapnya, lihat [Persyaratan untuk templat tumpukan bersarang](#nested-stack-template-requirements) | 

Contoh templat berikut mengilustrasikan contoh produk yang ada yang menggunakan formulir pemuatan produk untuk mempublikasikan template. Dalam contoh ini, ID AMI adalah `ami-example123456` dan template bersarang ada di bucket S3 penjual di lokasi. `https://sellerbucket.s3.us-east-1.amazonaws.com/sellerproductfolder/nested-template.yaml`

Contoh YAMG diterbitkan dengan formulir beban produk:

```
AWSTemplateFormatVersion: '2010-09-09'
Mappings:
  RegionMap:
    us-east-1:
      AMI: ami-example123456
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap 
        - RegionMap
        - !Ref AWS::Region
        - AMI
  NestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://sellerbucket.s3.us-east-1.amazonaws.com/sellerproductfolder/nested-template.yaml
```

Contoh JSON diterbitkan dengan formulir beban produk:

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Mappings": {
        "RegionMap": {
            "us-east-1": {
                "AMI": "ami-example123456"
            }
        }
    },
    "Resources": {
        "EC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": {
                    "Fn::FindInMap": [
                        "RegionMap",
                        {
                            "Ref": "AWS::Region"
                        },
                        "AMI"
                    ]
                }
            }
        },
        "NestedStack": {
            "Type": "AWS::CloudFormation::Stack",
            "Properties": {
                "TemplateURL": "https://sellerbucket.s3.us-east-1.amazonaws.com/sellerproductfolder/nested-template.yaml"
            }
        }
    }
}
```

Contoh template berikut menggambarkan perubahan yang diperlukan untuk menggunakan pengalaman swalayan untuk memperbarui produk.

Contoh YAMG diterbitkan dengan pengalaman swalayan:

```
AWSTemplateFormatVersion: '2010-09-09'
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: AWS Marketplace Parameters
        Parameters:
          - ImageId
          - MPS3BucketName
          - MPS3BucketRegion
          - MPS3KeyPrefix
Parameters:
  ImageId:
    Type: AWS::EC2::Image::Id
    Default: ami-example123456
    Description: The AMI that will be used to launch EC2 resources.
  MPS3BucketName:
    Type: String
    Default: sellerbucket
    Description: Name of the S3 bucket for your copy of the nested templates.
  MPS3BucketRegion:
    Type: String
    Default: us-east-1
    Description: AWS Region where the S3 bucket for your copy of the nested templates is hosted.
  MPS3KeyPrefix:
    Type: String
    Default: sellerproductfolder/
    Description: S3 key prefix that is used to simulate a folder for your copy of the nested templates.
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref ImageId
  NestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub https://${MPS3BucketName}.s3.${MPS3BucketRegion}.${AWS::URLSuffix}/${MPS3KeyPrefix}nested-template.yaml
```

Contoh JSON diterbitkan dengan pengalaman swalayan:

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Metadata": {
        "AWS::CloudFormation::Interface": {
            "ParameterGroups": [
                {
                    "Label": {
                        "default": "AWS Marketplace Parameters"
                    },
                    "Parameters": [
                        "ImageId",
                        "MPS3BucketName",
                        "MPS3BucketRegion",
                        "MPS3KeyPrefix"
                    ]
                }
            ]
        }
    },
    "Parameters": {
        "ImageId": {
            "Type": "AWS::EC2::Image::Id",
            "Default": "ami-example123456",
            "Description": "The AMI that will be used to launch EC2 resources."
        },
        "MPS3BucketName": {
            "Type": "String",
            "Default": "sellerbucket",
            "Description": "Name of the S3 bucket for your copy of the nested templates."
        },
        "MPS3BucketRegion": {
            "Type": "String",
            "Default": "us-east-1",
            "Description": "AWS Region where the S3 bucket for your copy of the nested templates is hosted."
        },
        "MPS3KeyPrefix": {
            "Type": "String",
            "Default": "sellerproductfolder/",
            "Description": "S3 key prefix that is used to simulate a folder for your copy of the nested templates."
        }
    },
    "Resources": {
        "EC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": {
                    "Ref": "ImageId"
                }
            }
        },
        "NestedStack": {
            "Type": "AWS::CloudFormation::Stack",
            "Properties": {
                "TemplateURL": {
                    "Fn::Sub": "https://${MPS3BucketName}.s3.${MPS3BucketRegion}.${AWS::URLSuffix}/${MPS3KeyPrefix}nested-template.yaml"
                }
            }
        }
    }
}
```