AWS AppSync를 사용하여 VPC의 프라이빗 리소스에 액세스하려면 어떻게 해야 합니까?

6분 분량
0

AWS AppSync GraphQL API에서 Amazon Virtual Private Cloud(VPC) 리소스에 액세스하고 싶은데 어떻게 해야 하는지 모르겠습니다.

간략한 설명

AWS AppSync GraphQL API에서 Amazon VPC 리소스에 액세스하려면 다음 단계를 따릅니다.

  1. 액세스하려는 리소스와 동일한 Amazon VPC 내에서 실행되도록 AWS Lambda 함수를 생성합니다.
  2. AWS AppSync API를 생성한 다음 Lambda 함수를 데이터 소스로 연결합니다.
  3. AWS AppSync API 스키마를 구성합니다.
  4. Lambda 확인자 또는 직접 Lambda 확인자를 대상 GraphQL 필드에 연결합니다.
  5. GraphQL 필드를 테스트합니다.

Amazon VPC의 프라이빗 서브넷에 연결하도록 Lambda 함수를 구성하면 Amazon VPC의 프라이빗 리소스에 액세스할 수 있습니다. 다운스트림 프라이빗 리소스의 결과는 AWS AppSync GraphQL API로 다시 전달되고 클라이언트로 반환됩니다. 프라이빗 리소스에는 데이터베이스, 컨테이너, 프라이빗 API, 프라이빗 Amazon OpenSearch Service 도메인 또는 Application 또는 Network Load Balancer 배후의 기타 프라이빗 서비스가 포함됩니다.

AWS AppSync는 Lambda 퍼블릭 서비스 엔드포인트를 통해 Lambda API를 호출합니다. 호출된 API는 Signature Version 4 서명 프로세스에 의해 보호됩니다. 이를 통해 AWS AppSync는 대상 Lambda 함수를 호출할 권한이 있는 AWS Identity and Access Management(IAM) 역할을 맡을 수 있습니다. Amazon VPC에 액세스하도록 구성된 Lambda 함수에 대한 자세한 내용은 Lambda용 VPC 네트워킹을 참조하세요.

참고:

  • AWS AppSync는 퍼블릭 엔드포인트만 지원합니다. 해결 방법으로 Lambda 확인자를 Amazon VPC 리소스의 진입점으로 사용하는 것이 좋습니다.
  • Amazon VPC 프라이빗 리소스와 AWS AppSync API 간에 Lambda 함수를 추가하면 약간의 지연 시간 오버헤드가 있는 새로운 애플리케이션 계층이 도입됩니다.
  • Lambda 함수와 함께 Amazon VPC를 사용하는 경우 추가 요금이 발생합니다. 자세한 내용은 Lambda 요금을 참조하세요.

해결 방법

참고: AWS CLI 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

액세스하려는 리소스와 동일한 Amazon VPC 내에서 실행되도록 AWS Lambda 함수 생성

다음 예시 시나리오에서는 기존 내부 Application Load Balancer가 Python Lambda 함수에서 호출됩니다. id 값은 AWS AppSync 호출이 Lambda로 전송하는 이벤트 객체에서 전달된 arguments 파라미터에서 가져옵니다.

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 확인자의 경우 함수는 전체 컨텍스트 객체로 구성된 페이로드를 수신합니다.

Lambda 함수의 응답 예는 다음과 같습니다.

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

AWS AppSync API를 생성하고 Lambda 함수를 데이터 소스로 연결

AWS Management Console 사용

AWS AppSync에서 GraphQL API를 생성하려면 다음을 수행합니다.

  1. AWS AppSync 콘솔을 엽니다.
  2. 대시보드에서 [API 생성]을 선택합니다.
  3. [시작하기] 페이지의 [API 사용자 지정 또는 Amazon DynamoDB에서 가져오기]에서 [처음부터 빌드]를 선택합니다.
  4. [시작]을 선택합니다.
  5. [API 이름] 필드에 API 이름을 입력합니다.
  6. [생성]을 선택합니다.

참고: 이전 단계에서는 7일 동안 유효한 권한 부여용 API 키를 자동으로 생성합니다. 그러나 모든 인증 유형을 사용할 수 있습니다.

Lambda 데이터 소스를 생성하려면 다음을 수행합니다.

  1. AWS AppSync 콘솔을 엽니다.
  2. [데이터 소스]를 선택합니다.
  3. [데이터 소스 생성]을 선택합니다.
  4. [새 데이터 소스 생성]에서 정의할 데이터 소스 이름을 입력합니다.
    [데이터 소스 유형]에서 [Amazon Lambda 함수]를 선택합니다.
    [리전]에서 Lambda 함수가 포함된 AWS 리전을 선택합니다.
    [함수 ARN]에서 생성한 함수를 선택합니다.
  5. AWS AppSync가 Lambda 함수를 관리할 수 있도록 기존 역할을 제공합니다. 마법사가 자동으로 생성하도록 할 수도 있습니다.
  6. [생성]을 선택합니다.

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 Management Console 사용

Lambda 함수 응답에 액세스하도록 GraphQL 스키마 정의를 구성합니다.

1.    AWS AppSync 콘솔을 엽니다.

2.    왼쪽 패널에서 [스키마]를 선택합니다.

3.    제공된 스키마를 복사하여 편집기에 붙여넣습니다.

다음 예시 스키마에는 제품 유형 구조의 데이터를 반환하는 응답 쿼리가 있습니다.

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

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

schema {
    query: Query
}

4.    [스키마 저장]을 선택합니다.

AWS CLI 사용

1.    앞의 GraphQL 스키마를 schema.graphql로 저장합니다.

2.    AWS AppSync에서 스키마를 생성합니다.

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

참고: apiId를 API의 ID로 바꿉니다.

GraphQL 필드에 Lambda 확인자 또는 직접 Lambda 확인자 연결

AWS Management Console 사용

확인자 연결:

  1. AWS AppSync 콘솔을 엽니다.
  2. API의 [스키마] 페이지에 있는 확인자 하위의 응답 쿼리까지 스크롤합니다. 또는 확인자 유형에서 쿼리를 기준으로 필터링합니다.
  3. [응답] 필드 옆에 있는 [첨부]를 선택합니다.
  4. [새 확인자 생성] 페이지에서 [데이터 소스 이름]에 대해 Lambda 데이터 소스의 이름을 선택합니다. 참고: 예시 시나리오에는 Lambda 직접 통합이 사용되므로 매핑 템플릿을 구성할 필요가 없습니다.
  5. [확인자 저장]을 선택합니다.

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.    왼쪽 탐색 창에서 빌드를 선택합니다.

3.    [쿼리 편집기]에서 GraphQL 쿼리를 설계합니다.

예시 GraphQL 쿼리:

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

앞의 쿼리는 Application Load Balancer에서 제품 ID 1을 가져옵니다.

4.    테스트 쿼리를 실행하려면 [플레이]를 선택합니다.

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년 전