AWS AppSync 프라이빗 API 사용 - AWS AppSync

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS AppSync 프라이빗 API 사용

Amazon Virtual Private Cloud(VPC)를 사용하면 VPC에서만 액세스할 수 있는 AWS AppSync 프라이빗 API를 생성할 수 있습니다. 프라이빗 API를 사용하면 데이터를 공개적으로 노출하지 않으면서 내부 애플리케이션에 대한 API 액세스를 제한하고 GraphQL 및 Realtime 엔드포인트에 연결할 수 있습니다.

VPC와 AWS AppSync 서비스 간에 프라이빗 연결을 설정하려면 인터페이스 VPC 엔드포인트를 생성해야 합니다. 인터페이스 엔드포인트는 인터넷 게이트웨이, NAT 디바이스, VPN 연결 또는 AWS Direct Connect 연결 없이 비공개로 AWS AppSync API에 액세스할 수 있도록 지원하는 AWS PrivateLink에 의해 구동됩니다. VPC의 인스턴스는 AWS AppSync API와 통신하는 데 퍼블릭 IP 주소를 필요로 하지 않습니다. VPC와 AWS AppSync 간의 트래픽은 AWS 네트워크를 벗어나지 않습니다.

AWS 클라우드 architecture showing VPC with public and private subnets connecting to AWS AppSync via PrivateLink.

프라이빗 API 기능을 활성화하기 전에 몇 가지 사항을 추가로 고려해야 합니다.

  • 프라이빗 DNS 기능이 활성화된 상태로 AWS AppSync에 VPC 인터페이스 엔드포인트를 설정하면 VPC의 리소스가 AWS AppSync에서 생성한 API URL을 사용하여 다른 AWS AppSync 퍼블릭 API를 간접적으로 호출할 수 없게 됩니다. 이는 퍼블릭 API에 대한 요청이 인터페이스 엔드포인트를 통해 라우팅되는데, 퍼블릭 API에 허용되지 않는 방식이기 때문입니다. 이 시나리오에서 퍼블릭 API를 간접적으로 호출하려면 퍼블릭 API에서 사용자 지정 도메인 이름을 구성하는 것이 좋습니다. 그렇게 하면 퍼블릭 API를 간접적으로 호출하는 데 VPC의 리소스가 사용될 수 있습니다.

  • AWS AppSync 프라이빗 API는 VPC에서만 사용할 수 있습니다. AWS AppSync 콘솔 쿼리 편집기는 브라우저의 네트워크 구성이 트래픽을 VPC로 라우팅할 수 있는 경우(예: VPN 또는 AWS Direct Connect를 통한 연결)에만 API에 도달할 수 있습니다.

  • AWS AppSync의 VPC 인터페이스 엔드포인트를 사용하면 동일한 AWS 계정 및 리전의 모든 프라이빗 API에 액세스할 수 있습니다. 프라이빗 API에 대한 액세스를 추가로 제한하려면 다음 옵션을 고려해 보세요.

    • 필요한 관리자만 AWS AppSync에 대한 VPC 엔드포인트 인터페이스를 생성할 수 있도록 합니다.

    • VPC 엔드포인트 사용자 지정 정책을 사용하여 VPC의 리소스에서 간접적으로 호출할 수 있는 API를 제한합니다.

    • VPC에 있는 리소스의 경우, 리소스에 API에 대한 축소된 범위의 역할을 부여함으로써 IAM 권한 부여를 사용해 AWS AppSync API를 간접적으로 호출하는 것이 좋습니다.

  • IAM 보안 주체를 제한하는 정책을 만들거나 사용할 때는 메서드의 authorizationTypeAWS_IAM 또는 NONE으로 설정해야 합니다.

AWS AppSync 프라이빗 API 생성

다음 단계는 AWS AppSync 서비스에서 프라이빗 API를 만드는 방법을 보여 줍니다.

주의

API를 생성하는 동안에만 프라이빗 API 기능을 활성화할 수 있습니다. 생성한 이후에는 AWS AppSync API 또는 AWS AppSync 프라이빗 API에서 이 설정을 수정할 수 없습니다.

  1. AWS Management Console에 로그인한 다음 AppSync 콘솔을 엽니다.

    1. 대시보드에서 API 생성을 선택합니다.

  2. 처음부터 API 설계를 선택하고 다음을 선택합니다.

  3. 프라이빗 API 섹션에서 프라이빗 API 기능 사용을 선택합니다.

  4. 나머지 옵션을 구성하고 API의 데이터를 검토한 다음 생성을 선택합니다.

AWS AppSync 프라이빗 API를 사용하려면 먼저 VPC의 AWS AppSync에 인터페이스 엔드포인트를 구성해야 합니다. 단, 프라이빗 API와 VPC가 동일한 AWS 계정 및 리전에 있어야 합니다.

AWS AppSync에 대한 인터페이스 엔드포인트 생성

Amazon VPC 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 AWS AppSync에 대한 인터페이스 엔드포인트를 생성할 수 있습니다. 자세한 내용은 Amazon VPC 사용 설명서인터페이스 엔드포인트 생성을 참조하세요.

Console
  1. AWS Management Console에 로그인한 다음 Amazon VPC 콘솔의 엔드포인트 페이지를 엽니다.

  2. 엔드포인트 생성을 선택합니다.

    1. 서비스 카테고리 필드에서 AWS 서비스가 선택되어 있는지 확인합니다.

    2. 서비스 테이블에서 com.amazonaws.{region}.appsync-api를 선택합니다. 유형 열 값이 Interface인지 확인합니다.

    3. VPC 필드에서 VPC와 서브넷을 선택합니다.

    4. 인터페이스 엔드포인트에 대한 프라이빗 DNS 기능을 활성화하려면 DNS 이름 활성화 확인란을 선택합니다.

    5. 보안 그룹 필드에서 보안 그룹을 하나 이상 선택합니다.

  3. 엔드포인트 생성을 선택합니다.

CLI

create-vpc-endpoint 명령을 사용하여 엔드포인트 네트워크 인터페이스와 연결할 VPC ID, VPC 엔드포인트 유형(인터페이스), 서비스 이름, 엔드포인트를 사용할 서브넷 및 보안 그룹을 지정합니다. 예:

$ aws ec2 create-vpc-endpoint —vpc-id vpc-ec43eb89 \ —vpc-endpoint-type Interface \ —service-name com.amazonaws.{region}.appsync-api \ —subnet-id subnet-abababab —security-group-id sg-1a2b3c4d

프라이빗 DNS 옵션을 사용하려면 VPC의 enableDnsHostnamesenableDnsSupportattributes 값을 설정해야 합니다. 자세한 내용은 Amazon VPC 사용 설명서VPC에 대한 DNS 지원 보기 및 업데이트를 참조하세요. 인터페이스 엔드포인트에 대해 프라이빗 DNS 기능을 활성화하면 아래 형식으로 기본 퍼블릭 DNS 엔드포인트를 사용하여 AWS AppSync API GraphQL 및 Real-Time 엔드포인트에 요청을 보낼 수 있습니다.

https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql

서비스 엔드포인트에 대한 자세한 내용은 AWS 일반 참조에서 서비스 엔드포인트 및 할당량을 참조하세요.

인터페이스 엔드포인트와의 서비스 상호 작용에 대한 자세한 내용은 Amazon VPC 사용 설명서인터페이스 엔드포인트를 통해 서비스 액세스를 참조하세요.

AWS CloudFormation을 사용하여 엔드포인트를 생성하고 구성하는 방법에 대한 자세한 내용은 AWS CloudFormation 사용 설명서AWS::EC2::VPCEndpoint 리소스를 참조하세요.

고급 예제

인터페이스 엔드포인트에 대해 프라이빗 DNS 기능을 활성화하면 아래 형식으로 기본 퍼블릭 DNS 엔드포인트를 사용하여 AWS AppSync API GraphQL 및 Real-Time 엔드포인트에 요청을 보낼 수 있습니다.

https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql

인터페이스 VPC 엔드포인트 퍼블릭 DNS 호스트 이름을 사용할 경우 API를 간접적으로 호출하는 기본 URL의 형식은 다음과 같습니다.

https://{vpc_endpoint_id}-{endpoint_dns_identifier}.appsync-api.{region}.vpce.amazonaws.com/graphql

AZ에 엔드포인트를 배포한 경우 AZ 전용 DNS 호스트 이름을 사용할 수도 있습니다.

https://{vpc_endpoint_id}-{endpoint_dns_identifier}-{az_id}.appsync-api.{region}.vpce.amazonaws.com/graphql.

VPC 엔드포인트 퍼블릭 DNS 이름을 사용하려면 AWS AppSync API 엔드포인트 호스트 이름을 Host 또는 x-appsync-domain 헤더로 요청에 전달해야 합니다. 다음 예제에서는 샘플 스키마 시작 가이드에서 생성했던 TodoAPI를 사용합니다.

curl https://{vpc_endpoint_id}-{endpoint_dns_identifier}.appsync-api.{region}.vpce.amazonaws.com/graphql \ -H "Content-Type:application/graphql" \ -H "x-api-key:da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}" \ -H "Host:{api_url_identifier}.appsync-api.{region}.amazonaws.com" \ -d '{"query":"mutation add($createtodoinput: CreateTodoInput!) {\n createTodo(input: $createtodoinput) {\n id\n name\n where\n when\n description\n }\n}","variables":{"createtodoinput":{"name":"My first GraphQL task","when":"Friday Night","where":"Day 1","description":"Learn more about GraphQL"}}}'

다음 예제에서는 샘플 스키마 시작 가이드에서 생성한 Todo 앱을 사용합니다. 샘플 Todo API를 테스트하기 위해 프라이빗 DNS를 사용하여 API를 간접적으로 호출하겠습니다. 원하는 명령줄 도구를 사용할 수 있으며, 이 예제에서는 curl을 사용하여 쿼리와 변형을 전송하고 wscat를 사용하여 구독을 설정합니다. 이 예제를 에뮬레이션하려면 아래 명령의 대괄호 { } 안의 값을 AWS 계정의 해당 값으로 대체하세요.

변형 작업 테스트 - createTodo 요청

curl https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql \ -H "Content-Type:application/graphql" \ -H "x-api-key:da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}" \ -d '{"query":"mutation add($createtodoinput: CreateTodoInput!) {\n createTodo(input: $createtodoinput) {\n id\n name\n where\n when\n description\n }\n}","variables":{"createtodoinput":{"name":"My first GraphQL task","when":"Friday Night","where":"Day 1","description":"Learn more about GraphQL"}}}'

변형 작업 테스트 - createTodo 응답

{ "data": { "createTodo": { "id": "<todo-id>", "name": "My first GraphQL task", "where": "Day 1", "when": "Friday Night", "description": "Learn more about GraphQL" } } }

쿼리 작업 테스트 - listTodos 요청

curl https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql \ -H "Content-Type:application/graphql" \ -H "x-api-key:da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}" \ -d '{"query":"query ListTodos {\n listTodos {\n items {\n description\n id\n name\n when\n where\n }\n }\n}\n","variables":{"createtodoinput":{"name":"My first GraphQL task","when":"Friday Night","where":"Day 1","description":"Learn more about GraphQL"}}}'

쿼리 작업 테스트 - listTodos 요청

{ "data": { "listTodos": { "items": [ { "description": "Learn more about GraphQL", "id": "<todo-id>", "name": "My first GraphQL task", "when": "Friday night", "where": "Day 1" } ] } } }

구독 작업 테스트 - createTodo 변형 구독

AWS AppSync에서 GraphQL 구독을 설정하려면 실시간 WebSocket 클라이언트 빌드를 참조하세요. VPC의 Amazon EC2 인스턴스에서 wscat를 사용하여 AWS AppSync 프라이빗 API 구독 엔드포인트를 테스트할 수 있습니다. 아래 예에서는 권한 부여를 위해 API KEY를 사용합니다.

$ header=`echo '{"host":"{api_url_identifier}.appsync-api.{region}.amazonaws.com","x-api-key":"da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}"}' | base64 | tr -d '\n'` $ wscat -p 13 -s graphql-ws -c "wss://{api_url_identifier}.appsync-realtime-api.us-west-2.amazonaws.com/graphql?header=$header&payload=e30=" Connected (press CTRL+C to quit) > {"type": "connection_init"} < {"type":"connection_ack","payload":{"connectionTimeoutMs":300000}} < {"type":"ka"} > {"id":"f7a49717","payload":{"data":"{\"query\":\"subscription onCreateTodo {onCreateTodo {description id name where when}}\",\"variables\":{}}","extensions":{"authorization":{"x-api-key":"da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}","host":"{api_url_identifier}.appsync-api.{region}.amazonaws.com"}}},"type":"start"} < {"id":"f7a49717","type":"start_ack"}

또는 VPC 엔드포인트 도메인 이름을 사용하고 wscat 명령에서 호스트 헤더를 지정하여 WebSocket을 설정해야 합니다.

$ header=`echo '{"host":"{api_url_identifier}.appsync-api.{region}.amazonaws.com","x-api-key":"da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}"}' | base64 | tr -d '\n'` $ wscat -p 13 -s graphql-ws -c "wss://{vpc_endpoint_id}-{endpoint_dns_identifier}.appsync-api.{region}.vpce.amazonaws.com/graphql?header=$header&payload=e30=" --header Host:{api_url_identifier}.appsync-realtime-api.us-west-2.amazonaws.com Connected (press CTRL+C to quit) > {"type": "connection_init"} < {"type":"connection_ack","payload":{"connectionTimeoutMs":300000}} < {"type":"ka"} > {"id":"f7a49717","payload":{"data":"{\"query\":\"subscription onCreateTodo {onCreateTodo {description id priority title}}\",\"variables\":{}}","extensions":{"authorization":{"x-api-key":"da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}","host":"{api_url_identifier}.appsync-api.{region}.amazonaws.com"}}},"type":"start"} < {"id":"f7a49717","type":"start_ack"}

아래 변형 코드를 실행하세요.

curl https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql \ -H "Content-Type:application/graphql" \ -H "x-api-key:da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}" \ -d '{"query":"mutation add($createtodoinput: CreateTodoInput!) {\n createTodo(input: $createtodoinput) {\n id\n name\n where\n when\n description\n }\n}","variables":{"createtodoinput":{"name":"My first GraphQL task","when":"Friday Night","where":"Day 1","description":"Learn more about GraphQL"}}}'

이후 구독이 시작되고 아래와 같이 메시지 알림이 표시됩니다.

< {"id":"f7a49717","type":"data","payload":{"data":{"onCreateTodo":{"description":"Go to the shops","id":"169ce516-b7e8-4a6a-88c1-ab840184359f","priority":5,"title":"Go to the shops"}}}}

IAM 정책을 사용하여 퍼블릭 API 생성 제한

AWS AppSync에서는 프라이빗 API와 함께 사용할 수 있는 IAM Condition 설명을 지원합니다. 프라이빗 및 퍼블릭 API를 생성할 수 있는 IAM 역할 및 사용자를 제어하는 appsync:CreateGraphqlApi 작업을 위해 IAM 정책 설명과 함께 visibility 필드를 포함할 수 있습니다. 이렇게 하면 IAM 관리자는 사용자가 프라이빗 GraphQL API만 생성할 수 있도록 하는 IAM 정책을 정의할 수 있습니다. 퍼블릭 API를 생성하려는 사용자에게는 권한 없음 메시지가 표시됩니다.

예를 들어 IAM 관리자는 다음과 같은 IAM 정책 설명을 생성하여 프라이빗 API 생성을 허용할 수 있습니다.

{ "Sid": "AllowPrivateAppSyncApis", "Effect": "Allow", "Action": "appsync:CreateGraphqlApi", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "appsync:Visibility": "PRIVATE" } } }

또한 IAM 관리자는 다음과 같은 서비스 제어 정책을 추가하여 AWS 조직의 모든 사용자가 프라이빗 API 이외의 AWS AppSync API를 생성하지 못하도록 할 수 있습니다.

{ "Sid": "BlockNonPrivateAppSyncApis", "Effect": "Deny", "Action": "appsync:CreateGraphqlApi", "Resource": "*", "Condition": { "ForAnyValue:StringNotEquals": { "appsync:Visibility": "PRIVATE" } } }