기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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
프라이빗 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 보안 주체를 제한하는 정책을 만들거나 사용할 때는 메서드의
authorizationType
을AWS_IAM
또는NONE
으로 설정해야 합니다.
AWS AppSync 프라이빗 API 생성
다음 단계는 AWS AppSync 서비스에서 프라이빗 API를 만드는 방법을 보여 줍니다.
주의
API를 생성하는 동안에만 프라이빗 API 기능을 활성화할 수 있습니다. 생성한 이후에는 AWS AppSync API 또는 AWS AppSync 프라이빗 API에서 이 설정을 수정할 수 없습니다.
-
AWS Management Console에 로그인한 다음 AppSync 콘솔
을 엽니다. -
대시보드에서 API 생성을 선택합니다.
-
-
처음부터 API 설계를 선택하고 다음을 선택합니다.
-
프라이빗 API 섹션에서 프라이빗 API 기능 사용을 선택합니다.
-
나머지 옵션을 구성하고 API의 데이터를 검토한 다음 생성을 선택합니다.
AWS AppSync 프라이빗 API를 사용하려면 먼저 VPC의 AWS AppSync에 인터페이스 엔드포인트를 구성해야 합니다. 단, 프라이빗 API와 VPC가 동일한 AWS 계정 및 리전에 있어야 합니다.
AWS AppSync에 대한 인터페이스 엔드포인트 생성
Amazon VPC 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 AWS AppSync에 대한 인터페이스 엔드포인트를 생성할 수 있습니다. 자세한 내용은 Amazon VPC 사용 설명서의 인터페이스 엔드포인트 생성을 참조하세요.
프라이빗 DNS 옵션을 사용하려면 VPC의 enableDnsHostnames
및 enableDnsSupportattributes
값을 설정해야 합니다. 자세한 내용은 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{ }
안의 값을 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 인스턴스에서 wscatAPI
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" } } }