How to get started with the AWS SDK for Java in Yandex Cloud Notification Service
Note
The service is at the preview stage.
To get started with the AWS SDK for Java:
- Get your cloud ready.
- Get a static access key.
- Configure the AWS SDK.
- Create a notification channel.
- Get a list of channels.
- Create an endpoint.
- Send a notification.
Get your cloud ready
Sign up for Yandex Cloud and create a billing account:
- Go to the management console
and log in to Yandex Cloud or create an account if you do not have one yet. - On the Yandex Cloud Billing
page, make sure you have a billing account linked and it has theACTIVE
orTRIAL_ACTIVE
status. If you do not have a billing account, create one.
If you have an active billing account, you can go to the cloud page
Learn more about clouds and folders.
Get a static access key
For authentication in Cloud Notification Service, use a static access key. The key is issued for the service account, and all actions are performed on behalf of that service account.
To get a static access key:
-
Create a service account.
-
Assign the
editor
role for the folder to the service account. -
Create a static access key for the service account.
Save the ID and secret key.
Configure the AWS SDK
You can find the prerequisites and an AWS SDK for Java installation guide in the relevant AWS documentation
Get your OS ready
- Install Java 8 or higher, e.g., Oracle Java SE Development Kit
. For other JDKs you can use with the AWS SDK, see the AWS developer guide . - Install maven
.
Create a project
-
In the selected directory, create the project structure:
project ├──pom.xml └──src └──main └──java └──org └──example └──App.java
-
Create a client in the
App.java
file in thesrc/main/java/org/example
directory:package org.example; import java.net.URI; import java.net.URISyntaxException; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; public class App { public static void main(String... args) { SnsClient snsClient = getSnsClient(); // Use snsClient snsClient.close(); } public static SnsClient getSnsClient() { try { return SnsClient.builder() .region(Region.of("ru-central1")) .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials .create("<static_key_ID>", "<secret_key>"))) .endpointOverride(new URI("https://notifications.yandexcloud.net/")) .httpClientBuilder(ApacheHttpClient.builder()) .build(); } catch (URISyntaxException e) { System.err.println(e); System.exit(1); } return null; } }
Where
AwsBasicCredentials
contains the static key ID and secret key. -
Add the project configuration into the
pom.xml
file:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>snstest</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.plugin.version>3.6.1</maven.compiler.plugin.version> <aws.java.sdk.version>2.27.21</aws.java.sdk.version> <slf4j.version>1.7.28</slf4j.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.java.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sns</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>${slf4j.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.plugin.version}</version> </plugin> </plugins> </build> </project>
-
Build the project:
mvn clean package
-
To start the project, run this command:
mvn exec:java -Dexec.mainClass="org.example.App"
Create a notification channel
-
Import the classes:
import java.util.HashMap; import java.util.Map; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.SnsException; import software.amazon.awssdk.services.sns.model.CreatePlatformApplicationRequest; import software.amazon.awssdk.services.sns.model.CreatePlatformApplicationResponse;
-
Run the following code:
try { Map<String, String> attributes = new HashMap<>(); attributes.put("<authentication_type>", "<key>"); CreatePlatformApplicationRequest request = CreatePlatformApplicationRequest.builder() .platform("<platform_type>") .name("<channel_name>") .attributes(attributes) .build(); CreatePlatformApplicationResponse response = snsClient.createPlatformApplication(request); System.out.printf("Platform application ARN: %s\n", response.platformApplicationArn()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
Where:
-
attributes
: Mobile platform authentication parameters inkey=value
format. The values depend on the platform:-
APNs:
-
Token-based authentication:
PlatformPrincipal
: Path to the token signature key file from ApplePlatformCredential
: Key IDApplePlatformTeamID
: Team IDApplePlatformBundleID
: Bundle ID
-
Certificate-based authentication:
-
PlatformPrincipal
: SSL certificate in.pem
format -
PlatformCredential
: Certificate private key in.pem
formatTo save the certificate and the private key in individual
.pem
files, use the openssl Linux utility:openssl pkcs12 -in Certificates.p12 -nokeys -nodes -out certificate.pem openssl pkcs12 -in Certificates.p12 -nocerts -nodes -out privatekey.pem
-
Token-based authentication: The more modern and secure method.
-
-
FCM:
PlatformCredential
is the Google Cloud service account key in JSON format for authentication with the HTTP v1 API or API key (server key) for authentication with the legacy API.Use the HTTP v1 API because the FCM legacy API is no longer supported
starting July 2024. -
HMS:
PlatformPrincipal
: Key IDPlatformCredential
: API key
-
-
platform
: Mobile platform type:APNS
andAPNS_SANDBOX
: Apple Push Notification service (APNs). UseAPNS_SANDBOX
to test the application.GCM
: Firebase Cloud Messaging (FCM).HMS
: Huawei Mobile Services (HMS).
-
name
: Notification channel name, user-defined. The name must be unique within the cloud. It may contain lowercase and uppercase Latin letters, numbers, underscores, hyphens, and periods. It may be from 1 to 256 characters long. For APNs channels, we recommend specifying the bundle ID in the name, and for FCM and HMS, the full package name.
As a result, you will get a notification channel ID (ARN).
-
Get a list of notification channels
-
Import the classes:
import java.util.Iterator; import java.util.List; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.SnsException; import software.amazon.awssdk.services.sns.model.ListPlatformApplicationsRequest; import software.amazon.awssdk.services.sns.model.ListPlatformApplicationsResponse; import software.amazon.awssdk.services.sns.model.PlatformApplication;
-
Run the following code:
try { ListPlatformApplicationsRequest request = ListPlatformApplicationsRequest.builder().build(); ListPlatformApplicationsResponse response = snsClient.listPlatformApplications(request); List<PlatformApplication> apps = response.platformApplications(); Iterator<PlatformApplication> iter = apps.iterator(); while (iter.hasNext()) { PlatformApplication app = (PlatformApplication) iter.next(); System.out.printf("Application ARN: %s\n", app.platformApplicationArn()); } } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
You will get the list of notification channels located in the same folder as the service account.
Create an endpoint
-
Import the classes:
import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.SnsException; import software.amazon.awssdk.services.sns.model.CreatePlatformEndpointRequest; import software.amazon.awssdk.services.sns.model.CreatePlatformEndpointResponse;
-
Run the following code:
try { CreatePlatformEndpointRequest request = CreatePlatformEndpointRequest.builder() .platformApplicationArn("<notification_channel_ARN>") .token("<push_token>") .build(); CreatePlatformEndpointResponse response = snsClient.createPlatformEndpoint(request); System.out.printf("Endpoint ARN: %s\n", response.endpointArn()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
Where:
platformApplicationArn
: Notification channel ID (ARN).token
: Unique push token for the application on the user’s device.
Send a notification
Explicit notifications (Bright Push)
-
Import the classes:
import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.SnsException; import software.amazon.awssdk.services.sns.model.PublishRequest; import software.amazon.awssdk.services.sns.model.PublishResponse;
-
Run the following code:
Apple iOS (APNs)Google Android (GCM)try { PublishRequest request = PublishRequest.builder() .targetArn("<endpoint_ARN>") .message("{\"default\": \"<notification_text>\", \"APNS\": \"{\\\"aps\\\": {\\\"alert\\\": \\\"<notification_text>\\\"}}\"}") .messageStructure("json") .build(); PublishResponse response = snsClient.publish(request); System.out.printf("Message id: %s\n", response.messageId()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
try { PublishRequest request = PublishRequest.builder() .targetArn("<endpoint_ARN>") .message("{\"default\": \"<notification_text>\", \"GCM\": \"{\\\"notification\\\": {\\\"body\\\": \\\"<notification_text>\\\"}}\"}") .messageStructure("json") .build(); PublishResponse response = snsClient.publish(request); System.out.printf("Message id: %s\n", response.messageId()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
Where:
targetArn
: Mobile endpoint ID (ARN)messageStructure
: Message formatmessage
: Message
Silent notifications (Silent Push)
-
Import the classes:
import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.SnsException; import software.amazon.awssdk.services.sns.model.PublishRequest; import software.amazon.awssdk.services.sns.model.PublishResponse;
-
Run the following code:
Apple iOS (APNs)Google Android (GCM)try { PublishRequest request = PublishRequest.builder() .targetArn("<endpoint_ARN>") .message("{\"default\": \"<notification_text>\", \"APNS\": \"{\\\"key\\\": \\\"value\\\"}\"}") .messageStructure("json") .build(); PublishResponse response = snsClient.publish(request); System.out.printf("Message id: %s\n", response.messageId()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
try { PublishRequest request = PublishRequest.builder() .targetArn("<endpoint_ARN>") .message("{\"default\": \"<notification_text>\", \"GCM\": \"{\\\"data\\\": {\\\"key\\\": \\\"value\\\"}}\"}") .messageStructure("json") .build(); PublishResponse response = snsClient.publish(request); System.out.printf("Message id: %s\n", response.messageId()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
Where:
targetArn
: Mobile endpoint ID (ARN)message
: MessagemessageStructure
: Message format
Text message
-
Import the classes:
import java.util.HashMap; import java.util.Map; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.SnsException; import software.amazon.awssdk.services.sns.model.MessageAttributeValue; import software.amazon.awssdk.services.sns.model.PublishRequest; import software.amazon.awssdk.services.sns.model.PublishResponse;
-
Run the following code:
try { Map<String, MessageAttributeValue> messageAttributes = new HashMap<>(); messageAttributes.put("AWS.SNS.SMS.SenderID", MessageAttributeValue.builder() .stringValue("<sender's_text_name>") .dataType("String").build()); PublishRequest request = PublishRequest.builder() .phoneNumber("<phone_number>") .message("<notification_text>") .messageAttributes(messageAttributes) .build(); PublishResponse response = snsClient.publish(request); System.out.printf("Message id: %s\n", response.messageId()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
Where:
stringValue
: Sender's text namephoneNumber
: Recipient's phone numbermessage
: Notification text