기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon Virtual Private Cloud(VPC)를 사용하는 경우 VPC에서만 액세스할 수 있는 APIs인 AWS AppSync 프라이빗 APIs를 생성할 수 있습니다. 프라이빗 API를 사용하면 데이터를 공개적으로 노출하지 않으면서 내부 애플리케이션에 대한 API 액세스를 제한하고 GraphQL 및 Realtime 엔드포인트에 연결할 수 있습니다.
VPC와 AWS AppSync 서비스 간에 프라이빗 연결을 설정하려면 인터페이스 VPC 엔드포인트를 생성해야 합니다. 인터페이스 엔드포인트는 로 구동되므로 인터넷 게이트웨이AWS PrivateLink

프라이빗 API 기능을 활성화하기 전에 몇 가지 사항을 추가로 고려해야 합니다.
-
프라이빗 DNS 기능이 활성화된 AWS AppSync 에 VPC 인터페이스 엔드포인트를 설정하면 VPC의 리소스가 AWS AppSync 생성된 APIs URL을 사용하여 다른 AWS AppSync 퍼블릭 API를 호출할 수 없습니다. 이는 퍼블릭 API에 대한 요청이 인터페이스 엔드포인트를 통해 라우팅되는데, 퍼블릭 API에 허용되지 않는 방식이기 때문입니다. 이 시나리오에서 퍼블릭 API를 간접적으로 호출하려면 퍼블릭 API에서 사용자 지정 도메인 이름을 구성하는 것이 좋습니다. 그렇게 하면 퍼블릭 API를 간접적으로 호출하는 데 VPC의 리소스가 사용될 수 있습니다.
-
AWS AppSync 프라이빗 APIs VPC에서만 사용할 수 있습니다. AWS AppSync 콘솔 쿼리 편집기는 브라우저의 네트워크 구성이 VPC로 트래픽을 라우팅할 수 있는 경우에만 API에 연결할 수 있습니다(예: VPN을 통한 연결 또는를 통한 연결 AWS Direct Connect).
-
용 VPC 인터페이스 엔드포인트를 AWS AppSync사용하면 동일한 AWS 계정 및 리전의 모든 프라이빗 API에 액세스할 수 있습니다. 프라이빗 API에 대한 액세스를 추가로 제한하려면 다음 옵션을 고려해 보세요.
-
필요한 관리자만 VPC 엔드포인트 인터페이스를 생성할 수 있도록 합니다 AWS AppSync.
-
VPC 엔드포인트 사용자 지정 정책을 사용하여 VPC의 리소스에서 간접적으로 호출할 수 있는 API를 제한합니다.
-
VPC의 리소스의 경우 리소스에 AWS AppSync APIs에 대한 범위 축소 역할이 부여되도록 하여 IAM 권한 부여를 사용하여 APIs를 호출하는 것이 좋습니다.
-
-
IAM 보안 주체를 제한하는 정책을 만들거나 사용할 때는 메서드의
authorizationType
을AWS_IAM
또는NONE
으로 설정해야 합니다.
AWS AppSync 프라이빗 APIs 생성
아래 단계는 AWS AppSync 서비스에서 프라이빗 APIs를 생성하는 방법을 보여줍니다.
주의
API를 생성하는 동안에만 프라이빗 API 기능을 활성화할 수 있습니다. 이 설정은 API 또는 AWS AppSync 프라이빗 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 AppSync 사용하여 용 인터페이스 엔드포인트를 생성할 수 있습니다AWS CLI. 자세한 내용은 Amazon VPC 사용 설명서의 인터페이스 엔드포인트 생성을 참조하세요.
-
에 로그인 AWS Management Console 하고 Amazon VPC 콘솔의 엔드포인트
페이지를 엽니다. -
Create endpoint(엔드포인트 생성)을 선택합니다.
-
서비스 카테고리 필드에서 AWS 서비스가 선택되어 있는지 확인합니다.
-
서비스 테이블에서
com.amazonaws.{region}.appsync-api
를 선택합니다. 유형 열 값이Interface
인지 확인합니다. -
VPC 필드에서 VPC와 서브넷을 선택합니다.
-
인터페이스 엔드포인트에 대한 프라이빗 DNS 기능을 활성화하려면 DNS 이름 활성화 확인란을 선택합니다.
-
보안 그룹 필드에서 보안 그룹을 하나 이상 선택합니다.
-
-
Create endpoint(엔드포인트 생성)을 선택합니다.
프라이빗 DNS 옵션을 사용하려면 VPC의 enableDnsHostnames
및 enableDnsSupportattributes
값을 설정해야 합니다. 자세한 내용은 Amazon VPC 사용 설명서의 VPC에 대한 DNS 지원 보기 및 업데이트를 참조하세요. 인터페이스 엔드포인트에 대해 프라이빗 DNS 기능을 활성화하는 경우 아래 형식을 사용하여 기본 퍼블릭 DNS 엔드포인트를 사용하여 AWS AppSync API GraphQL 및 실시간 엔드포인트에 요청할 수 있습니다.
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 및 실시간 엔드포인트에 요청할 수 있습니다.
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
변형 구독
에서 GraphQL 구독을 설정하려면 실시간 WebSocket 클라이언트 구축을 AWS AppSync참조하세요. 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 는 프라이빗 APIs와 함께 사용할 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 AppSync APIs 이외의 API를 AWS 생성하지 못하도록 다음 서비스 제어 정책을 추가할 수도 APIs.
{
"Sid": "BlockNonPrivateAppSyncApis",
"Effect": "Deny",
"Action": "appsync:CreateGraphqlApi",
"Resource": "*",
"Condition": {
"ForAnyValue:StringNotEquals": {
"appsync:Visibility": "PRIVATE"
}
}
}