教學課程:部署無伺服器應用程式 AWS CloudFormation - Amazon CodeCatalyst

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

教學課程:部署無伺服器應用程式 AWS CloudFormation

在本教學課程中,您將學習如何使用工作流程將無伺服器應用程式建置、測試和部署為 CloudFormation 堆疊。

本教程中的應用程序是一個簡單的 Web 應用程序,輸出「Hello World」消息。它由一個 AWS Lambda 函數和一個 Amazon API Gateway 組成,您可以使用 AWS Serverless Application Model (AWS SAM) 來建置它,這是 AWS CloudFormation.

必要條件

開始之前:

  • 您需要具有已連線 AWS 帳戶的 CodeCatalyst 空間。如需詳細資訊,請參閱 建立空間

  • 在您的空間中,您需要一個空的,從頭開始的 CodeCatalyst項目,名為:

    codecatalyst-cfn-project

    如需詳細資訊,請參閱 在 Amazon 中創建一個空項目 CodeCatalyst

  • 在你的項目中,你需要一 CodeCatalyst 名為:

    codecatalyst-cfn-environment

    設定此環境的方式如下:

    • 選擇任何類型,例如非生產

    • 將您的 AWS 帳戶 Connect 到它。

    • 對於預設 IAM 角色,請選擇任何角色。稍後您將指定不同的角色。

    如需詳細資訊,請參閱 使 CodeCatalyst用環境部署到 VPC AWS 帳戶 和 VPC

步驟 1:建立來源儲存庫

在此步驟中,您可以在中建立來源儲存庫 CodeCatalyst。此儲存庫用於儲存教學課程的來源檔案,例如 Lambda 函數檔案。

如需來源儲存庫的詳細資訊,請參閱建立來源儲存庫

若要建立來源儲存庫
  1. 在功能窗格中 CodeCatalyst,選擇 [程式碼],然後選擇 [原始碼儲存庫]。

  2. 選擇 [新增儲存庫],然後選擇 [建立儲存庫]

  3. 存放庫名稱中,輸入:

    codecatalyst-cfn-source-repository
  4. 選擇建立

現在,您已經創建了一個名為codecatalyst-cfn-source-repository.

步驟 2:建立 AWS 角色

在此步驟中,您會建立下列 AWS IAM 角色:

  • 部署角色 — 授與部 CodeCatalyst 署 AWS CloudFormation 堆疊動作權限,以存取您將在其中部署無伺 CloudFormation 服器應用程式的 AWS 帳戶和服務。「部署 AWS CloudFormation 堆疊」動作是工作流程的一部分。

  • 建立角色 — 授與 CodeCatalyst 建立動作權限,以存取您的 AWS 帳戶並寫入存放無伺服器應用程式套件的 Amazon S3。建置動作是工作流程的一部分。

  • 堆疊角色 — CloudFormation 授與讀取和修改您稍後將提供之 AWS SAM 範本中指定之資源的權限。此外,也會授予權限 CloudWatch。

如需 IAM 角色的詳細資訊,請參閱AWS Identity and Access Management 使用者指南中的 IAM 角色

注意

為了節省時間,您可以建立一個稱為角色的單一CodeCatalystWorkflowDevelopmentRole-spaceName角色,而不是先前列出的三個角色。如需詳細資訊,請參閱 為您的帳戶和空間建立CodeCatalystWorkflowDevelopmentRole-spaceName角色。瞭解CodeCatalystWorkflowDevelopmentRole-spaceName角色具有非常廣泛的權限,可能會造成安全風險。我們建議您只在不太擔心安全性的教學課程和案例中使用此角色。本教學課程假設您正在建立先前列出的三個角色。

注意

Lambda 執行角色也是必要的,但您現在不需要建立它,因為當您在步驟 5 中執行工作流程時,sam-template.yml檔案會為您建立角色。

若要建立部署角色
  1. 建立角色的策略,執行方式如下:

    1. 登入到 AWS。

    2. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

    3. 在導覽窗格中,選擇政策

    4. 選擇 Create policy (建立政策)。

    5. 請選擇 JSON 標籤。

    6. 刪除現有的程式碼。

    7. 貼上以下程式碼:

      { "Version": "2012-10-17", "Statement": [{ "Action": [ "cloudformation:CreateStack", "cloudformation:DeleteStack", "cloudformation:Describe*", "cloudformation:UpdateStack", "cloudformation:CreateChangeSet", "cloudformation:DeleteChangeSet", "cloudformation:ExecuteChangeSet", "cloudformation:SetStackPolicy", "cloudformation:ValidateTemplate", "cloudformation:List*", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }] }
      注意

      第一次使用角色執行工作流程動作時,請在資源策略陳述式中使用萬用字元,然後在策略可用之後使用資源名稱縮小策略的範圍。

      "Resource": "*"
    8. 選擇下一步:標籤

    9. 選擇下一步:檢閱

    10. 名稱中,輸入:

      codecatalyst-deploy-policy
    11. 選擇建立政策

      您現在已建立權限原則。

  2. 建立部署角色,如下所示:

    1. 在導覽窗格中,選擇 Roles (角色),然後選擇 Create role (建立角色)

    2. 選擇 [自訂信任原則]。

    3. 刪除現有的自訂信任原則。

    4. 新增下列自訂信任原則:

      { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "codecatalyst-runner.amazonaws.com", "codecatalyst.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
    5. 選擇下一步

    6. 在 [權限] 原則中,搜尋codecatalyst-deploy-policy並選取其核取方塊。

    7. 選擇下一步

    8. 在「角色名稱」中,輸入:

      codecatalyst-deploy-role
    9. 對於「角色」描述,請輸入:

      CodeCatalyst deploy role
    10. 選擇建立角色

    您現在已建立具有信任原則和權限原則的部署角色。

  3. 取得部署角色 ARN,如下所示:

    1. 在導覽窗格中,選擇角色

    2. 在搜尋方塊中,輸入剛建立的角色名稱 (codecatalyst-deploy-role)。

    3. 從清單中選擇角色。

      此時會顯示角色的 [摘要] 頁面。

    4. 在頂端複製 ARN 值。

    您現在已建立具有適當權限的部署角色,並取得其 ARN。

若要建立建置角色
  1. 建立角色的策略,執行方式如下:

    1. 登入到 AWS。

    2. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

    3. 在導覽窗格中,選擇政策

    4. 選擇 Create policy (建立政策)。

    5. 請選擇 JSON 標籤。

    6. 刪除現有的程式碼。

    7. 貼上以下程式碼:

      { "Version": "2012-10-17", "Statement": [{ "Action": [ "s3:PutObject", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }] }
      注意

      第一次使用角色執行工作流程動作時,請在資源策略陳述式中使用萬用字元,然後在策略可用之後使用資源名稱縮小策略的範圍。

      "Resource": "*"
    8. 選擇下一步:標籤

    9. 選擇下一步:檢閱

    10. 名稱中,輸入:

      codecatalyst-build-policy
    11. 選擇建立政策

      您現在已建立權限原則。

  2. 建立組建角色,如下所示:

    1. 在導覽窗格中,選擇 Roles (角色),然後選擇 Create role (建立角色)

    2. 選擇 [自訂信任原則]。

    3. 刪除現有的自訂信任原則。

    4. 新增下列自訂信任原則:

      { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "codecatalyst-runner.amazonaws.com", "codecatalyst.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
    5. 選擇下一步

    6. 在 [權限] 原則中,搜尋codecatalyst-build-policy並選取其核取方塊。

    7. 選擇下一步

    8. 在「角色名稱」中,輸入:

      codecatalyst-build-role
    9. 對於「角色」描述,請輸入:

      CodeCatalyst build role
    10. 選擇建立角色

    您現在已建立具有信任原則和權限原則的組建角色。

  3. 取得建置角色 ARN,如下所示:

    1. 在導覽窗格中,選擇角色

    2. 在搜尋方塊中,輸入剛建立的角色名稱 (codecatalyst-build-role)。

    3. 從清單中選擇角色。

      此時會顯示角色的 [摘要] 頁面。

    4. 在頂端複製 ARN 值。

    您現在已建立具有適當權限的組建角色,並取得其 ARN。

若要建立堆疊角色
  1. AWS 使用您要部署堆疊的帳戶登入。

  2. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

  3. 建立堆疊角色,如下所示:

    1. 在導覽窗格中,選擇 Roles (角色)。

    2. 選擇 Create Role (建立角色)。

    3. 選擇 AWS 服務

    4. 在 [使用案例] 區段中,CloudFormation從下拉式清單中選擇。

    5. 選取選項按CloudFormation鈕。

    6. 選擇底部的 [下一步]。

    7. 使用搜尋方塊尋找下列權限原則,然後選取各自的核取方塊。

      注意

      如果您搜尋的策略並未顯示,請務必選擇 [清除篩選器],然後再試一次。

      • CloudWatchFullAccess

      • AWS CloudFormationFullAccess

      • IAM FullAccess

      • AWS羔羊 FullAccess

      • 亞馬遜 API GatewayAdministrator

      • 亞馬遜 FullAccess

      • 亚马逊 ContainerRegistryFullAccess

      第一個原則允許存取, CloudWatch 以便在發生警示時啟用堆疊復原。

      其餘的原則 AWS SAM 允許存取將在本教學課程中部署的堆疊中的服務和資源。如需詳細資訊,請參閱AWS Serverless Application Model 開發人員指南中的權限

    8. 選擇下一步

    9. 在「角色名稱」中,輸入:

      codecatalyst-stack-role
    10. 選擇建立角色

  4. 取得堆疊角色的 ARN,如下所示:

    1. 在導覽窗格中,選擇角色

    2. 在搜尋方塊中,輸入剛建立的角色名稱 (codecatalyst-stack-role)。

    3. 從清單中選擇角色。

    4. 在「摘要」段落中,複製 ARN 值。供稍後使用。

    您現在已建立具有適當權限的堆疊角色,而且已取得其 ARN。

步驟 3:將 AWS 角色新增至 CodeCatalyst

在此步驟中,您將組建角色 (codecatalyst-build-role) 和部署 role (codecatalyst-deploy-role) 新增至空間中的 CodeCatalyst 帳戶連線。

注意

您不需要將堆棧角色(codecatalyst-stack-role)添加到連接中。這是因為堆疊角色是由 CloudFormation(不 CodeCatalyst) 使用, CodeCatalyst 與 AWS 使用部署角色之間建立連接之後。由於堆疊角色不會被用 CodeCatalyst 來取得存取權 AWS,因此不需要與帳戶連線產生關聯。

將建置和部署角色新增至您的帳戶連線
  1. 在中 CodeCatalyst,導覽至您的空間。

  2. 選擇AWS 帳戶。此時會顯示帳戶連線清單。

  3. 選擇代表您建立組建和部署角色之 AWS 帳戶的帳戶連線。

  4. 管理主控台選擇 [ AWS 管理角色]

    將會顯示「將 IAM 角色新增至 Amazon CodeCatalyst 空間」頁面。您可能需要登入才能存取此頁面。

  5. 選取 [新增您在 IAM 中建立的現有角色]。

    這時系統顯示下拉列表。此清單會顯示具有信任政策的所有 IAM 角色,其中包括codecatalyst-runner.amazonaws.comcodecatalyst.amazonaws.com服務主體。

  6. 在下拉式清單中,選擇codecatalyst-build-role,然後選擇 [新增角色]。

  7. 選擇 [新增 IAM 角色],選擇 [新增您在 IAM 中建立的現有角色],然後在下拉式清單中選擇codecatalyst-deploy-role。選擇 Add role (新增角色)

    您現在已將組建和部署角色新增至您的空間。

  8. 複製 Amazon CodeCatalyst 顯示名稱的值。在建立工作流程時,您將需要此值。

步驟 4:創建一個 Amazon S3 存儲桶

在此步驟中,您會建立 Amazon S3 儲存貯體,用於存放無伺服器應用程式的部署套件 .zip 檔案。

建立 Amazon S3 儲存貯體
  1. 前往 https://console.aws.amazon.com/s3/ 開啟的 Amazon Simple Storage Service (Amazon S3) 主控台。

  2. 在主窗格中,選擇 [建立值區]。

  3. 若為「值區名稱」,請輸入:

    codecatalyst-cfn-s3-bucket
  4. 對於 AWS 區域,選擇一個區域。本教學課程假設您選擇美國西部 (奧勒岡) us-we st-2。如需 Amazon S3 支援區域的相關資訊,請參閱中的 Amazon 簡單儲存服務端點和配額AWS 一般參考

  5. 在頁面底部,選擇 [建立值區]。

您現在已經建立了一個名為美國西部 (奧勒岡) us-west-2 區codecatalyst-cfn-s3-bucket域的值區。

步驟 5:添加源文件

在此步驟中,您可以將數個應用程式來源檔案新增至 CodeCatalyst 來源儲存庫。資hello-world料夾包含您將部署的應用程式檔案。該tests文件夾包含單元測試。資料夾結構如下:

. |— hello-world | |— tests | |— unit | |— test-handler.js | |— app.js |— .npmignore |— package.json |— sam-template.yml |— setup-sam.sh

.npmignore 文件

該文.npmignore件指示 npm 應從應用程序包中排除哪些文件和文件夾。在本教程中,npm 會排除該tests文件夾,因為它不是應用程序的一部分。

若要加入 .npmignore 檔案
  1. 請在以下位置開啟 CodeCatalyst 主控台。 https://codecatalyst.aws/

  2. 選擇您的項目,codecatalyst-cfn-project

  3. 在瀏覽窗格中,選擇 [程式碼],然後選擇 [原始碼儲存庫]。

  4. 從來源儲存庫清單中,選擇您的儲存庫codecatalyst-cfn-source-repository

  5. 在 [檔] 中選擇 [建立檔案]。

  6. 在「檔案名稱」中,輸入:

    .npmignore
  7. 在文字方塊中,輸入下列程式碼:

    tests/*
  8. 選擇「確認」,然後再次選擇「確認」。

    現在,您已經在存儲庫的根目錄.npmignore中創建了一個名為的文件。

打包. JSON 文件

package.json文件包含有關 Node 項目的重要元數據,例如項目名稱,版本號,描述,依賴項以及描述如何與應用程序交互和運行應用程序的其他詳細信息。

本教學課程package.json中包含相依性清單和指test令碼。測試腳本執行以下操作:

  • 使用摩卡,測試腳本運行中指定的單元測試,hello-world/tests/unit/並使用 xunit 報告器將結果寫入junit.xml文件。

  • 使用伊斯坦布爾(nyc),測試腳本使用三葉草記者生成代碼覆蓋率報告(clover.xml)。如需詳細資訊,請參閱伊斯坦布爾文件中的使用替代記者

若要新增封裝 .json 檔案
  1. 在存放庫的檔中,選擇建立檔案

  2. 在「檔案名稱」中,輸入:

    package.json
  3. 在文字方塊中,輸入下列程式碼:

    { "name": "hello_world", "version": "1.0.0", "description": "hello world sample for NodeJS", "main": "app.js", "repository": "https://github.com/awslabs/aws-sam-cli/tree/develop/samcli/local/init/templates/cookiecutter-aws-sam-hello-nodejs", "author": "SAM CLI", "license": "MIT", "dependencies": { "axios": "^0.21.1", "nyc": "^15.1.0" }, "scripts": { "test": "nyc --reporter=clover mocha hello-world/tests/unit/ --reporter xunit --reporter-option output=junit.xml" }, "devDependencies": { "aws-sdk": "^2.815.0", "chai": "^4.2.0", "mocha": "^8.2.1" } }
  4. 選擇「確認」,然後再次選擇「確認」。

    現在,您已經添加了一個名package.json為存儲庫的根目錄的文件。

薩姆模板 .yml 文件

sam-template.yml檔案包含部署 Lambda 函數和 API Gateway 以及一起設定它們的說明。它遵循AWS Serverless Application Model 模板規範,擴展了 AWS CloudFormation 模板規範。

您在本教學課程中使用 AWS SAM 範本而不是一般 AWS CloudFormation 範本,因為 AWS SAM 提供有用的:: 無伺服器AWS:: Function 資源類型。這種類型執行許多 behind-the-scenes 配置,您通常必須寫出來才能使用基本 CloudFormation 語法。例如,AWS::Serverless::Function會建立啟動函數的 Lambda 函數、Lambda 執行角色和事件來源對應。如果你想使用基本編寫它,你必須編寫所有這些 CloudFormation。

雖然本教學課程使用預先撰寫的範本,但您可以使用建置動作來產生作為工作流程的一部分。如需詳細資訊,請參閱 使用工作流程部署 AWS CloudFormation 堆疊

若要新增範例範本 .yml 檔案
  1. 在存放庫的檔中,選擇建立檔案

  2. 在「檔案名稱」中,輸入:

    sam-template.yml
  3. 在文字方塊中,輸入下列程式碼:

    AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > serverless-api Sample SAM Template for serverless-api # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Resources: HelloWorldFunction: Type: AWS::Serverless::Function # For details on this resource type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs12.x Events: HelloWorld: Type: Api # For details on this event source type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /hello Method: get Outputs: # ServerlessRestApi is an implicit API created out of the events key under Serverless::Function # Find out about other implicit resources you can reference within AWS SAM at # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api HelloWorldApi: Description: "API Gateway endpoint URL for the Hello World function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" HelloWorldFunction: Description: "Hello World Lambda function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit Lambda execution role created for the Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn
  4. 選擇「確認」,然後再次選擇「確認」。

    現在,您已經在存儲庫的根文件夾sam-template.yml下添加了一個名為的文件。

setup-sam.sh 檔案

setup-sam.sh檔案包含下載和安裝 AWS SAM CLI 公用程式的指示。工作流程會使用此公用程式來封裝hello-world來源。

若要新增 setup-sam.sh 檔案
  1. 在存放庫的檔中,選擇建立檔案

  2. 在「檔案名稱」中,輸入:

    setup-sam.sh
  3. 在文字方塊中,輸入下列程式碼:

    #!/usr/bin/env bash echo "Setting up sam" yum install unzip -y curl -LO https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip unzip -qq aws-sam-cli-linux-x86_64.zip -d sam-installation-directory ./sam-installation-directory/install; export AWS_DEFAULT_REGION=us-west-2

    在前面的代碼中,將 us-west-2 替換為您的區域。 AWS

  4. 選擇「確認」,然後再次選擇「確認」。

    現在,您已經添加了一個名setup-sam.sh為存儲庫的根目錄的文件。

app.js 檔案

app.js包含 Lambda 函數程式碼。在本教程中,代碼返回文本hello world

若要新增 app.js 檔案
  1. 在存放庫的檔中,選擇建立檔案

  2. 在「檔案名稱」中,輸入:

    hello-world/app.js
  3. 在文字方塊中,輸入下列程式碼:

    // const axios = require('axios') // const url = 'http://checkip.amazonaws.com/'; let response; /** * * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format * @param {Object} event - API Gateway Lambda Proxy Input Format * * Context doc: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html * @param {Object} context * * Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html * @returns {Object} object - API Gateway Lambda Proxy Output Format * */ exports.lambdaHandler = async (event, context) => { try { // const ret = await axios(url); response = { 'statusCode': 200, 'body': JSON.stringify({ message: 'hello world', // location: ret.data.trim() }) } } catch (err) { console.log(err); return err; } return response };
  4. 選擇「確認」,然後再次選擇「確認」。

    您現在已經創建了一個名為的文件夾hello-world和一個名為的文件app.js

test-handler.js 檔案

test-handler.js文件包含 Lambda 函數的單元測試。

若要新增 test-handler.js 檔案
  1. 在存放庫的檔中,選擇建立檔案

  2. 在「檔案名稱」中,輸入:

    hello-world/tests/unit/test-handler.js
  3. 在文字方塊中,輸入下列程式碼:

    'use strict'; const app = require('../../app.js'); const chai = require('chai'); const expect = chai.expect; var event, context; describe('Tests index', function () { it('verifies successful response', async () => { const result = await app.lambdaHandler(event, context) expect(result).to.be.an('object'); expect(result.statusCode).to.equal(200); expect(result.body).to.be.an('string'); let response = JSON.parse(result.body); expect(response).to.be.an('object'); expect(response.message).to.be.equal("hello world"); // expect(response.location).to.be.an("string"); }); });
  4. 選擇「確認」,然後再次選擇「確認」。

    現在,您已經在文件hello-world/tests/unittest-handler.js下添加了一個名為的文件。

您現在已經添加了所有源文件。

花點時間仔細檢查您的工作,並確保將所有文件放在正確的文件夾中。資料夾結構如下:

. |— hello-world | |— tests | |— unit | |— test-handler.js | |— app.js |— .npmignore |— README.md |— package.json |— sam-template.yml |— setup-sam.sh

步驟 6:建立並執行工作流程

在此步驟中,您會建立封裝 Lambda 原始程式碼並進行部署的工作流程。工作流程由下列依序執行的建置區塊組成:

  • 觸發器 — 當您將變更推送至來源儲存庫時,此觸發器會自動啟動工作流程執行。關於觸發條件的詳細資訊,請參閱 使用觸發器啟動工作流程自動執行

  • 測試操作(Test)-在觸發器上,此操作安裝節點包管理器(NPM),然後運行該npm run test命令。這個命令告訴 npm 運行package.json文件中定義的test腳本。test腳本反過來運行單元測試並生成兩個報告:測試報告(junit.xml)和代碼覆蓋報告(clover.xml)。如需詳細資訊,請參閱 打包. JSON 文件

    接下來,測試動作將 XML 報告轉換為 CodeCatalyst 報告,並在 CodeCatalyst 控制台中,測試動作的「報告」選項卡下顯示它們。

    如需測試動作的詳細資訊,請參閱以工作流程測試

  • 建置動作 (BuildBackend) — 完成測試動作後,建置動作會下載並安裝 AWS SAM CLI、封裝hello-world來源,然後將套件複製到 Lambda 服務預期的 Amazon S3 儲存貯體。此動作也會輸出名為的新 AWS SAM 範本檔案,sam-template-packaged.yml並將其置於名為的輸出加工品中buildArtifact

    如需建置動作的詳細資訊,請參閱以工作流程建置

  • 部署動作 (DeployCloudFormationStack) — 建置動作完成後,部署動作會尋找建置動作 (buildArtifact) 所產生的輸出成品,尋找 AWS SAM 範本內部,然後執行範本。 AWS SAM 範本會建立部署無伺服器應用程式的堆疊。

若要建立工作流程
  1. 在瀏覽窗格中,選擇 CI/CD,然後選擇 [工作流程]。

  2. 選擇建立工作流程

  3. 針對來源儲存庫,選擇codecatalyst-cfn-source-repository

  4. 對於「分支」,請選擇main

  5. 選擇建立

  6. 刪除 YAML 範例程式碼。

  7. 新增下列 YAML 程式碼:

    注意

    在下面的 YAML 代碼中,如果需要,可以省略Connections:部分。如果您省略這些區段,則必須確保您環境的 D efault IAM 角色欄位中指定的角色包含中所述兩個角色的許可和信任政策步驟 2:建立 AWS 角色。如需使用預設 IAM 角色設定環境的詳細資訊,請參閱建立環境

    Name: codecatalyst-cfn-workflow SchemaVersion: 1.0 Triggers: - Type: PUSH Branches: - main Actions: Test: Identifier: aws/managed-test@v1 Inputs: Sources: - WorkflowSource Outputs: Reports: CoverageReport: Format: CLOVERXML IncludePaths: - "coverage/*" TestReport: Format: JUNITXML IncludePaths: - junit.xml Configuration: Steps: - Run: npm install - Run: npm run test BuildBackend: Identifier: aws/build@v1 DependsOn: - Test Environment: Name: codecatalyst-cfn-environment Connections: - Name: codecatalyst-account-connection Role: codecatalyst-build-role Inputs: Sources: - WorkflowSource Configuration: Steps: - Run: . ./setup-sam.sh - Run: sam package --template-file sam-template.yml --s3-bucket codecatalyst-cfn-s3-bucket --output-template-file sam-template-packaged.yml --region us-west-2 Outputs: Artifacts: - Name: buildArtifact Files: - "**/*" DeployCloudFormationStack: Identifier: aws/cfn-deploy@v1 DependsOn: - BuildBackend Environment: Name: codecatalyst-cfn-environment Connections: - Name: codecatalyst-account-connection Role: codecatalyst-deploy-role Inputs: Artifacts: - buildArtifact Sources: [] Configuration: name: codecatalyst-cfn-stack region: us-west-2 role-arn: arn:aws:iam::111122223333:role/StackRole template: ./sam-template-packaged.yml capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND

    在前面的代碼中,替換:

    • 兩個執行個體都codecatalyst-cfn-environment具有您的環境名稱。

    • codecatalyst-account-connection與您的帳戶連接的顯示名稱的兩個實例。顯示名稱可能是數字。如需詳細資訊,請參閱 步驟 3:將 AWS 角色新增至 CodeCatalyst

    • codecatalyst-build-role具有您在中建立之建置角色的名稱步驟 2:建立 AWS 角色

    • codecatalyst-cfn-s具有您在步驟 4:創建一個 Amazon S3 存儲桶其中創建的 Amazon S3 存儲桶的名稱的 3 個存儲桶。

    • us-west-2 的兩個執行個體與 Amazon S3 儲存貯體所在區域 (第一個執行個體) 以及堆疊的部署位置 (第二個執行個體)。這些區域可以是不同的。本自學課程假設兩個「區域」都設定為us-west-2。如需 Amazon S3 支援區域的詳細資訊 AWS CloudFormation,請參閱 AWS 一般參考.

    • codecatalyst-deploy-role使用您在中建立的部署角色名稱步驟 2:建立 AWS 角色

    • codecatalyst-cfn-environment使用您在中建立的環境名稱必要條件

    • arn: aw:iam:: 1111223333: 角色/StackRole具有您在其中建立的堆疊角色的 Amazon 資源名稱 (ARN)。步驟 2:建立 AWS 角色

      注意

      如果您決定不建立建置、部署和堆疊角色,請以角色的名稱或 ARN 取代codecatalyst-build-rolecodecatalyst-deploy-role、和 arn: aw: iam:: 11112222333: StackRole 角色/CodeCatalystWorkflowDevelopmentRole-spaceName如需有關此角色的詳細資訊,請參閱 步驟 2:建立 AWS 角色

    如需先前所示程式碼中屬性的相關資訊,請參閱「部署 AWS CloudFormation 堆疊」動作 YAML 定義

  8. (選擇性) 選擇 [驗證],確定 YAML 程式碼在認可之前是有效的。

  9. 選擇 Commit (遞交)。

  10. 在「提交工作流程」對話方塊中,輸入以下內容:

    1. 對於「工作流程」檔案名稱,請保留預設值,codecatalyst-cfn-workflow

    2. 對於提交訊息,請輸入:

      add initial workflow file
    3. 針對「儲存庫」,選擇codecatalyst-cfn-source-repository

    4. 選擇「主要」做為「分支名稱」。

    5. 選擇 Commit (遞交)。

    您現在已建立工作流程。工作流程執行會自動啟動,因為工作流程頂端定義了觸發器。具體而言,當您認可 (並推送) codecatalyst-cfn-workflow.yaml 檔案至來源儲存庫時,觸發程序會啟動工作流程執行。

若要檢視進行中的工作流程執行
  1. 在瀏覽窗格中,選擇 CI/CD,然後選擇 [工作流程]。

  2. 選擇您剛建立的工作流程:codecatalyst-cfn-workflow

  3. 選擇「執行」頁標。

  4. 在「執行 ID」欄中,選擇執行 ID。

  5. 選擇測試以查看測試進度。

  6. 選擇BuildBackend查看構建進度。

  7. 選擇DeployCloudFormationStack以查看部署進度。

    如需檢視執行詳細資訊的詳細資訊,請參閱檢視工作流程執行狀態與詳細

  8. DeployCloudFormationStack動作完成後,請執行下列動作:

    • 如果工作流程執行成功,請移至下一個程序。

    • 如果測試BuildBackend動作上的工作流程執行失敗,請選擇 [記錄檔] 以疑難排解問題。

    • 如果DeployCloudFormationStack動作上的工作流程執行失敗,請選擇部署動作,然後選擇 [摘要] 索引標籤。捲動至「CloudFormation 事件」區段以檢視詳細的錯誤訊息。如果發生復原,請先透過中的 AWS CloudFormation 主控台刪除codecatalyst-cfn-stack堆疊, AWS 然後再重新執行工作流程。

驗證部署的步驟
  1. 成功部署後,從靠近頂部的水平功能表列中選擇變數 (7)。(請勿在右側窗格中選擇「變數」。)

  2. 在旁邊 HelloWorldApi,將 https:// URL 貼到瀏覽器中。

    隨即顯示來自 Lambda 函數的全球 JSON 訊息,指出工作流程已成功部署和設定 Lambda 函數和 API Gateway。

    提示

    您可以在工作流程圖中 CodeCatalyst 顯示此 URL,並使用一些小型設定。如需詳細資訊,請參閱 在工作流程圖表中顯示已部署應用程式的 URL

驗證單元測試結果和代碼覆蓋率
  1. 在工作流程圖表中,選擇 [測試],然後選擇 [報告]。

  2. 選擇TestReport檢視單元測試結果,或選擇檢視CoverageReport要測試之檔案的程式碼涵蓋範圍詳細資訊 (在本例中為app.js和) test-handler.js

驗證已部署的資源
  1. 登入 AWS Management Console 並開啟 API Gateway 主控台,網址為 https://console.aws.amazon.com/apigateway/

  2. 觀察該 AWS SAM 模板創建的 codecatalyst-cfn-stackAPI。API 名稱來自工作流程定義檔案 (codecatalyst-cfn-workflow.yaml) 中的Configuration/name值。

  3. 請在以下位置開啟 AWS Lambda 主控台。 https://console.aws.amazon.com/lambda/

  4. 在導覽視窗中,選擇函數

  5. 選擇您的 Lambda 函數、codecatalyst-cfn-stack-HelloWorldFunction-string.

  6. 您可以查看 API Gateway 如何成為函數的觸發器。此整合已依 AWS SAM AWS::Serverless::Function資源類型自動設定。

步驟 7:進行變更

在此步驟中,您可以變更 Lambda 原始程式碼並進行認可。此提交會啟動新的工作流程執行。此執行會以藍綠色配置部署新的 Lambda 函數,該配置使用 Lambda 主控台中指定的預設流量轉移組態。

若要變更您的 Lambda 來源
  1. 在中 CodeCatalyst,導覽至您的專案。

  2. 在瀏覽窗格中,選擇 [程式碼],然後選擇 [原始碼儲存庫]。

  3. 選擇您的來源儲存庫codecatalyst-cfn-source-repository

  4. 更改應用程序文件:

    1. 選擇 hello-world 資料夾。

    2. 選擇app.js檔案。

    3. 選擇編輯

    4. 在第 23 行上,變更hello worldTutorial complete!

    5. 選擇「確認」,然後再次選擇「確認」。

      提交會導致工作流程執行開始。此運行將失敗,因為您尚未更新單元測試以反映名稱更改。

  5. 更新單元測試:

    1. 選擇 hello-world\tests\unit\test-handler.js

    2. 選擇編輯

    3. 在第 19 行上,hello world將變更為Tutorial complete!

    4. 選擇「確認」,然後再次選擇「確認」。

      提交會導致另一個工作流程執行開始。此次執行將會成功。

  6. 在瀏覽窗格中,選擇 CI/CD,然後選擇 [工作流程]。

  7. 選擇codecatalyst-cfn-workflow,然後選擇 [執行]。

  8. 選擇最近一次執行的執行 ID。它應該仍在進行中。

  9. 選擇測試BuildBackend,並DeployCloudFormationStack查看工作流程執行進度。

  10. 當工作流程完成時,選擇頂部附近的變數 (7)

  11. 在旁邊 HelloWorldApi,將 https:// URL 貼到瀏覽器中。

    瀏覽器中會出現一則Tutorial complete!訊息,指出您的新應用程式已成功部署。

清除

清理本教程中使用的文件和服務,以避免被收取費用。

若要在 CodeCatalyst 主控台中進行清理
  1. 請在以下位置開啟 CodeCatalyst 主控台。 https://codecatalyst.aws/

  2. 刪除codecatalyst-cfn-workflow

  3. 刪除codecatalyst-cfn-environment

  4. 刪除codecatalyst-cfn-source-repository

  5. 刪除codecatalyst-cfn-project

若要在中進行清理 AWS Management Console
  1. 在中進行清理 CloudFormation,如下所示:

    1. 請在以下位置開啟 AWS CloudFormation 主控台。 https://console.aws.amazon.com/cloudformation

    2. 刪除codecatalyst-cfn-stack

      刪除堆疊會移除 API Gateway 和 Lambda 服務中的所有教學課程資源。

  2. 在 Amazon S3 中進行清理,如下所示:

    1. 前往 https://console.aws.amazon.com/s3/ 開啟的 Amazon Simple Storage Service (Amazon S3) 主控台。

    2. 選擇 codecatalyst-cfn-s3-bucket

    3. 刪除值區內容。

    4. 刪除儲存貯體。

  3. 在 IAM 中進行清理,如下所示:

    1. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

    2. 刪除codecatalyst-deploy-policy

    3. 刪除codecatalyst-build-policy

    4. 刪除codecatalyst-stack-policy

    5. 刪除codecatalyst-deploy-role

    6. 刪除codecatalyst-build-role

    7. 刪除codecatalyst-stack-role

在本教學課程中,您學習了如何使用 CodeCatalyst 工作流程和 Deploy CloudFormation 堆疊動作將無伺服器應用程式部署為 AWS CloudFormation 堆疊