逐步解說:建置管線以用於測試和生產堆疊 - AWS CloudFormation

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

逐步解說:建置管線以用於測試和生產堆疊

想像您提交 AWS CloudFormation 範本的發行程序, AWS CloudFormation 然後用來自動建置測試堆疊。檢閱測試堆疊後,您可以預覽您的變更將如何修改您的生產堆疊,然後選擇是否要實作。若要完成此工作流程,您可以使用 AWS CloudFormation 建置測試堆疊、刪除測試堆疊、建立變更集,然後執行變更集。不過,每個動作您都必須手動與 AWS CloudFormation互動。在本演練中,我們將建立 CodePipeline 管道,將許多這些動作自動化,協助您使用 AWS CloudFormation 堆疊實現持續交付工作流程。

必要條件

本演練假設您已使用 CodePipeline 和 AWS CloudFormation,並了解管道、 AWS CloudFormation 範本和堆疊的運作方式。如需 的詳細資訊 CodePipeline,請參閱 AWS CodePipeline 使用者指南 。您也需要在建立管道的相同 AWS 區域中擁有 Amazon S3 儲存貯體。

重要

範例 WordPress 範本會建立需要連線至網際網路的EC2執行個體。檢查您是否具有允許流量至網際網路的預設 VPC和 子網路。

逐步解說概觀

此演練會為堆疊中的範例 WordPress 網站建置管道。此管道分為三個階段。每個階段皆必須至少包含一個動作,它是管道在您的成品 (您的輸入) 上執行的任務。階段會組織管道中的動作。 CodePipeline 必須先完成階段中的所有動作,才能處理新的成品,例如,如果您提交新的輸入以重新執行管道。

在此逐步教學結束時,您將擁有可執行以下工作流程的管道:

  1. 管道的第一個階段會從儲存庫擷取來源成品 ( AWS CloudFormation 範本及其組態檔案)。

    您將準備包含範例 WordPress 範本的成品,並將其上傳至 S3 儲存貯體。

  2. 在第二個階段,管道會建立測試堆疊,然後等待您的核准。

    在您檢閱測試堆疊之後,可選擇繼續使用原始管道或建立並提交另一個成品來進行變更。如果您核准,此階段將會刪除測試堆疊,然後管道將持續至下一個階段。

  3. 在第三個階段,管道會針對生產堆疊建立變更集,然後等待您的核准。

    在您初次執行時,不會有生產堆疊。變更集會顯示 AWS CloudFormation 將建立的所有資源。如果您核准,此階段將執行變更集並建置您的生產堆疊。

注意

AWS CloudFormation 是一項免費服務。不過,您需要支付每個 堆疊中包含 AWS 的資源,例如EC2執行個體,並按照每個資源的目前費率收費。如需 AWS 定價的詳細資訊,請參閱 https://http://aws.amazon.com 中每個產品的詳細資訊頁面。

步驟 1:編輯成品並將它上傳到 S3 儲存貯體

在建置管道之前,您必須設定來源儲存庫和檔案。 CodePipeline 會將這些來源檔案複製到管道的成品存放區 ,然後使用它們在管道中執行動作,例如建立 AWS CloudFormation 堆疊。

當您使用 Amazon Simple Storage Service (Amazon S3) 作為來源儲存庫時, CodePipeline 會要求您先壓縮來源檔案,再將它們上傳至 S3 儲存貯體。壓縮檔案是一種 CodePipeline 成品,可以包含 AWS CloudFormation 範本、範本組態檔案或兩者。我們提供成品,其中包含範例 WordPress 範本和兩個範本組態檔案。兩個組態檔案會指定 WordPress 範本的參數值。建立 WordPress 堆疊時, CodePipeline 會使用它們。其中一個檔案包含測試堆疊的參數值,另一個則包含生產堆疊的參數值。例如,您需要編輯組態檔案,以指定您擁有的現有EC2金鑰對名稱。如需成品的詳細資訊,請參閱 AWS CloudFormation 成品

在您建置成品之後,會將它上傳到 S3 儲存貯體。

編輯和上傳成品
  1. 下載並開啟範例成品:https://s3.amazonaws.com/cloudformation-examples/User-guide/continuous-deployment/wordpress-single-instance.zip。

    此成品包含三個檔案:

    • 範例 WordPress 範本: wordpress-single-instance.yaml

    • 測試堆疊的範本組態檔案:test-stack-configuration.json

    • 生產堆疊的範本組態檔案:prod-stack-configuration.json

  2. 擷取所有檔案,然後使用任何文字編輯器來修改範本組態檔案。

    開啟組態檔案,查看其中包含對應至 WordPress 範本參數的鍵值對。組態檔案指定參數值,您的管道在建立測試和生產堆疊時,將會使用這些參數值。

    編輯 test-stack-configuration.json 檔案以指定測試堆疊的參數值,並指定 prod-stack-configuration.json 檔案以指定生產堆疊的參數值。

    • DBPasswordDBRootPassword索引鍵的值變更為密碼,供您用來登入 WordPress 資料庫。如 WordPress 範本中所定義,參數值只能包含英數字元。

    • KeyName金鑰的值變更為您要建立管道的區域中現有的EC2金鑰對名稱。

  3. 將修改過的組態檔新增至原始成品 (.zip) 檔案,以取代重複的檔案。

    您現在可以自訂成品,並可將它上傳到 S3 儲存貯體。

  4. 將成品上傳到您擁有的 S3 儲存貯體。

    請注意檔案的位置。當您建置管道時,將指定此檔案的位置。

    有關成品和 S3 儲存貯體的說明:

    • 使用位於您要建立管道之相同 AWS 區域中的儲存貯體。

    • CodePipeline 要求儲存貯體已啟用版本控制。

    • 您也可以使用不需要您壓縮檔案的服務,再將它們上傳到來源儲存庫 CodeCommit,例如 GitHub 或 。

    • 成品可以包含敏感的資訊,例如密碼。限制存取,只有獲得允許使用者可以檢視檔案。執行此操作時,請確定 仍然 CodePipeline 可以存取 檔案。

您現在有一個成品 CodePipeline 可以提取到管道。在下一個步驟中,您將指定成品的位置並建置 WordPress 管道。

步驟 2:建立管道堆疊

若要建立 WordPress 管道,您將使用範例 AWS CloudFormation 範本。除了建置管道之外, 範本還會為 CodePipeline 和 設定 AWS Identity and Access Management (IAM) 服務角色 AWS CloudFormation、 CodePipeline 成品存放區的 S3 儲存貯體,以及管道傳送通知的 Amazon Simple Notification Service (AmazonSNS) 主題,例如評論通知。範例範本可讓您輕鬆地在單一 AWS CloudFormation 堆疊中佈建和設定這些資源。

如需管道設定的詳細資訊,請參閱 管道有何功能

重要

範例 WordPress 範本會建立需要連線至網際網路的EC2執行個體。檢查您的預設 VPC 和子網路是否允許網際網路流量。

建立管道堆疊
  1. https://s3.amazonaws.com/cloudformation-examples/user-guide/continuous-deployment/basic-pipeline.yml 下載範例範本。並將它儲存在您的電腦。

  2. 在 開啟 AWS CloudFormation 主控台https://console.aws.amazon.com/cloudformation/

  3. 選擇支援 CodePipeline 和 AWS 的區域 AWS CloudFormation。

    如需詳細資訊,請參閱 AWS 一般參考 中的 AWS 區域與端點

  4. 選擇建立堆疊

  5. Specify template (指定範本) 下方,選擇 Upload a template file (上傳範本檔案),然後選擇您剛剛下載的範本 basic-pipeline.yml

  6. 選擇 Next (下一步)

  7. Stack Name (堆疊名稱) 中輸入 sample-WordPress-pipeline

  8. Parameters (參數) 區段中指定以下參數值,然後選擇 Next (下一步)。設定堆疊參數時,如果您保留 WordPress 範本及其組態檔案的相同名稱,您可以使用預設值。否則,請指定您使用的檔案名稱。

    PipelineName

    您的管道名稱,例如 WordPress-test-pipeline

    S3 儲存貯體

    您用於儲存成品 (.zip 檔案) 的 S3 儲存貯體名稱。

    SourceS3Key

    成品的檔案名稱。如果您將成品儲存於資料夾,請將其作為檔案名稱的一部分包含在內,例如 folder/subfolder/wordpress-single-instance.zip

    電子郵件

    CodePipeline 傳送管道通知的電子郵件地址,例如 myemail@example.com

  9. 在此逐步解說中,您不需要新增標籤或指定進階設定,因此請選擇 Next (下一步)

  10. 確保堆疊名稱和範本URL正確,然後選擇建立堆疊

  11. 若要確認您知道 AWS CloudFormation 可能會建立IAM資源,請選擇核取方塊。

AWS CloudFormation 建立堆疊可能需要幾分鐘的時間。若要監控進度,請檢視堆疊事件。如需詳細資訊,請參閱從 CloudFormation 主控台檢視堆疊資訊

建立堆疊後, 會 CodePipeline 啟動您的新管道。若要檢視其狀態,請參閱CodePipeline 主控台 。從管道清單中,選擇 WordPress-test-pipeline

管道有何功能

本節說明管道的三個階段,使用範例 WordPress 管道範本中的程式碼片段。

階段 1:來源

管道的第一階段是來源階段,您在其中指定原始程式碼的位置。每次將修訂推送到此位置時, 都會 CodePipeline 重新執行您的管道。

原始程式碼位於 S3 儲存貯體,並以其檔案名稱識別。您指定這些值作為您建立管道堆疊時的輸入參數值。為了允許在後續階段使用來源成品,程式碼片段指定 OutputArtifacts 屬性,其名稱為 TemplateSource。為了在之後的階段使用此成品,您指定 TemplateSource 作為輸入成品。

- Name: S3Source Actions: - Name: TemplateSource ActionTypeId: Category: Source Owner: AWS Provider: S3 Version: '1' Configuration: S3Bucket: !Ref 'S3Bucket' S3ObjectKey: !Ref 'SourceS3Key' OutputArtifacts: - Name: TemplateSource

階段 2: TestStage

TestStage 階段,管道會建立測試堆疊、等待您的核准,然後刪除測試堆疊。

對於CreateStack動作,管道會使用測試組態檔案和 WordPress 範本來建立測試堆疊。這兩個檔案包含在從來源階段引進的 TemplateSource 輸入成品中。程式碼片段使用 REPLACE_ON_FAILURE 動作模式。如果堆疊建立失敗,管道將會取代它,因此在重新執行管道之前,您不需要清除或排解堆疊的問題。動作模式對於測試堆疊的快速更新很有用。對於 RoleArn 屬性,該值是 範本中其他地方宣告 AWS CloudFormation 的服務角色。

ApproveTestStack 動作會暫停管道,並傳送通知給您在建立管道堆疊時指定的電子郵件地址。當管道暫停時,您可以檢查 WordPress 測試堆疊及其資源。使用 CodePipeline 來核准或拒絕此動作。CustomData 屬性包含您要核准之動作的描述,核准之後管道會將通知新增至電子郵件。

在您核准此動作之後, 會 CodePipeline 移至DeleteTestStack動作,並刪除測試 WordPress 堆疊及其資源。

- Name: TestStage Actions: - Name: CreateStack ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' InputArtifacts: - Name: TemplateSource Configuration: ActionMode: REPLACE_ON_FAILURE RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref TestStackName TemplateConfiguration: !Sub "TemplateSource::${TestStackConfig}" TemplatePath: !Sub "TemplateSource::${TemplateFileName}" RunOrder: '1' - Name: ApproveTestStack ActionTypeId: Category: Approval Owner: AWS Provider: Manual Version: '1' Configuration: NotificationArn: !Ref CodePipelineSNSTopic CustomData: !Sub 'Do you want to create a change set against the production stack and delete the ${TestStackName} stack?' RunOrder: '2' - Name: DeleteTestStack ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' Configuration: ActionMode: DELETE_ONLY RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref TestStackName RunOrder: '3'

階段 3: ProdStage

管道的 ProdStage 階段會針對現有的生產堆疊建立變更集、等待核准,然後執行變更集。

變更集提供在實作生產堆疊之前 AWS CloudFormation ,所有修改的預覽。在您第一個管道執行時,您不會有執行中的生產堆疊。變更集顯示建立測試堆疊時 AWS CloudFormation 執行的動作。若要建立變更集,CreateChangeSet動作會使用 WordPress 範例範本和TemplateSource輸入成品中的生產範本組態。

類似上個階段,ApproveChangeSet 動作將暫停管道,並傳送電子郵件通知。當管道暫停時,您可以檢視變更集,以檢查對生產 WordPress 堆疊提出的所有修改。使用 CodePipeline 分別核准或拒絕此動作以繼續或停止管道。

核准此動作後,ExecuteChangeSet動作會執行變更集,以便 AWS CloudFormation 執行變更集中所述的所有動作。對於初始執行, 會 AWS CloudFormation 建立 WordPress 生產堆疊。在後續執行時, AWS CloudFormation 將更新堆疊。

- Name: ProdStage Actions: - Name: CreateChangeSet ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' InputArtifacts: - Name: TemplateSource Configuration: ActionMode: CHANGE_SET_REPLACE RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref ProdStackName ChangeSetName: !Ref ChangeSetName TemplateConfiguration: !Sub "TemplateSource::${ProdStackConfig}" TemplatePath: !Sub "TemplateSource::${TemplateFileName}" RunOrder: '1' - Name: ApproveChangeSet ActionTypeId: Category: Approval Owner: AWS Provider: Manual Version: '1' Configuration: NotificationArn: !Ref CodePipelineSNSTopic CustomData: !Sub 'A new change set was created for the ${ProdStackName} stack. Do you want to implement the changes?' RunOrder: '2' - Name: ExecuteChangeSet ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' Configuration: ActionMode: CHANGE_SET_EXECUTE ChangeSetName: !Ref ChangeSetName RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref ProdStackName RunOrder: '3'

步驟 3:檢視 WordPress 堆疊

當透過管道 CodePipeline 執行時,它會使用 AWS CloudFormation 來建立測試和生產堆疊。若要查看這些堆疊及其輸出的狀態,請使用 AWS CloudFormation 主控台。

檢視堆疊
  1. 在 開啟 AWS CloudFormation 主控台https://console.aws.amazon.com/cloudformation/

  2. 根據您的管道處於測試或生產階段,選擇 Test-MyWordPressSiteProd-MyWordPressSite 堆疊。

  3. 若要查看您堆疊的狀態,請檢視堆疊事件

如果堆疊處於故障狀態,請檢視狀態原因以找出堆疊錯誤。修正錯誤,然後重新執行管道。如果堆疊處於 CREATE_COMPLETE 狀態,請檢視其輸出,以取得 WordPress 站台URL的 。

您已成功使用 CodePipeline 為範例 WordPress 網站建置持續交付工作流程。如果您將變更提交至 S3 儲存貯體, CodePipeline 會自動偵測新版本,然後重新執行管道。此工作流程可讓您更容易提交和測試變更,然後再變更您的生產網站。

步驟 4:清除資源

為避免您為不需要的服務支付費用,請刪除您的資源。

重要

在刪除管道 WordPress 堆疊之前,請先刪除測試和生產堆疊。管道堆疊包含刪除 WordPress 堆疊所需的服務角色。如果先刪除管道堆疊,您可以將另一個服務角色 Amazon Resource Name (ARN) 與堆疊建立關聯,然後刪除它們。 WordPress

刪除成品存放區中的物件
  1. 在 開啟 Amazon S3 主控台https://console.aws.amazon.com/s3/

  2. 選擇 CodePipeline 用作管道成品存放區的 S3 儲存貯體。

    儲存貯體的名稱需使用此:stackname-artifactstorebucket-id。如果您依照此逐步解說,儲存貯體名稱可能類似於以下範例:sample-WordPress-pipeline-artifactstorebucket-12345abcd12345

  3. 刪除成品存放區 S3 儲存貯體中的所有物件。

    當您在下個步驟中刪除管道堆疊時,此儲存貯體必須是空的。否則, AWS CloudFormation 無法刪除儲存貯體。

刪除堆疊
  1. 從 AWS CloudFormation 主控台中,選擇要刪除的堆疊。

    如果管道建立的 WordPress 堆疊仍在執行中,請先選擇它們。在預設情況下,堆疊名稱為 Test-MyWordPressSiteProd-MyWordPressSite

    如果您已刪除 WordPress 堆疊,請選擇sample-WordPress-pipeline堆疊。

  2. 選擇 Actions (動作),然後選擇 Delete Stack (刪除堆疊)。

  3. 在確認訊息中,選擇 Yes, Delete (是,刪除)

AWS CloudFormation 會刪除堆疊的所有資源,例如EC2執行個體、通知主題、服務角色和管道。

現在您已了解如何使用 建置基本 AWS CloudFormation 工作流程 CodePipeline,您可以使用範例範本和成品作為建置您自己的起點。

另請參閱

以下相關資源可協助您使用這些參數。

  • 如需 中 AWS CloudFormation 動作參數的詳細資訊 CodePipeline,請參閱 AWS CodePipeline 使用者指南 中的AWS CloudFormation動作組態參考。

  • 如需動作提供者的範例範本值 (例如 Owner 欄位或 configuration 欄位),請參閱 AWS CodePipeline User Guide (《 使用者指南》) 中的 Action structure reference (動作結構參考)。

  • 若要以 YAML或 JSON 格式下載範例管道堆疊範本,請參閱 AWS CodePipeline 使用者指南 中的使用 AWS 建立管道 CloudFormation下的教學課程。

  • 如需範例範本組態檔,請參閱 AWS CloudFormation 成品