建立私有 API - Amazon API Gateway

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

建立私有 API

建立私有 之前API,請先建立 API Gateway 的VPC端點。接下來,您可以建立私有API並連接資源政策。或者,您可以將VPC端點與私有建立關聯API,以簡化您叫用 的方式API。最後,您可以部署 API。

下列程序說明如何完成此操作。您可以使用 REST API AWS Management Console或 AWS CLI 建立私有 AWS SDK。

必要條件

若要遵循這些步驟,您必須具有完全設定的 VPC。若要了解如何建立 VPC,請參閱 Amazon 使用者指南 中的VPC僅建立 VPC 若要在建立 時遵循所有建議步驟VPC,請啟用私有 DNS。如此一來,您就可以在 API內叫用 ,VPC而不必傳遞主機或x-apigw-api-id標頭。

若要啟用私有 DNS,您的 enableDnsSupportenableDnsHostnames 屬性VPC必須設定為 true。如需詳細資訊,請參閱 DNS 中的支援VPC更新 的DNS支援VPC

步驟 1:在您的 中建立 API Gateway 的VPC端點 VPC

下列程序說明如何建立 API Gateway 的VPC端點。若要建立 API Gateway 的VPC端點,請指定您建立私有 AWS 區域 的 execute-api 網域API。execute-api 網域是用於API執行的API閘道元件服務。

當您為 API Gateway 建立VPC端點時,您可以指定DNS設定。如果您關閉私有 DNS,您只能API使用公有 存取您的 DNS。如需詳細資訊,請參閱問題:我無法API從API閘道VPC端點連線至我的公有

AWS Management Console
建立 API Gateway 的介面VPC端點
  1. 登入 AWS Management Console 並在 開啟 Amazon VPC主控台https://console.aws.amazon.com/vpc/

  2. 在導覽窗格中的虛擬私有雲端下,選擇端點

  3. 選擇建立端點

  4. (選用) 針對名稱標籤 ,輸入名稱以協助識別VPC端點。

  5. Service category (服務類別) 中,選擇​ AWS services

  6. 服務 下,在搜尋列中輸入 execute-api。然後,在 中選擇API閘道服務端點 AWS 區域 ,以建立您的 API。服務名稱應該看起來像 ,com.amazonaws.us-east-1.execute-api類型應該是介面

  7. 針對 VPC,選擇您要VPC在其中建立端點的 。

  8. (選用) 若要關閉啟用私有DNS名稱 ,請選擇其他設定,然後清除啟用私有DNS名稱

  9. 針對子網路 ,選擇您建立端點網路介面的可用區域。若要改善 的可用性API,請選擇多個子網路。

  10. 針對安全群組 ,選取要與VPC端點網路介面建立關聯的安全群組。

    您選擇的安全群組必須設定為允許來自 中 IP 範圍的TCP連接埠 443 傳入HTTPS流量,VPC或來自 中的其他安全群組VPC。

  11. 對於政策 ,執行下列其中一項操作:

    • 如果您尚未建立私有API或不想設定自訂VPC端點政策,請選擇完整存取

    • 如果您已建立私有API且想要設定自訂VPC端點政策,您可以輸入自訂VPC端點政策。如需詳細資訊,請參閱APIs在API閘道中使用私有VPC端點政策

    您可以在建立VPC端點後更新VPC端點政策。如需詳細資訊,請參閱更新VPC端點政策。

  12. 選擇建立端點

  13. 複製產生的VPC端點 ID,因為您可能會在未來的步驟中使用它。

AWS CLI

下列create-vpc-endpoint命令可用來建立VPC端點:

aws ec2 create-vpc-endpoint \ --vpc-id vpc-1a2b3c4d \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.us-east-1.execute-api \ --subnet-ids subnet-7b16de0c \ --security-group-id sg-1a2b3c4d

複製產生的VPC端點 ID,因為您可能會在未來的步驟中使用它。

步驟 2:建立私有 API

建立VPC端點後,您可以建立私有 REST API。下列程序說明如何建立私有 API。

AWS Management Console
若要建立私有 API
  1. https://console.aws.amazon.com/apigateway 登入API閘道主控台。

  2. 選擇建立 API

  3. REST API下,選擇建置

  4. 針對名稱,輸入名稱。

  5. 描述,請輸入描述。

  6. 針對API端點類型 ,選取私有

  7. (選用) 針對VPC端點 IDs,輸入VPC端點 ID。

    如果您將VPC端點 ID 與私有 建立關聯API,您可以從 API內部叫用 ,VPC而不必覆寫Host標頭或傳遞 x-apigw-api-id header 。如需詳細資訊,請參閱 (選用) 將VPC端點與私有建立關聯或取消關聯 API

  8. 選擇建立 API

完成上述步驟後,您可以遵循 中的指示開始使用主RESTAPI控台來設定此 的方法和整合API,但您無法部署您的 API。若要部署您的 API,請依照步驟 3 並將資源政策連接至您的 API。

AWS CLI

下列create-rest-api命令說明如何建立私有 API:

aws apigateway create-rest-api \ --name 'Simple PetStore (AWS CLI, Private)' \ --description 'Simple private PetStore API' \ --region us-west-2 \ --endpoint-configuration '{ "types": ["PRIVATE"] }'

成功的呼叫會傳回類似如下的輸出:

{ "createdDate": "2017-10-13T18:41:39Z", "description": "Simple private PetStore API", "endpointConfiguration": { "types": "PRIVATE" }, "id": "0qzs2sy7bh", "name": "Simple PetStore (AWS CLI, Private)" }

完成上述步驟後,您可以遵循 中的指示教學課程:使用 AWS 開發套件或建立 REST API AWS CLI來設定此 的方法和整合API,但您無法部署您的 API。若要部署您的 API,請依照步驟 3 並將資源政策連接至您的 API。

SDK JavaScript v3

下列範例示範如何使用 JavaScript v3 API AWS SDK的 建立私有:

import {APIGatewayClient, CreateRestApiCommand} from "@aws-sdk/client-api-gateway"; const apig = new APIGatewayClient({region:"us-east-1"}); const input = { // CreateRestApiRequest name: "Simple PetStore (JavaScript v3 SDK, private)", // required description: "Demo private API created using the AWS SDK for JavaScript v3", version: "0.00.001", endpointConfiguration: { // EndpointConfiguration types: [ "PRIVATE"], }, }; export const handler = async (event) => { const command = new CreateRestApiCommand(input); try { const result = await apig.send(command); console.log(result); } catch (err){ console.error(err) } };

成功的呼叫會傳回類似如下的輸出:

{ apiKeySource: 'HEADER', createdDate: 2024-04-03T17:56:36.000Z, description: 'Demo private API created using the AWS SDK for JavaScript v3', disableExecuteApiEndpoint: false, endpointConfiguration: { types: [ 'PRIVATE' ] }, id: 'abcd1234', name: 'Simple PetStore (JavaScript v3 SDK, private)', rootResourceId: 'efg567', version: '0.00.001' }

完成上述步驟後,您可以遵循 中的指示教學課程:使用 AWS 開發套件或建立 REST API AWS CLI來設定此 的方法和整合API,但您無法部署您的 API。若要部署您的 API,請依照步驟 3 並將資源政策連接至您的 API。

Python SDK

下列範例示範如何使用 for Python API AWS SDK建立私有:

import json import boto3 import logging logger = logging.getLogger() apig = boto3.client('apigateway') def lambda_handler(event, context): try: result = apig.create_rest_api( name='Simple PetStore (Python SDK, private)', description='Demo private API created using the AWS SDK for Python', version='0.00.001', endpointConfiguration={ 'types': [ 'PRIVATE', ], }, ) except botocore.exceptions.ClientError as error: logger.exception("Couldn't create private API %s.", error) raise attribute=["id", "name", "description", "createdDate", "version", "apiKeySource", "endpointConfiguration"] filtered_data ={key:result[key] for key in attribute} result = json.dumps(filtered_data, default=str, sort_keys='true') return result

成功的呼叫會傳回類似如下的輸出:

"{\"apiKeySource\": \"HEADER\", \"createdDate\": \"2024-04-03 17:27:05+00:00\", \"description\": \"Demo private API created using the AWS SDK for \", \"endpointConfiguration\": {\"types\": [\"PRIVATE\"]}, \"id\": \"abcd1234\", \"name\": \"Simple PetStore (Python SDK, private)\", \"version\": \"0.00.001\"}"

完成上述步驟後,您可以遵循 中的指示教學課程:使用 AWS 開發套件或建立 REST API AWS CLI來設定此 的方法和整合API,但您無法部署您的 API。若要部署您的 API,請依照步驟 3 並將資源政策連接至您的 API。

步驟 3:設定私有的資源政策 API

所有 都API無法存取您目前的私有VPCs。使用 資源政策來授予您的 VPCs和VPC端點對私有 的存取權APIs。您可以授予任何 AWS 帳戶中VPC端點的存取權。

您的資源政策應包含 aws:SourceVpcaws:SourceVpce條件以限制存取。我們建議您識別特定 VPCs和VPC端點,不要建立允許存取所有 VPCs和VPC端點的資源政策。

下列程序說明如何將資源政策連接至您的 API。

AWS Management Console
  1. https://console.aws.amazon.com/apigateway 登入API閘道主控台。

  2. 選擇 REST API。

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

  4. 選擇 建立政策

  5. 選擇選取範本,然後選擇來源 VPC

  6. 使用VPC端點 ID 取代 {{vpceID}}(包括捲髮支架)。

  7. 選擇 Save changes (儲存變更)。

AWS CLI

下列update-rest-api命令說明如何將資源政策連接至現有的 API:

aws apigateway update-rest-api \ --rest-api-id a1b2c3 \ --patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'

您也可以控制哪些資源可以存取您的VPC端點。若要控制哪些資源可以存取您的VPC端點,請將端點政策連接至您的VPC端點。如需詳細資訊,請參閱APIs在API閘道中使用私有VPC端點政策

(選用) 將VPC端點與私有建立關聯或取消關聯 API

當您將VPC端點與私有 建立關聯時API,APIGateway 會產生新的 Route 53 別名DNS記錄。您可以使用此記錄來叫用私有,APIs就像公有一樣,APIs而不會覆寫Host標頭或傳遞x-apigw-api-id標頭。

產生的基底URL格式如下:

https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
Associate a VPC endpoint (AWS Management Console)

您可以在API建立VPC端點時或建立端點之後,將其與私有建立關聯。下列程序說明如何將VPC端點與先前建立的 建立關聯API。

將VPC端點與私有建立關聯 API
  1. https://console.aws.amazon.com/apigateway 登入API閘道主控台。

  2. 選擇您的私有 API。

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

  4. 編輯您的資源政策,以允許從其他VPC端點進行呼叫。

  5. 在主導覽窗格中,選擇API設定

  6. API詳細資訊區段中,選擇編輯

  7. 針對VPC端點 IDs,選取其他VPC端點 IDs。

  8. 選擇 Save (儲存)。

  9. 重新部署您的 API ,以使變更生效。

Dissociate a VPC endpoint (AWS Management Console)
取消VPC端點與私有的關聯 REST API
  1. https://console.aws.amazon.com/apigateway 登入API閘道主控台。

  2. 選擇您的私有 API。

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

  4. 編輯您的資源政策,以移除您要與私有 取消關聯的VPC端點提及API。

  5. 在主導覽窗格中,選擇API設定

  6. API詳細資訊區段中,選擇編輯

  7. 針對VPC端點 IDs,選擇 X 以取消VPC端點的關聯。

  8. 選擇 Save (儲存)。

  9. 重新部署您的 API ,以使變更生效。

Associate a VPC endpoint (AWS CLI)

下列create-rest-api命令顯示如何在API建立VPC端點時建立關聯:

aws apigateway create-rest-api \ --name Petstore \ --endpoint-configuration '{ "types": ["PRIVATE"], "vpcEndpointIds" : ["vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee"] }' \ --region us-west-2

輸出將如下所示:

{ "apiKeySource": "HEADER", "endpointConfiguration": { "types": [ "PRIVATE" ], "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee" ] }, "id": "u67n3ov968", "createdDate": 1565718256, "name": "Petstore" }

下列update-rest-api命令說明如何將VPC端點與您API已建立的 建立關聯:

aws apigateway update-rest-api \ --rest-api-id u67n3ov968 \ --patch-operations "op='add',path='/endpointConfiguration/vpcEndpointIds',value='vpce-01d622316a7df47f9'" \ --region us-west-2

輸出將如下所示:

{ "name": "Petstore", "apiKeySource": "1565718256", "tags": {}, "createdDate": 1565718256, "endpointConfiguration": { "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee", "vpce-01d622316a7df47f9" ], "types": [ "PRIVATE" ] }, "id": "u67n3ov968" }

重新部署您的 API ,以使變更生效。

Disassociate a VPC endpoint (AWS CLI)

下列update-rest-api命令說明如何取消VPC端點與私有 的關聯API:

aws apigateway update-rest-api \ --rest-api-id u67n3ov968 \ --patch-operations "op='remove',path='/endpointConfiguration/vpcEndpointIds',value='vpce-0393a628149c867ee'" \ --region us-west-2

輸出將如下所示:

{ "name": "Petstore", "apiKeySource": "1565718256", "tags": {}, "createdDate": 1565718256, "endpointConfiguration": { "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-01d622316a7df47f9" ], "types": [ "PRIVATE" ] }, "id": "u67n3ov968" }

重新部署您的 API ,以使變更生效。

步驟 4:部署私有 API

若要部署 API,您可以建立API部署並將其與階段建立關聯。下列程序說明如何部署私有 API。

AWS Management Console
部署私有 API
  1. 選擇您的 API。

  2. 選擇部署API

  3. 針對階段,選取新階段

  4. 針對階段名稱,輸入階段名稱。

  5. 描述,請輸入描述。

  6. 選擇部署

AWS CLI

下列 create-deployment 命令顯示如何部署私有 API:

aws apigateway create-deployment --rest-api-id a1b2c3 \ --stage-name test \ --stage-description 'Private API test stage' \ --description 'First deployment'

對私有進行故障診斷 API

以下提供您在建立私有 時可能遇到的錯誤和問題的疑難排解建議API。

問題:我無法API從API閘道VPC端點連線至我的公有

建立 時VPC,您可以設定 DNS設定。建議您DNS為 開啟私有VPC。如果您選擇關閉私有 DNS,則只能API透過公有 存取您的 DNS。

如果您啟用私有 DNS,則無法API從端點存取公有API閘道的預設VPC端點。您可以使用API自訂網域名稱存取 。

如果您建立區域自訂網域名稱,請使用 A 類型別名記錄,如果您建立邊緣最佳化自訂網域名稱,則記錄類型沒有限制。您可以在DNS啟用私有APIs的情況下存取這些公有。如需詳細資訊,請參閱問題:我API從API閘道VPC端點 連線至我的公有

問題:我的API退貨 {"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********/****/****/"}

在資源政策中,如果您將主體設定為 AWS 主體,例如下列項目:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", ""Principal": { "AWS": [ "arn:aws:iam::account-id:role/developer", "arn:aws:iam::account-id:role/Admin" ] }, "Action": "execute-api:Invoke", "Resource": [ "execute-api:/*" ] }, ... }

您必須對 中的每個方法使用AWS_IAM授權API,否則 會API傳回先前的錯誤訊息。如需如何開啟方法AWS_IAM授權的詳細資訊,請參閱 API閘道RESTAPIs中的方法

問題:我無法判斷我的VPC端點是否與我的 相關聯 API

如果您將VPC端點與私有 建立關聯或取消關聯API,則需要重新部署 API。由於DNS傳播,更新操作可能需要幾分鐘的時間才能完成。在此期間,您的 API 可以使用,但新產生的DNS傳播可能DNSURLs仍在進行中。如果幾分鐘後,您的新 URLs 無法在 中解決DNS,建議您重新部署您的 API。