[Документация Yandex Cloud](../../index.md) > [Yandex Cloud Notification Service](../index.md) > [Инструменты](index.md) > AWS SDK для Java

# Как начать работать с AWS SDK для Java в Yandex Cloud Notification Service


Чтобы начать работу с AWS SDK для Java:

1. [Подготовьте облако к работе](#before-you-begin).
1. [Получите статический ключ доступа](#static-key).
1. [Настройте AWS SDK](#aws-sdk).
1. [Создайте канал уведомлений](#create-channel).
1. [Получите список каналов](#list-channel).
1. [Создайте эндпоинт](#create-endpoint).
1. [Отправьте уведомление](#publish).


## Подготовьте облако к работе {#before-you-begin}

Зарегистрируйтесь в Yandex Cloud и создайте [платежный аккаунт](../../billing/concepts/billing-account.md):
1. Перейдите в [консоль управления](https://console.yandex.cloud), затем войдите в Yandex Cloud или зарегистрируйтесь.
1. На странице **[Yandex Cloud Billing](https://center.yandex.cloud/billing/accounts)** убедитесь, что у вас подключен платежный аккаунт, и он находится в [статусе](../../billing/concepts/billing-account-statuses.md) `ACTIVE` или `TRIAL_ACTIVE`. Если платежного аккаунта нет, [создайте его](../../billing/quickstart/index.md) и [привяжите](../../billing/operations/pin-cloud.md) к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором будет работать ваша инфраструктура, на [странице облака](https://console.yandex.cloud/cloud).

[Подробнее об облаках и каталогах](../../resource-manager/concepts/resources-hierarchy.md).


## Получите статический ключ доступа {#static-key}

Для аутентификации в Cloud Notification Service используется [статический ключ доступа](../../iam/concepts/authorization/access-key.md). Этот ключ выпускается на [сервисный аккаунт](../../iam/concepts/users/service-accounts.md), и все действия выполняются от имени этого сервисного аккаунта.

Чтобы получить статический ключ доступа:
1. [Создайте](../../iam/operations/sa/create.md) сервисный аккаунт.
1. [Назначьте](../../iam/operations/sa/assign-role-for-sa.md) сервисному аккаунту [роль](../../iam/roles-reference.md#editor) `editor` на каталог.
1. Для сервисного аккаунта [создайте](../../iam/operations/authentication/manage-access-keys.md#create-access-key) статический ключ доступа.

    Сохраните идентификатор и секретный ключ.


## Настройте AWS SDK {#aws-sdk}

Пререквизиты и инструкция по установке AWS SDK для Java описаны в [документации AWS](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html#setup-overview).

### Подготовьте ОС к работе {#prepare-os}

1. Установите Java версии 8 или выше, например, [Oracle Java SE Development Kit](https://www.oracle.com/java/technologies/downloads/). Другие JDK, с которыми работает AWS SDK описаны в [документации AWS](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html#setup-envtools).
1. Установите систему сборки [maven](https://maven.apache.org/download.cgi).


### Создайте проект {#create-project}

1. Создайте структуру проекта в выбранной директории:

    ```text
    project
    ├──pom.xml
    └──src
        └──main
          └──java
              └──org
                └──example
                    └──App.java
    ```

1. Создайте клиент в файле `App.java` в директории `src/main/java/org/example`:

    ```java
    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();
    
            // Используйте snsClient
    
            snsClient.close();
        }
    
        public static SnsClient getSnsClient() {
            try {
                return SnsClient.builder()
                        .region(Region.of("kz1"))
                        .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials
                                .create("<идентификатор_статического_ключа>", "<секретный_ключ>")))
                        .endpointOverride(new URI("https://notifications.yandexcloud.net/"))
                        .httpClientBuilder(ApacheHttpClient.builder())
                        .build();
            } catch (URISyntaxException e) {
                System.err.println(e);
                System.exit(1);
            }
            return null;
        }
    }
    ```

    Где `AwsBasicCredentials` содержит идентификатор статического ключа и секретный ключ.

1. Добавьте конфигурацию проекта в файл `pom.xml`:

    ```xml
    <?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>
    ```

1. Соберите проект:

    ```bash
    mvn clean package
    ```

1. Выполните следующую команду для запуска проекта:

    ```bash
    mvn exec:java -Dexec.mainClass="org.example.App"
    ```


## Создайте канал уведомлений {#create-channel}

1. Импортируйте классы:

    ```java
    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;
    ```

1. Выполните код:

    ```java
    try {
        Map<String, String> attributes = new HashMap<>();
        attributes.put("<тип_аутентификации>", "<ключ>");
        CreatePlatformApplicationRequest request = CreatePlatformApplicationRequest.builder()
                .platform("<тип_платформы>")
                .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);
    }
    ```

    Где:

    * `attributes` — параметры аутентификации на мобильной платформе в формате `ключ=значение`. Значения зависят от типа платформы:

        * APNs:
        
            * Аутентификация с токеном:
        
                * `PlatformPrincipal` — путь к файлу с ключом подписи токена, полученный в Apple.
                * `PlatformCredential` — идентификатор ключа подписи (Key ID).
                * `ApplePlatformTeamID` — идентификатор разработчика (Team ID).
                * `ApplePlatformBundleID` — идентификатор приложения (Bundle ID).
        
            * Аутентификация с сертификатом:
        
                * `PlatformPrincipal` — SSL-сертификат в формате `.pem`.
                * `PlatformCredential` — закрытый ключ сертификата в формате `.pem`.
        
                    Чтобы сохранить сертификат и закрытый ключ в отдельных файлах формата `.pem`, вы можете воспользоваться утилитой [openssl](https://docs.openssl.org/1.1.1/man1/pkcs12) в Linux:
                    
                    ```bash
                    openssl pkcs12 -in Certificates.p12 -nokeys -nodes -out certificate.pem
                    openssl pkcs12 -in Certificates.p12 -nocerts -nodes -out privatekey.pem
                    ```
        
            Аутентификация с токеном — более современный и безопасный метод.
        
        * FCM: `PlatformCredential` — ключ сервисного аккаунта Google Cloud в формате JSON для аутентификации с помощью HTTP v1 API или API-ключ (server key) для аутентификации с помощью Legacy API.
        
            Используйте HTTP v1 API, так как с июля 2024 года [FCM legacy API не поддерживается](https://firebase.google.com/docs/cloud-messaging/migrate-v1).
        
        * HMS:
        
            * `PlatformPrincipal` — идентификатор ключа.
            * `PlatformCredential` — API-ключ.

    * `platform` — тип мобильной платформы:

        * `APNS` и `APNS_SANDBOX` — Apple Push Notification service (APNs). Для тестирования приложения используйте `APNS_SANDBOX`.
        * `GCM` — Firebase Cloud Messaging (FCM).
        * `HMS` — Huawei Mobile Services (HMS).
        * `RUSTORE` — RuStore Android.

    * `name` — имя канала уведомлений, задается пользователем.
  
        Имя должно быть уникальным для всего CNS. После создания канала изменить имя нельзя. Имя может содержать строчные и заглавные буквы латинского алфавита, цифры, подчеркивания, дефисы и точки. Длина — от 1 до 256 символов. Рекомендуется для каналов APNs указывать в имени идентификатор приложения (Bundle ID), для FCM и HMS — полное название пакета приложения (Package name), для RuStore — значение `packageName`.

    В результате вы получите идентификатор (ARN) канала уведомлений.


## Получите список каналов уведомлений {#list-channel}

1. Импортируйте классы:

    ```java
    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;
    ```

1. Выполните код:

    ```java
    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);
    }
    ```

    В результате будет выведен список каналов уведомлений, размещенных в том же каталоге, в котором находится сервисный аккаунт.

## Создайте эндпоинт {#create-endpoint}

1. Импортируйте классы:

    ```java
    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;
    ```

1. Выполните код:

    ```java
    try {
        CreatePlatformEndpointRequest request = CreatePlatformEndpointRequest.builder()
                .platformApplicationArn("<ARN_канала_уведомлений>")
                .token("<Push-токен>")
                .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);
    }
    ```

    Где:

    * `platformApplicationArn` — идентификатор (ARN) канала уведомлений.
    * `token` — уникальный Push-токен приложения на устройстве пользователя.


## Отправьте уведомление {#publish}

### Явные уведомления (Bright Push) {#bright-push}

1. Импортируйте классы:

    ```java
    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;
    ```

1. Выполните код:

    {% list tabs %}

    - Apple iOS (APNs)

      ```java
      try {
          PublishRequest request = PublishRequest.builder()
                  .targetArn("<ARN_эндпоинта>")
                  .message("{\"default\": \"<текст_уведомления>\", \"APNS\": \"{\\\"aps\\\": {\\\"alert\\\": \\\"<текст_уведомления>\\\"}}\"}")
                  .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);
      }
      ```

    - Google Android (GCM)

      ```java
      try {
          PublishRequest request = PublishRequest.builder()
                  .targetArn("<ARN_эндпоинта>")
                  .message("{\"default\": \"<текст_уведомления>\", \"GCM\": \"{\\\"notification\\\": {\\\"body\\\": \\\"<текст_уведомления>\\\"}}\"}")
                  .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);
      }
      ```

    {% endlist %}

    Где:

    * `targetArn` — идентификатор (ARN) мобильного эндпоинта.
    * `messageStructure` — формат сообщения.
    * `message` — сообщение.

### Тихие уведомления (Silent Push) {#silent-push}

1. Импортируйте классы:

    ```java
    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;
    ```

1. Выполните код:

    {% list tabs %}

    - Apple iOS (APNs)

      ```java
      try {
          PublishRequest request = PublishRequest.builder()
                  .targetArn("<ARN_эндпоинта>")
                  .message("{\"default\": \"<текст_уведомления>\", \"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);
      }
      ```

    - Google Android (GCM)

      ```java
      try {
          PublishRequest request = PublishRequest.builder()
                  .targetArn("<ARN_эндпоинта>")
                  .message("{\"default\": \"<текст_уведомления>\", \"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);
      }
      ```

    {% endlist %}

    Где:

    * `targetArn` — идентификатор (ARN) мобильного эндпоинта.
    * `message` — сообщение.
    * `messageStructure` — формат сообщения.

### SMS-сообщения {#sms-messages}

1. Импортируйте классы:

    ```java
    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;
    ```

1. Выполните код:

    ```java
    try {
        Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
        messageAttributes.put("AWS.SNS.SMS.SenderID", MessageAttributeValue.builder()
                .stringValue("<текстовое_имя_отправителя>")
                .dataType("String").build());

        PublishRequest request = PublishRequest.builder()
                .phoneNumber("<номер_телефона>")
                .message("<текст_уведомления>")
                .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);
    }
    ```

    Где:

    * `stringValue` — текстовое имя отправителя.
    * `phoneNumber` — номер телефона получателя.
    * `message` — текст уведомления.


#### Полезные ссылки {#see-also}

* [Начало работы](../quickstart.md)
* [AWS CLI](aws-cli.md)
* [Концепции](../concepts/index.md)
* [Документация AWS](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html)