

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

# 步驟 1：在 OpsWorks Stacks 中建立堆疊、layer 和執行個體
<a name="other-services-cp-chef11-stack"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 AWS 支援 團隊。

若要使用 OpsWorks Stacks 做為管道的部署提供者，您必須先在 layer 中擁有堆疊、 layer 和至少一個執行個體。雖然您可以依照 Linux OpsWorks Stacks [入門](https://docs.aws.amazon.com/opsworks/latest/userguide/gettingstarted-linux.html)或 [Windows Stacks 入門中的指示在 Stacks 中建立堆疊](https://docs.aws.amazon.com/opsworks/latest/userguide/gettingstarted-windows.html)，但為了節省您的時間，此範例會使用 AWS CloudFormation 範本來建立 Linux Chef 11.10 堆疊、 layer 和執行個體。此範本建立的執行個體會執行 Amazon Linux 2016.03，且執行個體類型為 `c3.large`。

**重要**  
 CloudFormation 範本必須與稍後上傳應用程式的 Amazon S3 儲存貯體位於相同的區域，以及稍後在 CodePipeline 中建立管道的相同區域。目前，CodePipeline 僅支援美國東部 （維吉尼亞北部） 區域 (us-east-1) 的 OpsWorks Stacks 供應商。此演練中的所有資源都應在美國東部 （維吉尼亞北部） 區域建立。  
如果堆疊建立失敗，您可能即將達到您帳戶的 IAM 角色允許數目上限。如果您的帳戶無法啟動執行個體類型為 `c3.large` 的執行個體，堆疊建立也可能失敗。例如，如果您使用 AWS 免費方案，您可能會收到錯誤，例如 `Root device type: must be included in EBS`。如果您的帳戶對您可以建立的執行個體類型有限制，例如 AWS 免費方案施加的限制，請嘗試將範本執行個體區塊中的 `InstanceType` 參數值變更為您的帳戶可以使用的執行個體類型。

**使用 建立堆疊、 layer 和執行個體 CloudFormation**

1. 將下列 CloudFormation 範本複製到新的純文字文件。將檔案儲存到本機電腦中方便使用的位置，並將其命名為 **NewOpsWorksStack.template** 或您方便使用的其他名稱。

   ```
   {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Mappings": {
       "Region2Principal": {
         "us-east-1": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         },
         "us-west-2": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         },
         "us-west-1": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         },
         "eu-west-1": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         },
         "ap-southeast-1": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         },
         "ap-northeast-1": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         },
         "ap-northeast-2": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         },
         "ap-southeast-2": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         },
         "sa-east-1": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         },
         "cn-north-1": {
           "EC2Principal": "ec2.amazonaws.com.rproxy.govskope.us.cn",
           "OpsWorksPrincipal": "opsworks.amazonaws.com.rproxy.govskope.us.cn"
         },
         "eu-central-1": {
           "EC2Principal": "ec2.amazonaws.com",
           "OpsWorksPrincipal": "opsworks.amazonaws.com"
         }
       }
     },
     "Parameters": {
       "EC2KeyPairName": {
   	  "Type": "String",
   	  "Description": "The name of an existing EC2 key pair that allows you to use SSH to connect to the OpsWorks instance."
   	 }
     },
     "Resources": {
   	"CPOpsDeploySecGroup": {
   	  "Type": "AWS::EC2::SecurityGroup",
   	  "Properties": {
   	    "GroupDescription" : "Lets you manage OpsWorks instances deployed to by CodePipeline"
   	  }
   	},
   	"CPOpsDeploySecGroupIngressHTTP": {
   	  "Type": "AWS::EC2::SecurityGroupIngress",
   	  "Properties" : {
   	    "IpProtocol" : "tcp",
           "FromPort" : "80",
           "ToPort" : "80",
           "CidrIp" : "0.0.0.0/0",
   		"GroupId": {
   		  "Fn::GetAtt": [
   		    "CPOpsDeploySecGroup", "GroupId"
   		  ]
   		}
         }
   	},
   	"CPOpsDeploySecGroupIngressSSH": {
   	  "Type": "AWS::EC2::SecurityGroupIngress",
   	  "Properties" : {
   	    "IpProtocol" : "tcp",
           "FromPort" : "22",
           "ToPort" : "22",
           "CidrIp" : "0.0.0.0/0",
   		"GroupId": {
   		  "Fn::GetAtt": [
   		    "CPOpsDeploySecGroup", "GroupId"
   		  ]
   		}		  
   	  }
   	},
   	"MyStack": {
         "Type": "AWS::OpsWorks::Stack",
         "Properties": {
           "Name": {
             "Ref": "AWS::StackName"
           },
           "ServiceRoleArn": {
             "Fn::GetAtt": [
               "OpsWorksServiceRole",
               "Arn"
             ]
           },
   		"ConfigurationManager" : { "Name": "Chef","Version": "11.10" },
   		"DefaultOs": "Amazon Linux 2016.03",
           "DefaultInstanceProfileArn": {
             "Fn::GetAtt": [
               "OpsWorksInstanceProfile",
               "Arn"
             ]
           }
         }
       },
       "MyLayer": {
         "Type": "AWS::OpsWorks::Layer",
         "Properties": {
           "StackId": {
             "Ref": "MyStack"
           },
           "Name": "MyLayer",
           "Type": "php-app",
   		"Shortname": "mylayer",
           "EnableAutoHealing": "true",
           "AutoAssignElasticIps": "false",
           "AutoAssignPublicIps": "true",
   		"CustomSecurityGroupIds": [
   		  {
   		    "Fn::GetAtt": [
                 "CPOpsDeploySecGroup", "GroupId"
   		    ]
             }			
           ]
         },
         "DependsOn": [
           "MyStack",
           "CPOpsDeploySecGroup"
         ]
       },
       "OpsWorksServiceRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
           "AssumeRolePolicyDocument": {
             "Statement": [
               {
                 "Effect": "Allow",
                 "Principal": {
                   "Service": [
                     {
                       "Fn::FindInMap": [
                         "Region2Principal",
                         {
                           "Ref": "AWS::Region"
                         },
                         "OpsWorksPrincipal"
                       ]
                     }
                   ]
                 },
                 "Action": [
                   "sts:AssumeRole"
                 ]
               }
             ]
           },
           "Path": "/",
           "Policies": [
             {
               "PolicyName": "opsworks-service",
               "PolicyDocument": {
                 "Statement": [
                   {
                     "Effect": "Allow",
                     "Action": [
                       "ec2:*",
                       "iam:PassRole",
                       "cloudwatch:GetMetricStatistics",
                       "elasticloadbalancing:*"
                     ],
                     "Resource": "*"
                   }
                 ]
               }
             }
           ]
         }
       },
       "OpsWorksInstanceProfile": {
         "Type": "AWS::IAM::InstanceProfile",
         "Properties": {
           "Path": "/",
           "Roles": [
             {
               "Ref": "OpsWorksInstanceRole"
             }
           ]
         }
       },
       "OpsWorksInstanceRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
           "AssumeRolePolicyDocument": {
             "Statement": [
               {
                 "Effect": "Allow",
                 "Principal": {
                   "Service": [
                     {
                       "Fn::FindInMap": [
                         "Region2Principal",
                         {
                           "Ref": "AWS::Region"
                         },
                         "EC2Principal"
                       ]
                     }
                   ]
                 },
                 "Action": [
                   "sts:AssumeRole"
                 ]
               }
             ]
           },
           "Path": "/",
   		"Policies": [
             {
               "PolicyName": "s3-get",
               "PolicyDocument": {
                 "Version": "2012-10-17",
                 "Statement": [
                   {
                     "Effect": "Allow",
                     "Action": [
                       "s3:GetObject"
                     ],
                     "Resource": "*"
                   }
                 ]
               }
             }
           ]
         }
       },
       "myinstance": {
         "Type": "AWS::OpsWorks::Instance",
         "Properties": {
           "LayerIds": [
             {
               "Ref": "MyLayer"
             }
           ],
           "StackId": {
             "Ref": "MyStack"
           },
           "InstanceType": "c3.large",
           "SshKeyName": {
   		  "Ref": "EC2KeyPairName"
   		}
         }
       }
     },
     "Outputs": {
       "StackId": {
         "Description": "Stack ID for the newly created AWS OpsWorks stack",
         "Value": {
           "Ref": "MyStack"
         }
       }
     }
   }
   ```

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 在 CloudFormation 首頁上，選擇**建立堆疊**。

1. 在 **Select Template (選取範本)** 頁面上的 **Choose a template (選擇範本)** 區域中，選擇 **Upload a template to Amazon S3 (將範本上傳至 Amazon S3)**，然後選擇 **Browse (瀏覽)**。

1. 瀏覽至您在步驟 1 中儲存的 CloudFormation 範本，然後選擇**開啟**。在 **Select Template** (選取範本) 頁面上，請選擇 **Next** (下一步)。  
![\[AWS CloudFormation Create Stack (建立堆疊) 精靈的 Select Template (選取範本) 頁面。\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/cp_integ_cfstackcreate.png)

1. 在 **Specify Details (指定詳細資訊)** 頁面上，將堆疊命名為 **MyStack** 或對您帳戶而言為唯一的任何堆疊名稱。如果您選擇不同的堆疊名稱，請變更整個本演練中該堆疊的名稱。

1. 在**參數**區域中，提供您要用來在建立 Stacks 執行個體之後存取的 EC2 OpsWorks 金鑰對名稱。選擇**下一步**。

1. 在**選項**頁面上，選擇**下一步**。(本演練不需要執行此頁面上的設定。)

1. 您在此演練中使用的 CloudFormation 範本會建立 IAM 角色、執行個體描述檔和執行個體。
**重要**  
 在選擇**建立**之前，請選擇**成本**來預估使用此範本 AWS 建立資源時可能衍生的費用。

   如果可以建立 IAM 資源，請選取**我確認此範本可能會導致 AWS CloudFormation 建立 IAM 資源**核取方塊，然後選擇**建立**。如果無法建立 IAM 資源，則無法繼續此程序。

1. 在 CloudFormation 儀表板上，您可以檢視建立堆疊的進度。請先等候 **Status (狀態)** 欄位顯示 **CREATE\$1COMPLETE** 後，再繼續進行下一步。  
![\[顯示堆疊建立的 AWS CloudFormation 儀表板。\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/cp_integ_createstack.png)

**驗證在 Stacks OpsWorks 中建立堆疊**

1. 在 https：//[https://console.aws.amazon.com/opsworks/](https://console.aws.amazon.com/opsworks/) 開啟 OpsWorks 主控台。

1. 在 OpsWorks Stacks 儀表板上，檢視您建立的堆疊。  
![\[顯示堆疊建立的 AWS OpsWorks 儀表板。\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/cp_integ_verifystack.png)

1. 開啟堆疊並檢視 layer 和執行個體。請注意，層和執行個體是使用 CloudFormation 範本中提供的名稱和其他中繼資料建立的。您已準備好將應用程式上傳至 Amazon S3 儲存貯體。