

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

# 教學：建立私有 REST API
<a name="private-api-tutorial"></a>

在本教學課程中，您需建立私有 REST API。用戶端只能從您的 Amazon VPC 中存取 API。該 API 與公有網際網路隔離，這是一個常見安全要求。

本教學課程需要約 30 分鐘的時間完成。首先，您可以使用 CloudFormation 範本來建立 Amazon VPC、VPC 端點、 AWS Lambda 函數，並啟動您用來測試 API 的 Amazon EC2 執行個體。接著，您可以使用 AWS 管理主控台 建立私有 API 並連接資源政策，僅允許從您的 VPC 端點存取。最後，測試您的 API。

![\[您在本教學課程中建立私有 API 的概觀。\]](http://docs.aws.amazon.com/zh_tw/apigateway/latest/developerguide/images/private-api-tutorial-diagram.png)


若要完成本教學課程，您需要 AWS 帳戶和具有主控台存取權 AWS Identity and Access Management 的使用者。如需詳細資訊，請參閱[設定為使用 API Gateway](setting-up.md)。

在本教學課程中，您需使用 AWS 管理主控台。如需建立此 API 和所有相關資源的 CloudFormation 範本，請參閱 [template.yaml](samples/private-api-full-template.zip)。

**Topics**
+ [步驟 1：建立相依性](#private-api-tutorial-create-dependencies)
+ [步驟 2：建立私有 API](#private-api-tutorial-create-api)
+ [步驟 3：建立方法與整合](#private-api-tutorial-create-method)
+ [步驟 4：連接資源政策](#private-api-tutorial-attach-resource-policy)
+ [步驟 5：部署 API](#private-api-tutorial-deploy-api)
+ [步驟 6：確認您的 API 無法公開存取](#private-api-tutorial-test-private-api)
+ [步驟 7：連接到 VPC 中的執行個體，並叫用您的 API](#private-api-tutorial-connect-to-instance)
+ [步驟 8：清理](#private-api-tutorial-cleanup)
+ [後續步驟：使用 自動化 CloudFormation](#private-api-tutorial-next-steps)

## 步驟 1：建立相依性
<a name="private-api-tutorial-create-dependencies"></a>

下載並解壓縮[此 CloudFormation 範本](samples/private-api-starter-template.zip)。您可以使用範本為私有 API 建立所有相依性，包括 Amazon VPC、VPC 端點，以及做為 API 後端的 Lambda 函數。您可以稍後建立私有 API。

**建立 CloudFormation 堆疊**

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

1. 選擇 **Create stack (建立堆疊)**，然後選擇 **With new resources (standard) (使用新資源 (標準))**。

1. 對於 **Specify template (指定範本)**，選擇 **Upload a template file (上傳範本檔案)**。

1. 選取您下載的範本。

1. 選擇 **Next** (下一步)。

1. 針對 **Stack name (堆疊名稱)**，輸入 **private-api-tutorial**，然後選擇 **Next (下一步)**。

1. 針對 **Configure stack options (設定堆疊選項)**，選擇 **Next (下一步)**。

1. 針對 **功能**，確認 CloudFormation 可以在您的帳戶中建立 IAM 資源。

1. 選擇**下一步**，然後選擇**提交**。

CloudFormation 會為您的 API 佈建相依性，這可能需要幾分鐘的時間。當您 CloudFormation 堆疊的狀態為 **CREATE\$1COMPLETE** 時，請選擇**輸出**。請記下您的 VPC 端點 ID。您在本教程課程中的後續步驟需要它。

## 步驟 2：建立私有 API
<a name="private-api-tutorial-create-api"></a>

您可以建立私有 API，並僅允許 VPC 中的用戶端存取它。

**建立私有 API**

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 選擇 **Create API (建立 API)**，然後針對 **REST API**，選擇 **Build (建置)**。

1. 針對 **API name (API 名稱)**，請輸入 **private-api-tutorial**。

1. 針對 **API 端點類型**，選取**私有**。

1. 針對 **VPC IDs**，輸入 CloudFormation 堆疊**輸出**中的 VPC 端點 ID。

1. 對於 **IP 位址類型**，請選擇 **Dualstack**。

1. 選擇**建立 API**。

## 步驟 3：建立方法與整合
<a name="private-api-tutorial-create-method"></a>

您可以建立 `GET` 方法和 Lambda 整合來處理對 API 的 `GET` 請求。當用戶端叫用您的 API 時，API Gateway 會將請求傳送至您在步驟 1 中建立的 Lambda 函數，然後傳回回應給用戶端。

**建立方法與整合**

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 選擇您的 API。

1. 選擇**建立方法**。

1. 針對**方法類型**，選取 `GET`。

1. 針對**整合類型**，選取 **Lambda 函數**。

1. 開啟 **Lambda 代理整合**。透過 Lambda 代理整合，API Gateway 會將事件傳送至具有定義結構的 Lambda，並將回應從您的 Lambda 函數轉換為 HTTP 回應。

1. 針對 **Lambda 函數**，選擇您在步驟 1 中使用 CloudFormation 範本建立的函數。函數的名稱以 **private-api-tutorial** 開頭。

1. 選擇**建立方法**。

## 步驟 4：連接資源政策
<a name="private-api-tutorial-attach-resource-policy"></a>

您可以將 [resource policy (資源政策)](apigateway-resource-policies.md) 連接至 API，該 API 允許用戶端僅透過 VPC 端點叫用您的 API。若要進一步限制存取 API，您也可以為 VPC 端點設定 [ VPC 端點政策](apigateway-vpc-endpoint-policies.md)，但這對於本教學課程而言並不需要。

**連接資源政策**

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 選擇您的 API。

1. 選擇**資源政策**，然後選擇**建立政策**。

1. 輸入下列政策。將 *vpceID* 取代為 CloudFormation 堆疊**輸出**中的 VPC 端點 ID。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*",
               "Condition": {
                   "StringNotEquals": {
                       "aws:sourceVpce": "vpce-abcd1234"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*"
           }
       ]
   }
   ```

------

1. 選擇**儲存變更**。

## 步驟 5：部署 API
<a name="private-api-tutorial-deploy-api"></a>

接下來，您需部署 API，使其可供 Amazon VPC 中的用戶端使用。

**部署 API**

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 選擇您的 API。

1. 選擇**部署 API**。

1. 針對**階段**，選取**新階段**。

1. 針對**階段名稱**，輸入 **test**。

1. 在**描述**，請輸入描述。

1. 選擇**部署**。

現在您已準備好測試 API。

## 步驟 6：確認您的 API 無法公開存取
<a name="private-api-tutorial-test-private-api"></a>

使用 `curl` 驗證您無法從 Amazon VPC 外部叫用 API。

**測試您的 API**

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 選擇您的 API。

1. 在主導覽窗格中，選擇**階段**，然後選擇**測試**階段。

1. 在**階段詳細資訊**下，選擇複製圖示以複製 API 的調用 URL。URL 看起來像 `https://abcdef123.execute-api.us-west-2.amazonaws.com/test`。您在步驟 1 中建立的 VPC 端點已啟用私有 DNS，因此您可以使用提供的 URL 來叫用 API。

1. 使用 curl 嘗試從 VPC 外部叫用您的 API。

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   curl 表示無法解析您的 API 端點。如果您收到不同的回應，請返回步驟 2，並確定您為 API 的端點類型選擇 **Private (私有)**。

   ```
   curl: (6) Could not resolve host: abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

接下來，連接到 VPC 中的 Amazon EC2 執行個體以叫用您的 API。

## 步驟 7：連接到 VPC 中的執行個體，並叫用您的 API
<a name="private-api-tutorial-connect-to-instance"></a>

接下來，從 Amazon VPC 中測試您的 API。若要存取您的私有 API，請連接到 VPC 中的 Amazon EC2 執行個體，然後使用 curl 來叫用您的 API。您可以使用 Systems Manager 工作階段管理員，在瀏覽器中連接到您的執行個體。

**測試您的 API**

1. 在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 選擇 **Instances** (執行個體)。

1. 選擇您在步驟 1 中使用 CloudFormation 範本建立的名為 **private-api-tutorial** 的執行個體。

1. 選擇 **Connect (連線)**，然後選擇 **Session Manager (工作階段管理員)**。

1. 選擇 **Connect (連線)** 以對您的執行個體啟動瀏覽器型工作階段。

1. 在您的工作階段管理員工作階段中，使用 curl 來叫用您的 API。您可以叫用 API，因為您正在 Amazon VPC 中使用執行個體。

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   驗證您收到回應 `Hello from Lambda!`。

![\[您可以使用工作階段管理員，從 Amazon VPC 中叫用您的 API。\]](http://docs.aws.amazon.com/zh_tw/apigateway/latest/developerguide/images/private-api-tutorial-invoke.png)


您成功建立了一個只能從 Amazon VPC 中存取的 API，然後驗證它可以運作。

## 步驟 8：清理
<a name="private-api-tutorial-cleanup"></a>

若要避免不必要的成本，請刪除您在此教學課程中建立的資源。下列步驟會刪除您的 REST API 和 CloudFormation 堆疊。

**刪除 REST API**

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 在 **API** 頁面上，選取 API。選擇 **API 動作**、選擇**刪除 API**，然後確認您的選擇。

**刪除 CloudFormation 堆疊**

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

1. 選取您的 CloudFormation 堆疊。

1. 選擇**刪除**，然後確認您的選擇。

## 後續步驟：使用 自動化 CloudFormation
<a name="private-api-tutorial-next-steps"></a>

您可以自動化建立和清除本教學課程中涉及的所有 AWS 資源。如需完整的 CloudFormation 範本範例，請參閱 [template.yaml](samples/private-api-full-template.zip)。