如何使用 AWS AppSync 存取 VPC 中的私有資源?

5 分的閱讀內容
0

我想從我的 AWS AppSync GraphQL API 存取 Amazon Virtual Private Cloud (Amazon VPC) 資源,但我不知道該怎麼做。

簡短描述

若要從 AWS AppSync GraphQL API 存取 Amazon VPC 資源,請依照下列步驟執行:

  1. 建立 AWS Lambda 函數,以便在與您要存取的資源相同的 Amazon VPC 內執行。
  2. 建立 AWS AppSync API,然後將 Lambda 函數連接為資料來源
  3. 設定 AWS AppSync API 結構描述
  4. Lambda resolver (Lambda 解析器) 或 direct Lambda resolver (直接 Lambda 解析器) 連接至目標 GraphQL 欄位。
  5. 測試 GraphQL 欄位。

設定 Lambda 函數以連接到 Amazon VPC 中的私有子網路,可讓您存取 Amazon VPC 中的私有資源。接著,下游私有資源的結果會傳回 AWS AppSync GraphQL API,並傳回給用戶端。私有資源包括資料庫、容器、私有 API、私有 Amazon OpenSearch Service 網域,或應用程式或 Network Load Balancer 背後的其他私有服務。

AWS AppSync 會透過 Lambda 公有服務端點叫用 Lambda API。叫用的 API 由第 4 版簽署程序的簽署程序提供保護。這可讓 AWS AppSync 擔任具有許可的 AWS Identity and Access Management (IAM) 角色,以叫用目標 Lambda 函數。如需有關設定用於存取 Amazon VPC 的 Lambda 函數的資訊,請參閱 Lambda 的 VPC 聯網

注意:

  • AWS AppSync 僅支援公有端點。因應措施是使用 Lambda 解析器做為 Amazon VPC 資源的進入點。
  • 在您的 Amazon VPC 私有資源和 AWS AppSync API 之間新增 Lambda 函數,會引入新的應用程式層,但會產生較小的延遲額外負荷。
  • 如果您將 Amazon VPC 與 Lambda 函數一起使用,則會產生額外費用。如需詳細資訊,請參閱 Lambda 定價

解決方案

**注意:**如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本

建立 AWS Lambda 函數,以便在與您要存取的資源相同的 Amazon VPC 內執行

在下列範例案例中,會從 Python Lambda 函數呼叫現有的內部 Application Load Balancer。識別碼值是從 AWS AppSync 叫用傳送給 Lambda 的 event (事件) 物件中傳遞的引數參數取得。

import urllib.request
import json

def lambda_handler(event, context):
  URL = 'http://XXXXXXXXXXX.us-east-1.elb.amazonaws.com/' + event['arguments']['id']  
  #Open the JSON reponse, read it, convert it to JSON object and return it
  response = urllib.request.urlopen(URL)
  raw_json = response.read()
  loaded_json = json.loads(raw_json) 
  return loaded_json

**注意:**對於直接 Lambda 解析器,函數會接收由整個 context (內容) 物件組成的承載。

來自 Lambda 函數的範例回應:

{
  "id": "25",
  "name": "hamburger",
  "available": true
}

建立 AWS AppSync API,並將 Lambda 函數連接為資料來源

使用 AWS 管理主控台

若要在 AWS AppSync 中建立 GraphQL API:

  1. 開啟 AWS AppSync 主控台
  2. 在儀表板上,選擇 Create API (建立 API)。
  3. Getting Started (開始使用) 頁面的 Customize your API or import from Amazon DynamoDB (自訂您的 API 或從 Amazon DynamoDB 匯入) 下,選擇 Build from scratch (從頭開始建置)。
  4. 選擇 Start (開始)。
  5. API name (API 名稱) 欄位中,輸入 API 的名稱。
  6. 選擇 Create (建立)。

**注意:**上述步驟會自動為授權建立有效期為七天的 API 金鑰。但是,您可以使用任何授權類型

若要建立 Lambda 資料來源:

  1. 開啟 AWS AppSync 主控台
  2. 選擇 Data Sources (資料來源)。
  3. 選擇 Create data source (建立資料來源)。
  4. Create new Data Source (建立新資料來源) 下,輸入您要定義的資料來源名稱。
    Data source type (資料來源類型) 中,請選取 Amazon Lambda function (Amazon Lambda 函數)。
    Region (區域) 中,選取包含 Lambda 函數的 AWS 區域。
    Function ARN (函數 ARN) 中,選取您建立的函數。
  5. 提供現有角色以允許 AWS AppSync 管理 Lambda 函數。您也可以讓精靈為您建立一個。
  6. 選擇 Create (建立)。

使用 AWS Command Line Interface (AWS CLI)

1.    使用 API_KEY 作為測試的預設驗證類型來建立 GraphQL API

$ aws appsync create-graphql-api --name api-name --authentication-type API_KEY

**注意:**請將 api name 替換為您的 API 名稱。

2.    建立 API 金鑰

$ aws appsync create-api-key --api-id apiId

**注意:**請將 apiId 替換為您 API 的 ID。

3.    建立資料來源所使用的 IAM 角色,然後連接允許 AWS AppSync 擔任該角色的信任政策:

$ aws iam create-role --role-name Test-Role-for-AppSync --assume-role-policy-document file://trustpolicy.json

信任政策 JSON:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Principal": {
              "Service": "appsync.amazonaws.com"
          },   
         "Action": "sts:AssumeRole"
      }
  ]
}

4.    將許可政策內嵌至角色:

$ aws iam put-role-policy --role-name Test-Role-for-AppSync --policy-name Permissions-Policy-For-AppSync --policy-document file://permissionspolicy.json

許可政策 JSON:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowFunctionInvocation",
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": [
        "lambda-ARN"
      ]
    }
  ]
}

**注意:**請將 lambda-ARN 替換為 Lambda ARN。

5.    建立資料來源,並指出 IAM 角色和 Lambda 函數的 ARN:

$ aws appsync create-data-source --api-id apiId \
--name LambdaDataSourceName \
--type AWS_LAMBDA \
--service-role-arn IAM-role-ARN \
--lambda-config lambdaFunctionArn=Lambda-function-ARN

**注意:**請將 LambdaDataSourceName 替換為資料來源的名稱,將 apiId 替換為您 API 的 ID,將 IAM-role-ARN 替換為您 IAM 角色的 ARN,並將 Lambda-function-ARN 替換為您 Lambda 函數的 ARN。

設定 AWS AppSync API 結構描述

使用 AWS 管理主控台

設定 GraphQL 結構描述定義以存取 Lambda 函數回應:

1.    開啟 AWS AppSync 主控台

2.    在左側面板中,選擇 Schema (結構描述)。

3.    複製提供的結構描述,並將其貼至編輯器中。

下列範例結構描述具有回應查詢,會傳回具有 Product (產品) 類型結構的資料:

type Product {
    id: ID!
    name: String
    available: Boolean
}

type Query {
    response(id: ID!): Product
}

schema {
    query: Query
}

4.    選擇 Save Schema (儲存結構描述)。

使用 AWS CLI

1.    將前面的 GraphQL 結構描述儲存為 schema.graphql

2.    在 AWS AppSync 中建立結構描述

$ aws appsync start-schema-creation --api-id "apiId" --definition fileb://schema.graphql

**注意:**請將 apiId 替換為您 API 的 ID。

將 Lambda 解析器或直接 Lambda 解析器連接至 GraphQL 欄位

使用 AWS 管理主控台

連接解析器:

  1. 開啟 AWS AppSync 主控台
  2. 在 API 的 Schema (結構描述) 頁面上,在 Resolvers (解析器) 下,捲動至 response query (回應查詢)。或者,依解析器類型中的 query (查詢) 進行篩選。
  3. Response (回應) 欄位旁,選擇 Attach (連接)。
  4. Create new Resolver (建立新解析器) 頁面上,針對 Data source name (資料來源名稱),選取 Lambda 資料來源的名稱。**注意:**範例案例使用 Lambda 直接整合,因此不需要設定映射範本。
  5. 選擇 Save Resolvers (儲存解析器)。

使用 AWS CLI

建立直接 Lambda 解析器,並從上述步驟中指定資料來源名稱:

$ aws appsync create-resolver \
--field-name response \
--type-name Query \
--api-id "apiId" \
--data-source-name LambdaDataSourceName

**注意:**請將 apiId 替換為您 API 的 ID,並將 LambdaDataSourceName 替換為已建立的資料來源的名稱。

測試 GraphQL 欄位

若要測試 GraphQL 欄位:

1.    開啟 AWS AppSync 主控台

2.    在左側導覽窗格中,選擇 Queries (查詢)。

3.    在查詢編輯器中,設計您的 GraphQL 查詢。

GraphQL 查詢範例:

query MyQuery {
  response(id: "1") {
    available
    name
    id
  }
}

上述查詢會從 Application Load Balancer 取得產品識別碼 1

4.    若要執行測試查詢,請選擇 Play (播放)。

來自 API 的範例回應:

{
  "data": {
    "response": {
      "available": false,
      "id": "1",
      "name": "pizza"
    }
  }
}

使用終端

透過呼叫 POST 方法執行查詢。下面的範例使用 curl 命令:

$ curl --request POST 'https://<Grapqhl-API-endpoint>/graphql' \
--header 'Content-Type: application/graphql' \
--header 'x-api-key: api-key' \
--data-raw '{"query":"query MyQuery {\n  response(id: \"1\") {\n available\n    id\n    name\n  }\n}\n","variables":{}}'

**注意:**請將 api-key 替換為您的 API 金鑰。


相關資訊

使用 AWS AppSync 和 AWS Amplify 簡化對多個微型服務的存取

使用 AWS AppSync、AWS Lambda、Amazon ElastiCache 和 Amazon EventBridge 建置目前狀態 API

AWS AppSync 安全最佳實務

為 Lambda 函數佈建並行存取

AWS 官方
AWS 官方已更新 2 年前