플랫폼 엔드포인트 생성 - Amazon Simple Notification Service

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

플랫폼 엔드포인트 생성

앱과 모바일 디바이스가 푸시 알림 서비스에 등록되면 푸시 알림 서비스는 디바이스 토큰을 반환합니다. Amazon SNS는 디바이스 토큰을 사용하여 직접 푸시 알림 메시지를 보낼 수 있는 모바일 엔드포인트를 생성합니다. 자세한 정보는 Amazon SNS 사용자 알림에 대한 사전 조건사용자 알림 프로세스 개요에서 확인하세요.

이 섹션에서는 플랫폼 엔드포인트를 생성할 때 권장되는 방법에 대해 설명합니다.

플랫폼 엔드포인트 생성

Amazon SNS로 앱에 알림을 푸시하려면 먼저 플랫폼 엔드포인트 생성 작업을 호출해 Amazon SNS에 해당 앱의 디바이스 토큰을 등록해야 합니다. 이 작업은 플랫폼 애플리케이션의 Amazon 리소스 이름(ARN)과 디바이스 토큰을 파라미터로 취하고 생성된 플랫폼 엔드포인트의 ARN을 반환합니다.

플랫폼 엔드포인트 생성 작업은 다음을 수행합니다.

  • 플랫폼 엔드포인트가 이미 있는 경우 다시 생성하지 마십시오. 기존 플랫폼 엔드포인트의 ARN 호출자로 돌아가십시오.

  • 디바이스 토큰은 같지만 설정이 다른 플랫폼 엔드포인트가 이미 있는 경우 다시 생성하지 마십시오. 호출자에 예외를 발생시키십시오.

  • 플랫폼 엔드포인트가 없으면 생성하세요. 새로 생성한 플랫폼 엔드포인트의 ARN 호출자로 돌아가십시오.

앱이 시작할 때마다 바로 플랫폼 엔드포인트 생성 작업을 호출해서는 안 됩니다. 이 방법이 항상 작동하는 엔드포인트를 제공하는 것은 아니기 때문입니다. 이러한 상황은 예를 들면 같은 디바이스에서 앱을 제거했다가 다시 설치하고, 이에 대한 엔드포인트가 이미 있지만 비활성화된 경우에 발생할 수 있습니다. 성공적으로 등록하면 다음과 같은 결과를 얻을 수 있어야 합니다.

  1. 이 앱-디바이스 조합에 대해 플랫폼 엔드포인트가 있는지 확인합니다.

  2. 플랫폼 엔드포인트의 디바이스 토큰이 유효한 최신 디바이스 토큰인지 확인합니다.

  3. 플랫폼 엔드포인트가 활성화되어 있고 사용할 준비가 되어 있는지 확인합니다.

의사(Pseudo) 코드

다음 의사(pseudo) 코드는 다양한 시작 조건에서 작동하고 활성화된 현재 플랫폼 엔드포인트를 생성하는 데 권장되는 사례를 설명합니다. 이 방법은 앱을 처음 등록하는지 아닌지, 이 앱의 플랫폼 엔드포인트가 이미 있는지, 플랫폼 엔드포인트가 활성화되어 있는지, 올바른 디바이스 토큰이 있는지 여부에 상관없이 효과가 있습니다. 연이어 여러 번 호출해도 중복 플랫폼 엔드포인트가 생성되거나, 이미 최신 상태이고 활성화된 경우에 기존 플랫폼 엔드포인트가 변경되지 않으므로 무관합니다.

retrieve the latest device token from the mobile operating system if (the platform endpoint ARN is not stored) # this is a first-time registration call create platform endpoint store the returned platform endpoint ARN endif call get endpoint attributes on the platform endpoint ARN if (while getting the attributes a not-found exception is thrown) # the platform endpoint was deleted call create platform endpoint with the latest device token store the returned platform endpoint ARN else if (the device token in the endpoint does not match the latest one) or (get endpoint attributes shows the endpoint as disabled) call set endpoint attributes to set the latest device token and then enable the platform endpoint endif endif

이 방법은 앱에서 자체적으로 등록하거나 다시 등록하려 할 때마다 사용할 수 있습니다. Amazon SNS에 디바이스 토큰 변경을 알리는 데에도 사용됩니다. 이 경우 최신 디바이스 토큰 값으로 작업을 호출하면 됩니다. 이 방법에 대해 유의해야 할 몇 가지 사항은 다음과 같습니다.

  • 플랫폼 엔드포인트 생성 작업을 호출할 수도 있는 두 가지 경우가 있습니다. 최초 등록 중에서와 같이 앱에서 자신의 고유한 플랫폼 엔드포인트 ARN을 인식하지 못하는 맨 처음에 호출할 수 있습니다. 애플리케이션에서 해당 엔드포인트 ARN을 인식하지만 삭제된 경우와 같이 초기 엔드포인트 속성 가져오기 작업 호출이 찾을 수 없음 예외와 함께 실패할 경우에도 호출될 수 있습니다.

  • 방금 플랫폼 엔드포인트를 생성했더라도 플랫폼 엔드포인트의 상태를 확인하기 위해 엔드포인트 속성 가져오기 작업이 호출됩니다. 이러한 상황은 플랫폼 엔드포인트가 이미 있지만 비활성화되어 있는 경우에 발생합니다. 이 경우 플랫폼 엔드포인트 생성 작업이 성공하지만 플랫폼 엔드포인트가 활성화되지 않기 때문에 성공을 반환하기 전에 플랫폼 엔드포인트의 상태를 다시 한 번 확인해야 합니다.

AWS SDK 예제

다음 코드는 SDK에서 제공하는 Amazon SNS 클라이언트를 사용하여 이전 유사 코드를 구현하는 방법을 보여줍니다. AWS

AWS SDK를 사용하려면 자격 증명으로 구성해야 합니다. 자세한 정보는 AWS SDK 및 도구 참조 가이드의 공유 구성 및 자격 증명 파일을 참조하세요.

CLI
AWS CLI

플랫폼 애플리케이션 엔드포인트를 생성하려면

다음 create-platform-endpoint 예제에서는 지정된 토큰을 사용하여 지정된 플랫폼 애플리케이션의 엔드포인트를 생성합니다.

aws sns create-platform-endpoint \ --platform-application-arn arn:aws:sns:us-west-2:123456789012:app/GCM/MyApplication \ --token EXAMPLE12345...

출력:

{ "EndpointArn": "arn:aws:sns:us-west-2:1234567890:endpoint/GCM/MyApplication/12345678-abcd-9012-efgh-345678901234" }
Java
SDK for Java 2.x
참고

자세한 내용은 에서 확인할 수 있습니다. GitHub AWS 코드 예제 리포지토리에서 전체 예제를 찾고 설정 및 실행하는 방법을 배워보세요.

import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.CreatePlatformEndpointRequest; import software.amazon.awssdk.services.sns.model.CreatePlatformEndpointResponse; import software.amazon.awssdk.services.sns.model.SnsException; /** * Before running this Java V2 code example, set up your development * environment, including your credentials. * * For more information, see the following documentation topic: * * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html * * In addition, create a platform application using the AWS Management Console. * See this doc topic: * * https://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-register.html * * Without the values created by following the previous link, this code examples * does not work. */ public class RegistrationExample { public static void main(String[] args) { final String usage = """ Usage: <token> <platformApplicationArn> Where: token - The name of the FIFO topic.\s platformApplicationArn - The ARN value of platform application. You can get this value from the AWS Management Console.\s """; if (args.length != 2) { System.out.println(usage); System.exit(1); } String token = args[0]; String platformApplicationArn = args[1]; SnsClient snsClient = SnsClient.builder() .region(Region.US_EAST_1) .build(); createEndpoint(snsClient, token, platformApplicationArn); } public static void createEndpoint(SnsClient snsClient, String token, String platformApplicationArn) { System.out.println("Creating platform endpoint with token " + token); try { CreatePlatformEndpointRequest endpointRequest = CreatePlatformEndpointRequest.builder() .token(token) .platformApplicationArn(platformApplicationArn) .build(); CreatePlatformEndpointResponse response = snsClient.createPlatformEndpoint(endpointRequest); System.out.println("The ARN of the endpoint is " + response.endpointArn()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } } }

자세한 설명은 모바일 푸시 API 작업 섹션을 참조하세요.

문제 해결

오래된 디바이스 토큰으로 플랫폼 엔드포인트 생성 반복 호출

중요

FCM V1 엔드포인트의 경우 비활성 토큰의 자동 토큰 새로고침은 지원되지 않습니다. Google Firebase 문서의 FCM 등록 토큰 관리 모범 사례에서 권장하는 대로 등록 토큰을 최신으로 유지해야 합니다. 이렇게 하려면 모바일 앱을 업데이트하여 토큰을 주기적으로 새로 고치고 새 토큰으로 SetEndpointAttributesAPI를 호출하면 됩니다.

기기 토큰을 업데이트하기 위해 CreatePlatformEndpointAPI를 여러 번 호출하면 다음과 같은 문제가 발생합니다.

  • 기존 FCM API 엔드포인트 전용 — Amazon SNS는 Google Firebase (FCM) 의 피드백을 바탕으로 만료된 디바이스 토큰을 새 디바이스 토큰으로 업데이트합니다. FCM은 일정 기간 동안 이전 디바이스 토큰에 대한 정보를 유지하지만 무기한은 아닙니다. FCM이 기존 디바이스 토큰과 새 디바이스 토큰 간의 연결을 잊어버리면 Amazon SNS는 더 이상 플랫폼 엔드포인트에 저장된 디바이스 토큰을 올바른 값으로 업데이트할 수 없습니다. 따라서 Amazon SNS는 잘못된 플랫폼 엔드포인트를 비활성화합니다.

  • CreatePlatformEndpoint여러 번 호출하면 동일한 디바이스 및 디바이스 토큰에 대해 여러 플랫폼 엔드포인트가 생성됩니다.

  • 결국 동일한 디바이스 토큰을 사용할 수 있는 디바이스 수 할당량에 도달하면 “이 엔드포인트는 이미 다른 토큰으로 등록되어 있습니다.” 라는 오류 메시지가 표시됩니다.

토큰이나 기타 모바일 애플리케이션 엔드포인트 속성을 올바르게 업데이트하려면 이미 생성한 엔드포인트에 대해 SetEndpointAttributes API를 호출하는 것이 좋습니다.

유효하지 않은 디바이스 토큰과 연결된 플랫폼 엔드포인트 다시 활성화

모바일 플랫폼(예: APN 또는 FCM)에서 Amazon SNS에 게시 요청에 사용된 디바이스 토큰이 유효하지 않다고 알리면 Amazon SNS에서 해당 디바이스 토큰과 연결된 플랫폼 엔드포인트를 비활성화합니다. 그리고 나서 Amazon SNS는 해당 디바이스 토큰에 대한 후속 게시를 거부합니다. 플랫폼 엔드포인트를 다시 활성화하고 계속 게시하는 것이 최선이라고 생각할지도 모르겠지만, 대부분의 경우에서 이렇게 하면 아무 효과가 없습니다. 즉, 게시되는 메시지가 전송되지 않고 플랫폼 엔드포인트가 이후에 곧 다시 비활성화됩니다.

플랫폼 엔드포인트와 연결된 디바이스 토큰이 실제로 유효하지 않기 때문입니다. 더 이상 설치된 앱에 해당하지 않기 때문에 여기에 전송해도 실패하는 것입니다. 다음에 게시되면 모바일 플랫폼에서 다시 한 번 Amazon SNS에 디바이스 토큰이 유효하지 않다고 알려 주고, Amazon SNS가 또 다시 플랫폼 엔드포인트를 비활성화합니다.

비활성화된 플랫폼 엔드포인트를 다시 활성화하려면 설정된 엔드포인트 속성 작업 호출과 함께 유효한 디바이스 토큰과 연결한 후에 활성화해야 합니다. 그래야만 해당 플랫폼 엔드포인트에 전송해도 성공할 수 있습니다. 해당 장치 토큰을 업데이트하지 않고 플랫폼 엔드포인트를 다시 활성화해도 효과가 있는 유일한 경우는 해당 엔드포인트와 연결된 장치 토큰이 이전에는 유효하지 않았다가 다시 유효해진 경우입니다. 이러한 상황은 예를 들면 같은 모바일 디바이스에서 앱을 제거했다가 다시 설치하고, 같은 디바이스 토큰을 받을 경우에 발생할 수 있습니다. 위에 소개한 방법은 이와 같이 연결된 디바이스 토큰이 제공되는 가장 최신 디바이스 토큰임을 확인한 후에만 플랫폼 엔드포인트를 다시 활성화하도록 합니다.