

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

# 步驟 2. 建立 AWS Service Catalog 產品
<a name="step-2-create-blueprint-product"></a>

若要建立 AWS Service Catalog 產品，請遵循 *AWS Service Catalog 管理員指南*中[建立產品](https://docs.aws.amazon.com//servicecatalog/latest/adminguide/productmgmt-cloudresource.html)的步驟。建立 AWS Service Catalog 產品時，您會將帳戶藍圖新增為範本。

**重要**  
由於 HashiCorp 更新的 Terraform 授權，將對 *Terraform Open Source* 產品和佈建產品的支援 AWS Service Catalog 變更為新的產品類型，稱為 *External*。若要進一步了解此變更如何影響 AFC，包括如何將現有帳戶藍圖更新為外部產品類型，請檢閱[轉換為外部產品類型](af-customization-page.md#service-catalog-external-product-type)。

**建立藍圖的步驟摘要**
+ 建立或下載將成為您帳戶藍圖的 CloudFormation 範本或 Terraform tar.gz 組態檔案。本節稍後會提供一些範本範例。
+ 登入您存放 Account Factory 藍圖的 AWS 帳戶 （有時稱為中樞帳戶）。
+ 導覽至 AWS Service Catalog 主控台。選擇**產品清單**，然後選擇**上傳新產品**。
+ 在**產品詳細資訊**窗格中，輸入藍圖產品的詳細資訊，例如名稱和描述。
+ 選取**使用範本檔案**，然後選取**選擇檔案**。選取或貼上您開發或下載以用作藍圖的範本或組態檔案。
+ 選擇主控台頁面底部的**建立產品**。

 您可以從 AWS Service Catalog 參考架構儲存庫下載 CloudFormation 範本。[該儲存庫的一個範例有助於為您的 資源設定備份計劃](https://github.com/aws-samples/aws-service-catalog-reference-architectures/blob/master/backup/backup-tagoptions.yml)。

以下是一個範例範本，適用於名為 **Best Pets** 的虛構公司。它有助於設定與其寵物資料庫的連線。

```
Resources:
  ConnectionStringGeneratorLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - "sts:AssumeRole"
  ConnectionStringGeneratorLambda:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: !Join ['-', ['ConnectionStringGenerator', !Select [4, !Split ['-', !Select [2, !Split ['/', !Ref AWS::StackId]]]]]]
      Description: Retrieves the connection string for this account to access the Pet Database
      Role: !GetAtt ConnectionStringGeneratorLambdaRole.Arn
      Runtime: nodejs22.x
      Handler: index.handler
      Timeout: 5
      Code:
        ZipFile: >
           export const handler = async (event, context) => {
             const awsAccountId = context.invokedFunctionArn.split(“:”)[4]
             const connectionString= “fake connection for account ” + awsAccountId;
             const response = {
               statusCode: 200,
               body: connectionString
             };
           return response;
          };

  ConnectionString:
    Type: Custom::ConnectionStringGenerator
    Properties:
      ServiceToken: !GetAtt ConnectionStringGeneratorLambda.Arn

  PetDatabaseConnectionString:
    DependsOn: ConnectionString
    # For example purposes we're using SSM parameter store.
    # In your template, use secure alternatives to store
    # sensitive values such as connection strings.
    Type: AWS::SSM::Parameter
    Properties: 
      Name: pet-database-connection-string
      Description: Connection information for the BestPets pet database
      Type: String
      Value: !GetAtt ConnectionString.Value
```