

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# CloudFormation 产品入门
<a name="getstarted-CFN"></a>

 您可以使用“入门库”中一个架构良好的产品模板开始使用 AWS Service Catalog ，也可以按照入门教程中的步骤进行操作。

 在本教程中，您将以目录管理员和最终用户的身份执行作业。作为目录管理员，您需要创建产品组合，然后创建产品。作为最终用户，您需验证自己是否可访问最终用户控制台并启动产品。该产品是一个在 Amazon Linux 上运行的云开发环境，基于定义产品可以使用的 AWS 资源的 CloudFormation 模板。

**注意**  
 开始之前，请确保您已完成 [设置 AWS Service Catalog](setup.md) 中的步骤。

**Topics**
+ [

# 第 1 步：下载 CloudFormation 模板
](getstarted-template.md)
+ [

# 步骤 2：创建密钥对
](getstarted-keypair.md)
+ [

# 步骤 3：创建 产品组合
](getstarted-portfolio.md)
+ [

# 步骤 4：在产品组合中创建新产品
](getstarted-product.md)
+ [

# 步骤 5：添加模板约束以限制实例大小
](getstarted-constraint.md)
+ [

# 步骤 6：添加启动约束以分配 IAM 角色
](getstarted-launchconstraint.md)
+ [

# 步骤 7：向最终用户授予产品组合的访问权限
](getstarted-deploy.md)
+ [

# 步骤 8：测试最终用户体验
](getstarted-verify.md)

# 第 1 步：下载 CloudFormation 模板
<a name="getstarted-template"></a>

 您可以使用 CloudFormation 模板来配置和配置产品组合和产品。模板是 JSON 或 YAML 格式的文本文件，描述了您希望预配置的资源。有关更多信息，请参阅 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-formats.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-formats.html) 用户指南* 中的CloudFormation 模板格式*。您可以使用自己选择的 AWS CloudFormation 编辑器或文本编辑器来创建和保存模板。在本教程中，我们提供了一个简单模板来帮助您入门。此模板会启动为 SSH 访问而配置的单个 Linux 实例。

**注意**  
 使用 CloudFormation 模板需要特殊权限。在您开始之前，确保您拥有正确的权限。有关更多信息，请参阅 [入门库](getstarted-library.md) 中的先决条件。

## 模板下载
<a name="template-download"></a>

为本教程提供的示例模板可在 development [https://awsdocs.s3.amazonaws.com/servicecatalog/-envir `development-environment.template` onment.template 上](https://awsdocs.s3.amazonaws.com/servicecatalog/development-environment.template)找到。

## 模板概述
<a name="template-overview"></a>

示例模板的文本如下所示：

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "AWS Service Catalog sample template. Creates an Amazon EC2 instance 
                    running the Amazon Linux AMI. The AMI is chosen based on the region 
                    in which the stack is run. This example creates an EC2 security 
                    group for the instance to give you SSH access. **WARNING** This 
                    template creates an Amazon EC2 instance. You will be billed for the AWS resources used if you create a stack from this template.",

  "Parameters" : {
    "KeyName": {
      "Description" : "Name of an existing EC2 key pair for SSH access to the EC2 instance.",
      "Type": "AWS::EC2::KeyPair::KeyName"
    },

    "InstanceType" : {
      "Description" : "EC2 instance type.",
      "Type" : "String",
      "Default" : "t2.micro",
      "AllowedValues" : [ "t2.micro", "t2.small", "t2.medium", "m3.medium", "m3.large", 
        "m3.xlarge", "m3.2xlarge" ]
    },

    "SSHLocation" : {
      "Description" : "The IP address range that can SSH to the EC2 instance.",
      "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."
   }
  },

  "Metadata" : {
    "AWS::CloudFormation::Interface" : {
      "ParameterGroups" : [{
        "Label" : {"default": "Instance configuration"},
        "Parameters" : ["InstanceType"]
      },{
        "Label" : {"default": "Security configuration"},
        "Parameters" : ["KeyName", "SSHLocation"]
      }],
      "ParameterLabels" : {
        "InstanceType": {"default": "Server size:"},
        "KeyName": {"default": "Key pair:"},
        "SSHLocation": {"default": "CIDR range:"}
      }
    }
  },

  "Mappings" : {
    "AWSRegionArch2AMI" : {
      "us-east-1"      : { "HVM64" : "ami-08842d60" },
      "us-west-2"      : { "HVM64" : "ami-8786c6b7" },
      "us-west-1"      : { "HVM64" : "ami-cfa8a18a" },
      "eu-west-1"      : { "HVM64" : "ami-748e2903" },
      "ap-southeast-1" : { "HVM64" : "ami-d6e1c584" },
      "ap-northeast-1" : { "HVM64" : "ami-35072834" },
      "ap-southeast-2" : { "HVM64" : "ami-fd4724c7" },
      "sa-east-1"      : { "HVM64" : "ami-956cc688" },
      "cn-north-1"     : { "HVM64" : "ami-ac57c595" },
      "eu-central-1"   : { "HVM64" : "ami-b43503a9" }
    }

  },

  "Resources" : {
    "EC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "InstanceType" : { "Ref" : "InstanceType" },
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
        "KeyName" : { "Ref" : "KeyName" },
        "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, "HVM64" ] }
      }
    },

    "InstanceSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Enable SSH access via port 22",
        "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "22",
          "ToPort" : "22",
          "CidrIp" : { "Ref" : "SSHLocation"}
        } ]
      }
    }
  },

  "Outputs" : {
    "PublicDNSName" : {
      "Description" : "Public DNS name of the new EC2 instance",
      "Value" : { "Fn::GetAtt" : [ "EC2Instance", "PublicDnsName" ] }
    },
    "PublicIPAddress" : {
      "Description" : "Public IP address of the new EC2 instance",
      "Value" : { "Fn::GetAtt" : [ "EC2Instance", "PublicIp" ] }
    }
  }
}
```

**模板资源**

模板声明在启动产品时将创建的资源。它包含以下部分：
+ **AWSTemplateFormatVersion**（可选）-用于创建此[AWS 模板的模板格式](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/format-version-structure.html)的版本。最新的模板格式版本是 2010-09-09，并且它是目前唯一的有效值。
+ **描述**（可选） - 模板的描述。
+ **参数**（可选） - 用户必须指定的用于启动产品的参数。对于每个参数，模板包含一个说明，还有键入的值必须满足的约束。有关约束的更多信息，请参阅 [使用 AWS Service Catalog 约束](constraints.md)。

  该`KeyName`参数允许您指定最终用户在使用 AWS Service Catalog 启动您的产品时必须提供的亚马逊弹性计算云 (Amazon EC2) 密钥对名称。您将在接下来的步骤中创建密钥对。
+ **元数据**（可选） - 提供有关模板的其他信息的对象。[AWS::CloudFormation: Interfac](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-interface.html) e 键定义了最终用户控制台视图如何显示参数。`ParameterGroups` 属性定义如何对参数分组以及这些组的标题。`ParameterLabels` 属性定义容易记住的参数名称。当用户指定参数来启动基于此模板的产品时，最终用户控制台视图在标题 `Server size:` 下显示标记为 `Instance configuration` 的参数，并在标题 `Key pair:` 下显示标记为 `CIDR range:` 和 `Security configuration` 的参数。
+ **映射**（可选） - 可用来指定条件参数值的密钥和关键值的映射，与查找表类似。您可以使用 “资源” 和 “输出” 部分中的 [Fn:: FindInMap](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-findinmap.html) 内部函数将键与相应的值进行匹配。上面的模板包括区域列表以及与每个 AWS 区域对应的 Amazon 系统映像 (AMI)。 AWS Service Catalog 使用此映射根据用户在中选择的 AWS 区域来确定要使用的 AMI AWS 管理控制台。
+ **资源**（必需） - 堆栈资源及其属性。您可引用模板的**资源**和**输出**部分中的资源。在上面的模板中，我们指定了一个运行 Amazon Linux 的 EC2 实例和一个允许 SSH 访问该实例的安全组。 EC2 实例资源的 “**属性**” 部分使用用户键入的信息来配置实例类型和 SSH 访问的密钥名称。

  CloudFormation 使用当前 AWS 区域从先前定义的映射中选择 AMI ID 并向其分配安全组。安全组已配置为允许端口 22 上来自用户指定的 CIDR IP 地址范围的入站访问。
+ **输出**（可选） - 告知用户产品启动完成的时间的文本。提供的模板获得已启动实例的公有 DNS 名称并将其显示给用户。用户需要此 DNS 名称来使用 SSH 连接到实例。

  

  有关模板剖析页面的更多信息，请参阅*《CloudFormation 用户指南》*中的[模板参考](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-reference.html)。

# 步骤 2：创建密钥对
<a name="getstarted-keypair"></a>

要使您的最终用户能够启动基于本教程示例模板的产品，您必须创建一个 Amazon EC2 key pair。密钥对是用于加密数据的公有密钥与用于解密数据的私有密钥的组合。有关密钥对的更多信息，请确保您已登录 AWS 控制台，然后查看[亚马逊* EC2 用户指南中的亚马逊 EC2 *密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。

本教程的 CloudFormation 模板包含以下`KeyName`参数：`development-environment.template`

```
. . .
  "Parameters" : {
    "KeyName": {
      "Description" : "Name of an existing EC2 key pair for SSH access to the EC2 instance.",
      "Type": "AWS::EC2::KeyPair::KeyName"
    },
. . .
```

最终用户在使用 AWS Service Catalog 密钥对启动基于模板的产品时必须指定密钥对的名称。

如果您的账户中已有一个您希望使用的密钥对，则可以跳至 [步骤 3：创建 产品组合](getstarted-portfolio.md)。否则，请完成以下步骤。

**创建密钥对**

1. 打开亚马逊 EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中的 **Network & Security** 下，选择 **Key Pairs**。

1. 在 **Key Pairs** 页上，选择 **Create Key Pair**。

1. 对于 **Key pair name**，键入易于记住的名称，然后选择 **Create**。

1. 当控制台提醒您保存私有密钥文件时，请将该文件保存到安全位置。
**重要**  
这是您保存私有密钥文件的唯一机会。

# 步骤 3：创建 产品组合
<a name="getstarted-portfolio"></a>

要为用户提供产品，首先请为这些产品创建产品组合。

**创建产品组合**

1. 打开 Service Catalog 控制台，网址为[https://console.aws.amazon.com/servicecatalog/](https://console.aws.amazon.com/servicecatalog/)。

1. 在左侧的导航窗格中，选择**产品组合**，然后选择**创建产品组合**。

1. 键入以下值：
   + **产品组合名称** – **Engineering Tools**
   + **产品组合描述** — **Sample portfolio that contains a single product.** 
   + **拥有者** – **IT (it@example.com)** 

1. 选择**创建**。

# 步骤 4：在产品组合中创建新产品
<a name="getstarted-product"></a>

创建产品组合后，您就可以在产品组合中创建产品了。在本教程中，您将创建名为 **Linux Desktop** 的产品，该产品是在 Amazon Linux 上运行的云开发环境，位于**工程工具**产品组合内。

**在产品组合中创建产品**

1. 如果您已完成上一步骤，则将显示 **Portfolios** 页面。否则，请打开 [https://console.aws.amazon.com/servicecatalog/](https://console.aws.amazon.com/servicecatalog/)。

1. 选择并打开您在步骤 2 中创建的**工程工具**产品组合。

1. 选择**上传新产品**。

1. 在产品详细信息部分的**创建产品**页面上，输入以下内容：
   + **产品名称** – **Linux Desktop**
   + **产品描述** – **Cloud development environment configured for engineering staff. Runs AWS Linux.**
   + **拥有者** – **IT**
   + **分销商** – *（空白）*

1. 在**版本详细信息**页面上，选择**使用 CloudFormation 模板**。然后选择**指定 Amazon S3 模板 URL** 并输入以下内容：
   + **选择模板** – **https://awsdocs.s3.amazonaws.com/servicecatalog/development-environment.template**
   + **版本标题** – **v1.0**
   + **描述** – **Base Version**

1. 在**支持详细信息**部分，输入以下内容：
   + **联系电子邮件** – **ITSupport@example.com**
   + **支持链接** – **https://wiki.example.com/IT/support**
   + **支持描述** – **Contact the IT department for issues deploying or connecting to this product.**

1. 选择**创建产品**。

# 步骤 5：添加模板约束以限制实例大小
<a name="getstarted-constraint"></a>

约束在产品组合级别添加对产品的另一层控制。约束可以控制产品的启动上下文（启动约束），也可以将规则添加到 CloudFormation 模板（模板约束）。有关更多信息，请参阅 [使用 AWS Service Catalog 约束](constraints.md)。

将模板约束添加到 Linux Desktop 产品可阻止用户在启动时选择大型实例类型。利用开发环境模板，用户能够从 6 个实例类型中进行选择；此约束会将有效的实例类型限制为两个最小的类型：`t2.micro` 和 `t2.small`。有关更多信息，请参阅 *Amazon EC2 用户指南*中的 [T2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/t2-instances.html)。

**将模板约束添加到 Linux Desktop 产品**

1. 在**产品组合详细信息**页面上，选择**约束**，然后选择**创建约束**。

1. 在**创建约束**页面中，对于**产品**项，选择 **Linux Desktop**。然后，对于**约束类型**项，选择**模板**。

1. 在**模板约束**部分，选择**文本编辑器**。

1. 将以下内容粘贴到文本编辑器中：

   ```
   {
     "Rules": {
       "Rule1": {
         "Assertions": [
           {
             "Assert" : {"Fn::Contains": [["t2.micro", "t2.small"], {"Ref": "InstanceType"}]},
             "AssertDescription": "Instance type should be t2.micro or t2.small"
           }
         ]
       }
     }
   }
   ```

1. 在**约束描述**中，输入 **Small instance sizes**。

1.  选择**创建**。

# 步骤 6：添加启动约束以分配 IAM 角色
<a name="getstarted-launchconstraint"></a>

 启动约束指定在最终用户启动产品时 AWS Service Catalog 扮演的 IAM 角色。

 在此步骤中，您将向 Linux 桌面产品添加启动限制，以便 AWS Service Catalog 可以使用构成产品 AWS CloudFormation 模板的 IAM 资源。

 您向产品分配的作为启动约束的 IAM 角色必须具有以下权限 

1. AWS CloudFormation

1. 产品 AWS CloudFormation 模板中的服务

1. 在服务拥有的 Amazon S3 存储桶中读取 AWS CloudFormation 模板的访问权限。

此启动约束让最终用户可以启动产品，并在启动之后将其作为预配置产品进行管理。有关更多信息，请参阅 [AWS Service Catalog 启动约束](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/constraints-launch.html)。

没有启动约束时，您需要先将额外的 IAM 权限授予您的最终用户，他们才能使用 Linux Desktop 产品。例如，该`ServiceCatalogEndUserAccess`策略授予访问 AWS Service Catalog 最终用户控制台视图所需的最低 IAM 权限。

借助使用启动约束，您可以遵循 IAM 最佳实践，将最终用户 IAM 权限保持在最低限度。有关更多信息，请参阅 *IAM 用户指南* 中的[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。

**添加启动约束**

1. 遵照 *IAM 用户指南*中[在 JSON 选项卡上创建新策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)的说明。

1. 在 JSON 策略文档中，粘贴以下内容：
   +  `cloudformation`— 允许创建、读取、更新、删除、列出和标记 CloudFormation 堆栈的 AWS Service Catalog 完全权限。
   +  `ec2`— 允许列出、读取、写入、配置和标记作为产品一部分的亚马逊弹性计算云 (Amazon EC2) 资源的 AWS Service Catalog 全部权限。 AWS Service Catalog 根据您要部署的 AWS 资源，此权限可能会发生变化。
   +  `ec2`— 为您的 AWS 账户创建新的托管策略，并将指定的托管策略附加到指定的 IAM 角色。
   +  `s3`— 允许访问拥有的 Amazon S3 存储桶。 AWS Service Catalog要部署产品， AWS Service Catalog 需要访问配置对象。
   +  `servicecatalog`— 允许 AWS Service Catalog 代表最终用户列出、读取、写入、标记和启动资源。
   +  `sns`— 允许根据启动限制列出、读取、写入和标记 Amazon SNS 主题的 AWS Service Catalog 权限。
**注意**  
 根据您要部署的基础资源，您可能需要修改示例 JSON 策略。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "cloudformation:CreateStack",
                   "cloudformation:DeleteStack",
                   "cloudformation:DescribeStackEvents",
                   "cloudformation:DescribeStacks",
                   "cloudformation:GetTemplateSummary",
                   "cloudformation:SetStackPolicy",
                   "cloudformation:ValidateTemplate",
                   "cloudformation:UpdateStack",
                   "ec2:*",
                   "servicecatalog:*",
                   "sns:*"
               ],
               "Resource": "*"
           },
           {
            "Effect":"Allow",
            "Action":[
               "s3:GetObject"
            ],
            "Resource":"*",
            "Condition":{
               "StringEquals":{
                  "s3:ExistingObjectTag/servicecatalog:provisioning":"true"
               }
            }
         }
       ]
   }
   ```

------

1. 请选择**下一步**，**标签**。

1. 选择**下一步，****审核**。

1. 在**查看策略**页面上，输入 **linuxDesktopPolicy** 作为**名称**。

1. 选择**创建策略**。

1. 在导航窗格中，选择**角色**。然后选择**创建角色**并执行以下操作：

   1. **在 “选择可信实体**” 中，选择 “**AWS 服务**”，然后在 “**其他 AWS 服务的用例**” 下选择 S **ervice Catalog**。选择 Service Catalog 用例，然后选择**下一步**。

   1. 搜索**linuxDesktopPolicy**策略，然后选中该复选框。

   1. 选择**下一步**。

   1. 对于**角色名称**，键入 **linuxDesktopLaunchRole**。

   1. 选择**创建角色**。

1. 在 [https://console.aws.amazon.com/servic](https://console.aws.amazon.com/servicecatalog.) e AWS Service Catalog catalog 上打开控制台。

1. 选择 **Engineering Tools** 产品组合。

1. 在**产品组合详细信息页面**上，选择**约束**选项卡，然后选择**创建约束**。

1. 对于**产品**，选择 **Linux Desktop**，对于**约束类型**，选择**启动**。

1. 请选择**选择 IAM 角色**。接下来选择 “**linuxDesktopLaunch角色**”，然后选择 “**创建**”。

# 步骤 7：向最终用户授予产品组合的访问权限
<a name="getstarted-deploy"></a>

现在，您已创建产品组合并添加产品，可以向最终用户授予访问权限。

**先决条件**  
如果您还没有为最终用户创建 IAM 群组，请参阅 [向 AWS Service Catalog 最终用户授予权限](getstarted-iamenduser.md)。

**提供对产品组合的访问权限**

1. 在产品组合详细信息页面上，选择**访问权限**选项卡。

1. 选择**授予访问权限**。

1. 在**群组**选项卡上，选中最终用户的 IAM 群组复选框。

1. 选择**添加访问权限**。

# 步骤 8：测试最终用户体验
<a name="getstarted-verify"></a>

要验证最终用户能否成功访问最终用户控制台视图并启动您的产品，请以最终用户 AWS 身份登录并执行这些任务。

**验证最终用户可以访问最终用户控制台**

1. 遵照*《IAM 用户指南》*中的[以 IAM 用户身份登录](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html)的说明进行操作。

1.  在菜单栏中，选择您创建`Engineering Tools`投资组合的 AWS 区域。在本教程中，选择 **us-east-1 区域**。

1. 打开 AWS Service Catalog 控制台，[https://console.aws.amazon.com/servicecatalog/](https://console.aws.amazon.com/servicecatalog/)查看：
   + **产品** - 用户可使用的产品。
   + **预配置产品** - 用户已启动的预配置产品。

**要验证最终用户可以启动 Linux Desktop 产品**

请注意，在本教程中，选择 **us-east-1 区域**。

1. 在控制台的**产品**部分，选择 **Linux Desktop**。

1. 选择**启动产品**，启动配置产品的向导。

1. 在**启动：Linux Desktop** 页面上，输入 **Linux-Desktop** 用作预配置产品名称。

1. 在**参数**页面上，输入以下内容，然后选择**下一步**：
   +  **服务器大小** - 选择 **t2.micro**。
   +  **密钥对** - 选择您在 [步骤 2：创建密钥对](getstarted-keypair.md) 中创建的密钥对。
   +  **CIDR 范围** - 输入 IP 地址的有效 CIDR 范围以连接到实例。您可以使用默认值（0.0.0.0/0）以允许从任何 IP 地址进行访问，也可以为后跟 **/32** 的 IP 地址以仅允许您的 IP 地址访问，或者为二者之间的某个值。

1. 选择**启动产品**以启动堆栈。控制台显示 Linux-Desktop 堆栈的堆栈详细信息页面。产品的初始状态是**更改中**。启动该产品需要几分钟。 AWS Service Catalog 要查看当前状态，请刷新您的浏览器。产品启动之后，状态将为**可用**。