

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

# 快速入門：發佈應用程式
<a name="serverlessrepo-quick-start"></a>

本指南會逐步解說 AWS Serverless Application Repository 使用 CLI 將範例無伺服器應用程式下載、建置、測試和發佈至 AWS SAM 的步驟。您可以使用此範例應用程式做為開發和發佈您自己的無伺服器應用程式的起點。

## 概觀
<a name="serverlessrepo-quick-start-steps"></a>

下列步驟概述如何下載、建置和發佈範例無伺服器應用程式：

1. **初始化**。使用從範本下載範例應用程式 `sam init`。

1. **在本機測試**。使用 `sam local invoke` 和/或 `sam local start-api` 在本機測試應用程式。請注意，使用這些命令，即使您的 Lambda 函數是在本機叫用，它仍會從 AWS 雲端中的 AWS 資源讀取和寫入。

1. **封裝**。當您對 Lambda 函數感到滿意時，請使用 將 Lambda 函數、 AWS SAM 範本和任何相依性綁定到 CloudFormation 部署套件中`sam package`。在此步驟中，您也會加入要上傳至 AWS Serverless Application Repository的應用程式相關資訊。

1. **發佈**。使用 `sam publish` 將應用程式發佈至 AWS Serverless Application Repository 。在此步驟結束時，您可以在 中檢視您的應用程式 AWS Serverless Application Repository ，並使用 將其部署到 AWS 雲端 AWS Serverless Application Repository。

下一節中的範例 [Hello World 應用程式](#serverlessrepo-quick-start-hello-world) 會引導您完成建置和發佈無伺服器應用程式的這些步驟。

## Hello World 應用程式
<a name="serverlessrepo-quick-start-hello-world"></a>

在本練習中，您會下載並測試代表簡單 API 後端的 Hello World 無伺服器應用程式。它具有支援 GET 操作和 Lambda 函數的 Amazon API Gateway 端點。當 GET 請求傳送到端點時，API Gateway 會叫用 Lambda 函數。然後， AWS Lambda 執行 函數，只傳回`hello world`訊息。

應用程式具有下列元件：
+ 為 Hello World 應用程式定義兩個 AWS 資源的 AWS SAM 範本：具有 GET 操作的 API Gateway 服務，以及 Lambda 函數。範本也會定義 API Gateway GET 操作與 Lambda 函數之間的映射。
+ 用 Python 撰寫的應用程式程式碼。

## 開始之前
<a name="serverlessrepo-quick-start-hello-world-prereq"></a>

請確定您具有此練習所需的設定：
+ 您必須擁有具有管理員許可之 IAM 使用者的 AWS 帳戶。請參閱[設定 AWS 帳戶](https://docs.aws.amazon.com/lambda/latest/dg/setup.html)。
+ 您必須安裝 AWS SAM CLI （命令列界面）。請參閱[安裝 AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)。
+ 您必須 AWS CLI 安裝 1.16.77 版或更新版本。請參閱[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。

## 步驟 1：初始化應用程式
<a name="serverlessrepo-quick-start-hello-world-setup-local-app"></a>

在本節中，您將下載範例應用程式，其中包含 AWS SAM 範本和應用程式程式碼。

**初始化應用程式**

1. 在 CLI AWS SAM 命令提示字元中執行下列命令。

   ```
   sam init --runtime python3.6 
   ```

1. 檢閱命令所建立目錄的內容 (`sam-app/`)：
   + `template.yaml` – 定義 Hello World 應用程式所需的兩個 AWS 資源：Lambda 函數和支援 GET 操作的 API Gateway 端點。範本也會定義兩個資源之間的對應。
   + 與 Hello World 應用程式程式碼相關的內容：
     + `hello_world/` 目錄 – 包含執行`hello world`時傳回的應用程式程式碼。
**注意**  
在本練習中，應用程式碼是以 Python 撰寫，您可以在 `init`命令中指定執行時間。 AWS Lambda 支援其他語言來建立應用程式碼。如果您指定其他支援的執行時間，`init` 命令會提供指定語言的 Hello World 程式碼，以及您可以跟著進行的該語言 `README.md` 檔案。如需所支援執行時間的相關資訊，請參閱 [Lambda 執行環境和可用程式庫](https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)。

    

## 步驟 2：在本機測試應用程式
<a name="serverlessrepo-quick-start-hello-world-test-locally"></a>

現在您已在本機電腦上擁有 AWS SAM 應用程式，請依照下列步驟在本機進行測試。



**在本機測試應用程式**

1. 在本機啟動 API Gateway 端點。您必須從包含 `template.yaml` 檔案的目錄執行下列命令。

   ```
   sam-app> sam local start-api --region us-east-1
   ```

   命令會傳回 API Gateway 端點，您可以將請求傳送至 以進行本機測試。

1. 測試應用程式。複製 API Gateway 端點 URL，將其貼到瀏覽器，然後選擇 **Enter**。API Gateway 端點 URL 範例為 `http://127.0.0.1:3000/hello`。

   API Gateway 會在本機叫用端點對應的 Lambda 函數。Lambda 函數會在本機 Docker 容器中執行，並傳回 `hello world`。API Gateway 會傳回回應給包含文字的瀏覽器。

**練習：變更訊息字串**

成功測試範例應用程式之後，您可以嘗試進行簡單的修改：變更傳回的訊息字串。

1. 編輯 `/hello_world/app.py` 檔案，將訊息字串從 `'hello world'` 變更為 `'Hello World!'`。

1. 在瀏覽器中重新載入測試 URL 並觀察新的字串。

您會注意到您的新程式碼是動態載入的，而不必重新啟動 `sam local` 程序。

## 步驟 3：封裝應用程式
<a name="serverlessrepo-quick-start-hello-world-package-app"></a>

在本機測試應用程式之後，您可以使用 AWS SAM CLI 來建立部署套件和封裝 AWS SAM 範本。

**注意**  
在下列步驟中，您會建立 `hello_world/` 目錄內容的 .zip 檔案，其中包含應用程式程式碼。此 .zip 檔案是無伺服器應用程式的**部署套件**。如需詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[建立部署套件 (Python)](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html)。

**建立 Lambda 部署套件**

1. 將`Metadata`區段新增至 AWS SAM 範本檔案，以提供必要的應用程式資訊。如需 AWS SAM 範本`Metadata`區段的詳細資訊，請參閱《 *AWS Serverless Application Model 開發人員指南*》中的[AWS SAM 範本中繼資料區段屬性](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications-metadata-properties.html)。

   以下是一個範例 `Metadata` 部分：

   ```
   Metadata:
     AWS::ServerlessRepo::Application:
       Name: {{my-app}}
       Description: {{hello world}}
       Author: {{user1}}
       SpdxLicenseId: Apache-2.0
       LicenseUrl: {{LICENSE.txt}}
       ReadmeUrl: {{README.md}}
       Labels: {{['tests']}}
       HomePageUrl: {{https://github.com/user1/my-app-project}}
       SemanticVersion: {{0.0.1}}
       SourceCodeUrl: {{https://github.com/user1/my-app-project}}
   ```

   `LicenseUrl` 和 `ReadmeUrl` 屬性可以是本機檔案的參考 （如上述範例所示），也可以是已託管這些成品的 Amazon S3 儲存貯體連結。

1. 在要儲存封裝程式碼的位置建立一個 S3 儲存貯體。如果您想使用現有的 S3 儲存貯體，請跳過此步驟。

   ```
   sam-app> aws s3 mb s3://{{bucketname}}
   ```

1. 執行下列 `package` AWS SAM CLI 命令來建立 Lambda 函數部署套件。

   ```
   sam-app> sam package \
       --template-file template.yaml \
       --output-template-file packaged.yaml \
       --s3-bucket {{bucketname}}
   ```

   命令會執行下列動作：
   + 壓縮`aws-sam/hello_world/`目錄的內容並將其上傳至 Amazon S3。
   + 將部署套件、README 檔案和 LICENSE 檔案上傳至 `--s3-bucket`選項指定的 Amazon S3 儲存貯體。
   + 輸出新的範本檔案 (稱為 `packaged.yaml`)，您將在下一個步驟中使用該檔案將應用程式發佈至 AWS Serverless Application Repository。`packaged.yaml` 範本檔案類似於原始範本檔案 (`template.yaml`)`LicenseUrl`，但具有金鑰差異：`CodeUri`、 和 `ReadmeUrl` 屬性指向 Amazon S3 儲存貯體和包含個別成品的物件。`packaged.yaml` 範例範本檔案的下列程式碼片段會顯示 `CodeUri` 屬性：

     ```
     HelloWorldFunction:
         Type: AWS::Serverless::Function # For more information about function resources, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
         Properties:
           CodeUri: s3://{{bucketname}}/{{fbd77a3647a4f47a352fcObjectGUID}}
     
     ...
     ```

## 步驟 4：發佈應用程式
<a name="serverlessrepo-quick-start-hello-world-publish-app"></a>

現在您已建立部署套件，您可以使用它將應用程式發佈至 AWS Serverless Application Repository。

**將無伺服器應用程式發佈至 AWS Serverless Application Repository**
+ 執行以下命令，將新應用程式發佈至 AWS Serverless Application Repository ，並將第一個版本建立為 0.0.1。

  ```
  sam-app> sam publish \
      --template packaged.yaml \
      --region us-east-1
  ```

**注意**  
依預設，應用程式將建立為私有。您必須共用應用程式，才能允許其他 AWS 帳戶檢視和部署您的應用程式。如需共用應用程式的詳細資訊，請參閱下列**後續步驟**。

## 後續步驟
<a name="serverlessrepo-quick-start-nextstep"></a>

現在，您已經發佈了範例應用程式，以下是一些您可以用它來做的事情。
+ 在 **中檢視您的應用程式 AWS Serverless Application Repository** – `sam publish`命令的輸出將包含 AWS Serverless Application Repository 直接指向應用程式詳細資訊頁面的連結。您也可以前往 AWS Serverless Application Repository 登陸頁面並搜尋您的應用程式。
+ **共用您的應用程式** – 由於您的應用程式預設為私有，因此其他 AWS 帳戶看不到它。若要與他人共用您的應用程式，您必須將其設為公開，或授予特定 AWS 帳戶清單的許可。如需使用 共用應用程式的資訊， AWS CLI 請參閱 [AWS Serverless Application Repository 應用程式政策範例](security_iam_resource-based-policy-examples.md)。如需使用主控台共用應用程式的資訊，請參閱[共用應用程式](serverlessrepo-how-to-publish.md#share-application)。

## 詳細資訊
<a name="serverlessrepo-quick-start-moreinfo"></a>

如需有關 AWS SAM 範本`Metadata`區段`sam package`和 CLI AWS SAM `sam publish`命令的詳細資訊，請參閱《 *AWS Serverless Application Model 開發人員指南*》中的[使用 AWS SAM CLI 發佈應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications.html)。