創建一個私人 API - Amazon API 网关

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

創建一個私人 API

在建立私有之前API,請先為API閘道建立VPC端點。接下來,您創建您的私人API並附加一個資源策略。或者,您可以將VPC端點與私有端點API相關聯,以簡化調用API. 最後,您部署API.

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

必要條件

要遵循這些步驟,您必須完全配置VPC。若要了解如何建立VPC,請參閱 Amazon VPC 使用者指南中的建立VPC僅限。要在創建時遵循所有建議步驟VPC,請啟用私有DNS。通過這種方式,您可以API在 a 中調用您的,VPC而無需傳遞 Host 或x-apigw-api-id頭文件。

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

步驟 1:在您的API網關中創建VPC端點 VPC

下列程序顯示如何建立API閘道的VPC端點。若要為API閘道建立VPC端點,請為您建立私人的 AWS 區域 位置指定execute-api網域API。execute-api網域是要API執行的API閘道元件服務。

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

AWS Management Console
建立API閘道的介面VPC端點
  1. 登錄 AWS Management Console 並在打開 Amazon VPC 控制台https://console.aws.amazon.com/vpc/

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

  3. 選擇建立端點

  4. (選擇性) 在 Name 標籤中,輸入名稱以協助識別您的VPC端點。

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

  6. 在「服務」下方的搜尋列中,輸入execute-api。然後,選擇要在 AWS 區域 其中創建的 API Gateway 服務端點API。服務名稱應該是類似的com.amazonaws.us-east-1.execute-api類型應該是接口

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

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

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

  10. 對於「安全性」群組,請選取要與VPC端點網路介面關聯的安全性群組。

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

  11. 針對「原則」,執行下列其中一個動作:

    • 如果您尚未建立私人API或不想設定自訂VPC端點原則,請選擇 [完整存取權]。

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

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

  12. 選擇建立端點

  13. 複製產生的VPC端點 ID,如您在 future 步驟中可能會使用的那樣。

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,如您在 future 步驟中可能會使用的那樣。

步驟 2:建立私人 API

建立VPC端點之後,您會建立私有端點RESTAPI。下列程序顯示如何建立專用API。

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

  2. 選擇 [建立] API。

  3. 在下方 RESTAPI,選擇 [建置]。

  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

下面的例子演示了如何API通過使用 AWS SDK為 JavaScript v3 創建一個私有:

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

下面的例子演示了如何API通過使用 Python 創建一個私有: 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

所有人都無法訪問您當前的私人APIVPCs。使用資源策略授予您VPCs和VPC端點對您私有的訪問權限APIs。您可以授予任何 AWS 帳戶中VPC端點的存取權。

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

下列程序顯示如何將資源策略附加至您的API.

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

  2. 選擇一個RESTAPI。

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

  4. 選擇 建立政策

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

  6. {{vpceID}}(包括大括號)替換為您的VPC端點 ID。

  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,API閘道會產生新的 Route 53 別名DNS記錄。您可以使用此記錄來調用您的 private,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)

您可以在建立VPC端點API時或建立後將端點與您的私有端點建立關聯。下列程序顯示如何將VPC端點與先前建立的端點相關聯API。

將端點與私用VPC端點建立關聯 API
  1. https://console.aws.amazon.com/ap igateway 登入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/ap igateway 登入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命令顯示如何取消端點與私API用VPC端點的關聯:

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

下面的創建部署命令顯示如何部署私有: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 Gateway 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重新部署.