

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 CloudFormation 範本新增至您的產品
<a name="cloudformation"></a>

AWS Marketplace 賣方可以使用 AWS CloudFormation 範本列出交付給 AWS Marketplace 買方的 AMI 型產品。將 CloudFormation 範本新增至 AMI 型產品可讓您的買方部署解決方案，而無需手動設定資源和相依性。您可以使用 範本來定義 產品的叢集或分散式架構，或選取不同的 AMI 組合或產品組態。單一 AMI 解決方案最多可包含三個 CloudFormation 範本。

CloudFormation 範本可設定為提供具有相關聯組態檔案和 Lambda 函數的單一 Amazon Machine Image (AMI)。此外，您必須包含每個範本的架構圖。

**Topics**
+ [

## 準備您的 CloudFormation 範本
](#aws-cloudformation-template-preparation)
+ [

## 架構圖
](#topology-diagram)
+ [

## 轉換現有產品的 CloudFormation 範本
](#convert-cloudformation-templates)
+ [

# 新增無伺服器應用程式元件
](cloudformation-serverless-application.md)

## 準備您的 CloudFormation 範本
<a name="aws-cloudformation-template-preparation"></a>

若要建置 CloudFormation 範本，您必須符合範本先決條件，並提供必要的輸入和安全參數。提交 CloudFormation 範本時，請使用下列各節中的準則。

### 範本先決條件
<a name="template-prerequisites"></a>
+ 確認範本已成功透過針對您的產品啟用的所有 CloudFormation 主控台啟動。 ** AWS 區域 **您可以使用 [TaskCat 工具](https://github.com/aws-quickstart/taskcat)來測試您的範本。
+ CloudFormation 範本中包含AMIs 必須是您要發佈產品的 AMI，或 AWS 受管 AMI，例如最新的 Amazon Linux 2。請勿包含您或任何其他第三方擁有和共用的任何社群 AMI 或 AMI。若要使用 AWS 受管 AMI，請在 [AWS Systems Manager 參數存放區中使用公有參數](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-public-parameters.html)，而非硬式編碼 AMI IDs。例如，在指定 AMI ID 的 CloudFormation 範本中，您可以使用動態參考 `ImageId: '{{resolve:ssm:/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id}}'`。
+ 建置範本，使其不依賴特定可用區域 (AZ) 中的使用。並非所有客戶都可以存取所有 AZs，而且 AZs 會針對不同的帳戶進行不同的映射。
+ 如果您使用 Auto Scaling 群組建置叢集解決方案，我們建議您考慮擴展事件。新節點應會自動加入執行中的叢集。
+ 即使對於單一節點產品，我們也建議使用 [Auto Scaling 群組](https://docs.aws.amazon.com/autoscaling/latest/userguide/create-asg-from-instance.html)。
+ 如果您的解決方案涉及多個執行個體的叢集，如果您想要低網路延遲、高網路輸送量，或在執行個體之間同時使用置放群組，請考慮使用置放群組。
+ 為了方便 AWS Marketplace 團隊審查和向客戶提供透明度，我們建議您在 **UserData** 區段中新增評論。

### AMI 詳細資訊的要求
<a name="ami-requirements-sse"></a>

**注意**  
如果您在賣方入口網站的[伺服器產品](https://aws.amazon.com//marketplace/management/products/server)頁面上**使用 CloudFormation 建立 Amazon Machine Image (AMI) 或 AMI**，並收到下載[產品載入表單](https://docs.aws.amazon.com//marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product)的提示，請[使用產品載入表單的 AMI 詳細資訊需求](#ami-requirements-product-load-form)改為參閱 。

指定將 AMI 部署到 EC2 執行個體的資源`ImageId`屬性時，例如 [AWS::EC2::Instance](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-resource-ec2-instance.html)、[AWS::AutoScaling::LaunchConfiguration](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html) 和 [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) 資源，您必須參考[範本參數。](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)參數類型必須是 `AWS::EC2::Image::Id`、 `AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>`或 `String`。

您可以將此範本參數命名為任何有效的參數名稱。 會將您的範本 AWS Marketplace 複製到自己的 Amazon S3 儲存貯體，並以 [AWS Systems Manager 參數存放](https://docs.aws.amazon.com//systems-manager/latest/userguide/systems-manager-parameter-store.html)區參數取代指定的參數。 AWS Marketplace 也會更新描述和限制條件文字，讓部署範本的買方清楚正確的值。當買方部署您的範本時，該參數會解析為您已發佈產品的 AWS 區域特定 AMI ID。

下列範本範例說明使用內部函數 [Ref](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) 參考範本參數的 `ImageId` 屬性。

YAML 範例：

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

JSON 範例：

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

如果您要在[巢狀堆疊](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html)內而非根堆疊內部署 EC2 執行個體，AMI ID 必須動態地從根堆疊繼承其值。編輯您的根和巢狀堆疊，以便在根堆疊中，設定範本參數的值會覆寫此巢狀堆疊中使用的 AMI ID。

### 使用產品載入表單的 AMI 詳細資訊需求
<a name="ami-requirements-product-load-form"></a>

**注意**  
當您在賣方入口網站的[伺服器產品](https://aws.amazon.com//marketplace/management/products/server)頁面上**使用 CloudFormation 建立 Amazon Machine Image (AMI) 或 AMI**，且未立即提示您下載[產品載入表單](https://docs.aws.amazon.com//marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product)時，請參閱 [AMI 詳細資訊的要求](#ami-requirements-sse) 。

AMIs 必須位於每個區域的映射表中。 AWS Marketplace 團隊會在複製 AMI IDs 之後更新這些 ID。您的來源 AMI 必須位於 `us-east-1`區域。其他區域可以使用預留位置。

YAML 範例：

```
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
```

### 巢狀堆疊範本的需求
<a name="nested-stack-template-requirements"></a>

**注意**  
本節僅適用於不使用[產品載入表單](https://docs.aws.amazon.com//marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product)的定價模型。對於*使用*產品載入表單的定價模型，巢狀堆疊`TemplateURL`屬性只允許固定字串。

如果您的範本包含[巢狀堆疊](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html)，巢狀堆疊資源的 `TemplateURL` 屬性必須參考 Amazon S3 儲存貯體名稱、儲存貯體區域和 Amazon S3 物件金鑰字首的範本參數。儲存貯體名稱的參數名稱必須是 `MPS3BucketName`，儲存貯體區域必須是 `MPS3BucketRegion`，而物件金鑰字首必須是 `MPS3KeyPrefix`。

設定這些參數的預設值，以對應至存放巢狀範本的 Amazon S3 儲存貯體。所有巢狀範本都必須可公開存取。當您提交範本進行發佈時， 會將您的範本 AWS Marketplace 複製到自己的 Amazon S3 儲存貯體，並修改這三個參數的屬性，使預設值和允許值設定為與儲存複本的位置相對應。 AWS Marketplace 也會更新描述和限制文字，讓部署範本的買方清楚正確的值。

如果您有多層巢狀堆疊，則必須設定建立其他巢狀堆疊的所有巢狀堆疊，以便 `TemplateURL` 屬性動態繼承根堆疊中的 Amazon S3 儲存貯體名稱、Amazon S3 儲存貯體區域和 Amazon S3 物件金鑰的值。編輯您的根和巢狀堆疊，以便在根堆疊中設定範本參數 `MPS3BucketName`、 和 的值`MPS3BucketRegion`，`MPS3KeyPrefix`覆寫在此巢狀堆疊中使用的 URL 中的個別值，以建立其他巢狀堆疊。

下列範本範例說明使用內部函數 [Fn：：Sub](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html) 參考範本參數的 `TemplateURL` 屬性。

YAML 範例：

```
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
```

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"
                }
            }
        }
    }
}
```

**注意**  
[AWS::CloudFormation::Interface](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-interface.html) 用於定義當買方部署您的範本時，如何在 AWS CloudFormation 主控台中對參數進行分組和排序。

### 範本輸入參數
<a name="template-input-parameters"></a>
+ 範本的輸入參數不得包含 AWS Marketplace 客戶的 AWS 登入資料 （例如密碼、公有金鑰、私有金鑰或憑證）。
+ 對於密碼等敏感輸入參數，請選擇 `NoEcho` 屬性並啟用更強大的規則表達式。對於其他輸入參數，請設定最常見的輸入以及適當的協助程式文字。
+ 在可用的情況下，對輸入使用 CloudFormation 參數類型。
+ 使用 `AWS::CloudFormation::Interface`將輸入參數分組和排序。
+ 請勿為下列輸入參數設定任何預設值：
**注意**  
客戶必須提供這些做為輸入參數。
  + 預設 CIDR 範圍，允許從公有網際網路傳入遠端存取連接埠
  + 預設 CIDR 範圍，允許從公有網際網路傳入資料庫連線連接埠
  + 使用者或資料庫的預設密碼

### 網路和安全性參數
<a name="networksecurity-parameters"></a>
+ 確定預設 SSH 連接埠 (22) 或 RDP 連接埠 (3389) 未開啟至 0.0.0.0。
+ 我們建議您使用適當的存取控制清單 (ACLs) 和安全群組來建置 VPC，而不是使用預設的虛擬私有雲端 (VPC)。
+ 您的範本無法向使用者請求長期存取金鑰，也無法建立他們來存取 AWS 資源。如果您的 AMI 應用程式需要存取買方帳戶中 AWS 的服務，則必須使用 [Amazon EC2 的 IAM 角色](/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。
+ 設定 IAM 角色和政策以[授予最低權限，](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)並僅在絕對必要時啟用寫入存取。例如，如果您的應用程式只需要 `S3:GET`、 `PUT`和 `DELETE`操作，請指定這些動作。`S3:*` 在這種情況下，我們不建議使用 。

收到您的範本後， 會 AWS Marketplace 驗證產品組態和資訊，並提供任何必要修訂的意見回饋。

## 架構圖
<a name="topology-diagram"></a>

您必須為每個範本提供架構圖。若要進一步了解圖表，請參閱[什麼是架構圖表？](https://aws.amazon.com/what-is/architecture-diagramming/)

圖表必須符合下列條件：
+ 說明 上的標準部署 AWS。
+ 在邏輯上描述資源的部署位置。例如，Amazon EC2 執行個體之類的資源位於正確的子網路中。
+ 針對透過 CloudFormation 範本 AWS 服務 部署的每個 ，使用最新的 AWS 產品圖示。若要下載目前一組架構圖示，請參閱[AWS 架構圖示](https://aws.amazon.com/architecture/icons/)。
+ 包含 CloudFormation 範本部署之所有服務的中繼資料。
+ 包含 CloudFormation 範本部署的所有網路、VPCs 和子網路。
+ 顯示整合點，包括第三方資產、APIs 和內部部署、混合資產。
+ 圖表的大小必須為 1100 x 700 像素。維持原始圖表比例，而不進行拉伸或裁切。

## 轉換現有產品的 CloudFormation 範本
<a name="convert-cloudformation-templates"></a>

**注意**  
本節適用於具有具有 CloudFormation 產品之現有 AMI 的賣方，該產品使用[產品載入表單](https://docs.aws.amazon.com/marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product)來發佈其範本，現在想要更新該範本而不使用產品載入表單。如果您要發佈新產品，請參閱[準備 CloudFormation 範本](https://docs.aws.amazon.com/marketplace/latest/userguide/cloudformation.html#aws-cloudformation-template-preparation)。  
如果您在賣方入口網站的[伺服器產品](https://aws.amazon.com//marketplace/management/products/server)頁面上**使用 CloudFormation 建立 Amazon Machine Image (AMI) 或 AMI**，並收到下載[產品載入表單](https://docs.aws.amazon.com//marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product)的提示，請參閱 [使用產品載入表單的 AMI 詳細資訊需求](#ami-requirements-product-load-form)。

如果您想要使用自助式體驗來更新先前使用產品[載入表單](https://docs.aws.amazon.com/marketplace/latest/userguide/product-submission.html#aws-cloudformation-launched-product-free-or-paid-or-usage-based-paid-ami-product)發佈的現有產品，您必須變更現有的 CloudFormation 範本。

下表說明使用產品載入表單與自助式體驗之間的差異：


****  

|  | 產品載入表單 | 自助式體驗 | 
| --- | --- | --- | 
| EC2 資源的ImageId屬性值 | 參考 AMI ID 的映射表。如需詳細資訊，請參閱[使用產品載入表單的 AMI 詳細資訊需求](#ami-requirements-product-load-form)。 | 參考 AMI ID 的範本參數。如需詳細資訊，請參閱[AMI 詳細資訊的要求](#ami-requirements-sse)。 | 
| 巢狀堆疊的TemplateURL屬性值 | 必須是固定字串，且無法使用內部函數。 | 可以使用內部 函數來動態。必須參考一組範本參數。如需詳細資訊，請參閱[巢狀堆疊範本的需求](#nested-stack-template-requirements) | 

下列範例範本說明使用產品載入表單來發佈範本的現有產品範例。在此範例中，AMI ID 為 ，`ami-example123456`而巢狀範本位於位置 的賣方 S3 儲存貯體中`https://sellerbucket.s3.us-east-1.amazonaws.com/sellerproductfolder/nested-template.yaml`。

使用產品載入表單發佈的 YAML 範例：

```
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
```

使用產品載入表單發佈的 JSON 範例：

```
{
    "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"
            }
        }
    }
}
```

下列範本範例說明使用自助式體驗更新產品所需的變更。

以自助式體驗發佈的 YAML 範例：

```
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
```

使用自助式體驗發佈的 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-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"
                }
            }
        }
    }
}
```

# 新增無伺服器應用程式元件
<a name="cloudformation-serverless-application"></a>

**重要**  
AWS Marketplace 不再支援使用從中部署資源的 CloudFormation 範本發佈新產品 AWS Serverless Application Repository。賣方可以繼續使用 CloudFormation 範本來發佈現有的產品，該範本從 開始部署資源， AWS Serverless Application Repository 直到要宣布的未來日期為止。

您可以建立產品，其中包含使用 AWS CloudFormation 範本交付的 Amazon Machine Image (AMI)，並將無伺服器元件整合到產品中。例如，您可以使用設定為控制器伺服器的 AMI 建立產品，並將其做為 CloudFormation 堆疊交付。用來建立堆疊的 CloudFormation 範本可以包含 定義，以設定由伺服器中的事件觸發的 AWS Lambda 函數。當您使用此方法來設計產品時，您可以簡化架構，並讓買方更容易啟動。這種方法也可以讓您更輕鬆地更新產品。以下各節說明如何建立和提供此類產品。

如需為您的產品建立 AMI 的詳細資訊，請參閱 [中的 AMI 型產品 AWS Marketplace](ami-products.md)。如需完成產品 AWS CloudFormation 範本的詳細資訊，請參閱 [將 CloudFormation 範本新增至您的產品](cloudformation.md)。

當您定義無伺服器應用程式時，您可以使用存放在 中的 AWS Serverless Application Model (AWS SAM) 範本 AWS Serverless Application Repository。 AWS SAM 是用於建置無伺服器應用程式的開放原始碼架構。在部署期間， AWS Serverless Application Model 會將語法 AWS SAM 轉換並展開為 CloudFormation 語法。 AWS Serverless Application Repository 是無伺服器應用程式的受管儲存庫。您可以儲存和共用可重複使用的應用程式，讓買方可以組合和部署無伺服器架構。

**注意**  
AWS Marketplace 在建立您的清單之前， 會檢閱並驗證您的產品。如果有在列出優惠之前必須解決的問題，我們會傳送電子郵件訊息給您。
在履行訂閱的過程中，我們會將 AMIs、無伺服器應用程式和 CloudFormation 範本複製到每個 中擁有 AWS Marketplace的儲存庫 AWS 區域。當買方訂閱您的產品時，我們會授予他們存取權，並在您更新軟體時通知他們。

**Topics**
+ [

## 步驟 1：建立無伺服器應用程式
](#cloudformation-serverless-application-procedure-step-1)
+ [

## 步驟 2：將應用程式發佈至儲存庫
](#cloudformation-serverless-application-procedure-step-2)
+ [

## 步驟 3：建立 CloudFormation 範本
](#cloudformation-serverless-application-procedure-step-3)
+ [

## 步驟 4：提交您的 CloudFormation 範本和組態檔案
](#cloudformation-serverless-application-procedure-step-4)
+ [

## 步驟 5：更新您的 AWS Serverless Application Repository 應用程式許可
](#cloudformation-serverless-application-procedure-step-5)
+ [

## 步驟 6：共用您的 AMI
](#cloudformation-serverless-application-procedure-step-6)
+ [

## 步驟 7：使用 AMI 和無伺服器應用程式提交您的 CloudFormation 產品
](#cloudformation-serverless-application-procedure-step-7)

## 步驟 1：建立無伺服器應用程式
<a name="cloudformation-serverless-application-procedure-step-1"></a>

您的第一步是封裝用於建立無伺服器應用程式的 AWS Lambda 函數。您的應用程式是 Lambda 函數、事件來源和其他資源的組合，這些資源可共同執行任務。無伺服器應用程式可以像一個 Lambda 函數一樣簡單，也可以包含具有其他資源的多個函數，例如 APIs、資料庫和事件來源映射。

使用 AWS SAM 為您的無伺服器應用程式定義模型。如需屬性名稱和類型的說明，請參閱 GitHub 上 AWS Labs 中的 [AWS::Serverless::Application](https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication)。以下是具有單一 Lambda 函數和 AWS Identity and Access Management (IAM) 角色的 AWS SAM 範本範例。

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An example of SAM template with Lambda function and IAM role

Resources:
  SampleFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: 'com.sampleproject.SampleHandler::handleRequest'
      Runtime: java8
      CodeUri: 's3://amzn-s3-demo-bucket/2EXAMPLE-1234-4b12-ac37-515EXAMPLEe5-lambda.zip'
      Description: Sample Lambda function
      Timeout: 120
      MemorySize: 1024
      Role:
        Fn::GetAtt: [SampleFunctionRole, Arn]

  # Role to execute the Lambda function
  SampleFunctionRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action: "sts:AssumeRole"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
      Policies:
        - PolicyName: SFNXDeployWorkflowDefinitionPolicy
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "s3:Get*"
                Resource: "*"
      RoleName: "SampleFunctionRole"
```

## 步驟 2：將應用程式發佈至儲存庫
<a name="cloudformation-serverless-application-procedure-step-2"></a>

若要發佈應用程式，您需先上傳應用程式程式碼。將程式碼成品 （例如 Lambda 函數、指令碼、組態檔案） 存放在您帳戶擁有的 Amazon S3 儲存貯體中。當您上傳應用程式時，它最初會設定為私有，這表示它僅適用於 AWS 帳戶 建立它的 。您必須建立 IAM 政策，授予存取您上傳成品的 AWS Serverless Application Repository 許可。

**將無伺服器應用程式發佈至無伺服器應用程式儲存庫**

1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

1. 選擇您用來封裝應用程式的 Amazon S3 儲存貯體。

1. 選擇**許可**索引標籤。

1. 選擇 **Bucket Policy** (儲存貯體政策)。

1. 複製並貼上下列範例政策陳述式。
**注意**  
範例政策陳述式會產生錯誤，直到在下列步驟中更新 `aws:SourceAccount`和 `Resource` 的值為止。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service":  "serverlessrepo.amazonaws.com"
               },
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
               "Condition" : {
                   "StringEquals": {
                       "aws:SourceAccount": "123456789012"
                   }
               }
           }
       ]
   }
   ```

------

   1. 將`Resource`屬性值中的 amzn-s3-demo-bucket 取代為儲存貯體的儲存貯體名稱。

   1. 將 `Condition`元素中的 *123456789012* 取代為您的 AWS 帳戶 ID。`Condition` 元素可確保 AWS Serverless Application Repository 僅具有從指定 存取應用程式的許可 AWS 帳戶。

1. 選擇**儲存**。

1. 在 開啟 AWS Serverless Application Repository 主控台[https://console.aws.amazon.com/serverlessrepo](https://console.aws.amazon.com/serverlessrepo)。

1. 在**我的應用程式**頁面上，選擇**發佈應用程式**。

1. 視需要完成必要欄位和任何選用欄位。必要欄位為：
   +  **Application name (應用程式名稱)** 
   +  **作者** 
   +  **Description** 
   +  **來源碼 URL** 
   +  **SAM 範本** 

1. 選擇**發佈應用程式**。

**發佈應用程式的後續版本**

1. 在 開啟 AWS Serverless Application Repository 主控台[https://console.aws.amazon.com/serverlessrepo](https://console.aws.amazon.com/serverlessrepo)。

1. 在導覽窗格中，從**我的應用程式**選擇應用程式。

1. 選擇 **Publish new version (發佈新版本)**。

如需詳細資訊，請參閱[使用 CLI AWS SAM 發佈無伺服器應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications.html)。

## 步驟 3：建立 CloudFormation 範本
<a name="cloudformation-serverless-application-procedure-step-3"></a>

若要建置 CloudFormation 範本，您必須符合範本先決條件，並提供必要的輸入和安全參數。如需詳細資訊，請參閱*AWS CloudFormation 《 使用者指南*》中的[範本結構](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)。

在 CloudFormation 範本中，您可以參考無伺服器應用程式和 AMI。您也可以在根範本和巢狀範本中使用巢狀 CloudFormation 範本和參考無伺服器應用程式。若要參考無伺服器應用程式，請使用 AWS SAM 範本。您可以從 自動產生應用程式的 AWS SAM 範本 AWS Serverless Application Repository。以下是範例範本。

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An example root template for a SAR application

Resources:
  SampleSARApplication:
    Type: AWS::Serverless::Application
    Properties:
      Location:
         ApplicationId: arn:aws:serverlessrepo:us-east-1:1234567890:applications/TestApplication
         SemanticVersion: 1.0.0
  SampleEC2Instance:
    Type: AWS::EC2::Instance
      Properties: 
        ImageId: "ami-79fd7eee"
        KeyName: "testkey"
        BlockDeviceMappings: 
          - DeviceName: "/dev/sdm"
            Ebs: 
              VolumeType: "io1"
              Iops: "200"
              DeleteOnTermination: "false"
              VolumeSize: "20"
          - DeviceName: "/dev/sdk"
            NoDevice: {}
```

 AWS SAM 範本包含下列元素：
+  `ApplicationID` – 應用程式的 Amazon Resource Name (ARN)。此資訊位於 的**我的應用程式**區段 AWS Serverless Application Repository。
+  `SemanticVersion` – 無伺服器應用程式的版本。您可以從 的**我的應用程式**區段找到此項目 AWS Serverless Application Repository。
+  `Parameter` （選用） – 應用程式參數。

**注意**  
對於 `ApplicationID`和 `SemanticVersion`，不支援[內部函數](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)。您必須硬式編碼這些字串。複製時， `ApplicationID`會更新 AWS Marketplace。

如果您打算參考 CloudFormation 範本中的組態和指令碼檔案，請使用下列格式。對於巢狀範本 (`AWS::Cloudformation::Stack`)，僅支援`TemplateURLs`沒有內部函數的 。記下範本中的`Parameters`內容。

```
AWSTemplateFormatVersion: '2010-09-09'
Metadata:
  Name: Seller test product
Parameters:
  CFTRefFilesBucket:
    Type: String
    Default: "seller-bucket"
  CFTRefFilesBucketKeyPrefix:
    Type: String
    Default: "cftsolutionFolder/additionCFfiles"
Resources:
  TestEc2:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        addCloudAccount:
          files:
            /etc/cfn/set-aia-settings.sh:
              source:
                Fn::Sub:
                - https://${CFTRefFilesBucket}.${S3Region}amazonaws.com/${CFTRefFilesBucketKeyPrefix}/sampleScript.sh
                - S3Region:
                    !If
                    - GovCloudCondition
                    - s3-us-gov-west-1
                    - s3
              owner: root
              mode: '000700'
              authentication: Amazon S3AccessCreds
    ..
    ..
    ..
  SampleNestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: 'https://sellerbucket.s3.amazon.com/sellerproductfolder/nestedCft.template'
      Parameters:
        SampleParameter: 'test'
Transform: AWS::Serverless-2016-10-31
```

## 步驟 4：提交您的 CloudFormation 範本和組態檔案
<a name="cloudformation-serverless-application-procedure-step-4"></a>

若要提交 CloudFormation 範本和組態和指令碼檔案，請授予 AWS Marketplace 許可來讀取存放這些檔案的 Amazon S3 儲存貯體。若要這樣做，請更新您的儲存貯體政策，以包含下列許可。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service":  "assets.marketplace.amazonaws.com"
            },
            "Action": ["s3:GetObject", "s3:ListBucket"],
            "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket",
                         "arn:aws:s3:::amzn-s3-demo-bucket/*"]
        }
    ]
}
```

------

## 步驟 5：更新您的 AWS Serverless Application Repository 應用程式許可
<a name="cloudformation-serverless-application-procedure-step-5"></a>

若要提交您的 AWS Serverless Application Repository 應用程式 AWS Marketplace，您必須授予讀取應用程式的 AWS Marketplace 許可。若要這樣做，請將許可新增至與無伺服器應用程式相關聯的政策。有兩種方式可以更新您的應用程式政策：
+ 前往 [AWS Serverless Application Repository](https://console.aws.amazon.com/serverlessrepo/home)。從清單中選擇無伺服器應用程式。選取**共用**索引標籤，然後選擇**建立陳述**式。在**陳述式組態**頁面上，**assets.marketplace.amazonaws.com**在**帳戶 ID **欄位中輸入下列服務主體 。然後選擇 **Save** (儲存)。
+ 使用下列 AWS CLI 命令來更新您的應用程式政策。

  ```
  aws serverlessrepo put-application-policy \
  --region region \
  --application-id application-arn \
  --statements Principals=assets.marketplace.amazonaws.com,Actions=Deploy
  ```

## 步驟 6：共用您的 AMI
<a name="cloudformation-serverless-application-procedure-step-6"></a>

所有建置並提交至 AMIs AWS Marketplace 都必須遵守所有產品政策。自助式 AMI 掃描可在 中使用 AWS Marketplace 管理入口網站。使用此功能，您可以啟動 AMIs的掃描。您會在單一位置快速收到掃描結果 （通常不到一小時），並提供明確的意見回饋。成功掃描 AMI 之後，請上傳您的產品載入表單，提交 AMI 以供 AWS Marketplace 賣方營運團隊處理。

## 步驟 7：使用 AMI 和無伺服器應用程式提交您的 CloudFormation 產品
<a name="cloudformation-serverless-application-procedure-step-7"></a>

提交產品之前，請記住下列事項：
+ 您必須為每個範本提供架構圖。圖表必須針對透過 CloudFormation 範本部署的每個 AWS 服務使用 AWS 產品圖示。此外，圖表必須包含 服務的中繼資料。若要下載我們的官方 AWS 架構圖示，請參閱[AWS 架構圖示](https://aws.amazon.com/architecture/icons)。
+ 向買方顯示的每個範本的基礎設施成本估算是根據您使用 [AWS 定價計算器](https://calculator.s3.amazonaws.com/index.html)提供的估算。在預估中，包含要部署做為範本一部分的服務清單，以及典型部署的預設值。
+ 完成產品載入表單。您可以從 找到產品載入表單 AWS Marketplace 管理入口網站。單一 AMI 產品和多個 AMI 產品需要不同的產品載入表單。在產品載入表單中，您將為 CloudFormation 範本提供公有 URL。CloudFormation 範本必須以公有 URL 的形式提交。
+ 使用 AWS Marketplace 管理入口網站 提交您的清單。從**資產**中，選擇**檔案上傳**，連接您的檔案，然後選擇**上傳**。在我們收到您的範本和中繼資料後， 會 AWS 開始處理您的請求。

提交清單後， 會 AWS Marketplace 檢閱並驗證產品載入表單。此外， AWS Marketplace 區域化 AMIs和無伺服器應用程式，並代表您更新 CloudFormation 範本的區域映射。如果發生任何問題， AWS Marketplace 賣方營運團隊會透過電子郵件與您聯絡。