AWS SDK для JavaScript

AWS SDK для JavaScript

KOD

AWS SDK для JavaScript — это комплект средств разработки для взаимодействия с сервисами AWS, совместимый с Yandex Object Storage.

С помощью AWS SDK для Node.js вы создадите бакет, загрузите в него объекты, получите список объектов, извлечете отдельный объект, очистите содержимое бакета и удалите бакет.

Подготовка аутентификационных данных

Создайте директорию для хранения аутентификационных данных и перейдите в нее:

Для macOS и Linux:

mkdir ~/.aws/

Для Windows:

mkdir C:\Users\<имя_пользователя>\.aws\

В директории .aws создайте файл credentials с аутентификационными данными для Object Storage и скопируйте в него следующую информацию:

[default]
aws_access_key_id = <идентификатор_статического_ключа>
aws_secret_access_key = <секретный_ключ>

Создайте файл config с параметрами региона по умолчанию и скопируйте в него следующую информацию:

[default]
region = ru-central1
endpoint_url = https://storage.yandexcloud.net
Примечание
Некоторые приложения, предназначенные для работы с Amazon S3, не позволяют указывать регион, поэтому Object Storage принимает также значение us-east-1.

Для доступа к Object Storage используйте эндпоинт https://storage.yandexcloud.net. (или другой в зависимости от выбранного вами сервиса)

Подготовка директории проекта

  1. Установите Node.js.
  2. Создайте директорию, в которой будет находиться пример кода и перейдите в нее:
mkdir app
cd app
  1. Инициализируйте проект Node.js и установите библиотеку aws-sdk/client-s3 командой:
npm init -y && npm i @aws-sdk/client-s3
  1. Чтобы указать, что в проекте будет использоваться синтаксис ESM (ECMAScript Moudules), добавьте в файл package.json строку "type": "module". В директории будет создан файл package.json с базовыми настройками проекта на Node.js.
  2. Итоговый файл package.json должен иметь следующий вид:
{
    "name": "check",
    "version": "1.0.0",
    "main": "index.js",
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "description": "",
    "dependencies": {
        "@aws-sdk/client-s3": "^3.726.1"
    },
    "type": "module"
}

Создайте файл index.js, в котором будет размещаться код с использованием AWS SDK.

Примеры кода

Далее будут описаны способы выполнения базовых операций с бакетом с помощью AWS SDK для Node.js.

  1. В файл index.js вставьте следующий код:
import { readFileSync } from "node:fs"
import
{
    S3Client,
    PutObjectCommand,
    CreateBucketCommand,
    DeleteObjectCommand,
    DeleteBucketCommand,
    paginateListObjectsV2,
    GetObjectCommand,
    ListObjectsV2Command,
} from "@aws-sdk/client-s3";

(async function ()
{
    // Создание s3 клиента для взаимодействия с aws.
    // Данные для авторизации берутся из вашего окружения, но вы можете указать их явно. Например:
    // `new S3Client({ region: 'ru-central1', credentials: {...} })`
    const s3Client = new S3Client({});

    const bucketName = `test-bucket-${Date.now()}`;
    // Создать новый бакет
    console.log(`Creating the bucket ${bucketName}.`);
    await s3Client.send(
        new CreateBucketCommand({
            Bucket: bucketName,
        }),
    );
    console.log(`The bucket ${bucketName} was created.\n\n`);

    // Загрузить объекты в бакет
    // Из строки
    console.log('Creating a object from string.');
    await s3Client.send(
        new PutObjectCommand({
            Bucket: bucketName,
            Key: "bucket-text",
            Body: 'Hello bucket!',
        }),
    );
    console.log('The object from string was created.\n');
    // Из файлов
    console.log('Creating the first object from local file.');
    await s3Client.send(
        new PutObjectCommand({
            Bucket: bucketName,
            Key: "my-package.json",
            Body: readFileSync('package.json'),
        }),
    );
    console.log('The first object was created.\nCreating the second object from local file.');
    await s3Client.send(
        new PutObjectCommand({
            Bucket: bucketName,
            Key: "my-package-lock.json",
            Body: readFileSync('package-lock.json'),
        }),
    );
    console.log('The second object was created.\n');

    // Получить список объектов
    console.log('Getting bucket objects list.');
    const command = new ListObjectsV2Command({ Bucket: bucketName });
    const { Contents } = await s3Client.send(command);
    const contentsList = Contents.map((c) => ` • ${c.Key}`).join("\n");
    console.log("Here's a list of files in the bucket:");
    console.log(`${contentsList}\n`);

    // Удалить несколько объектов
    console.log('Deleting objects.');
    await s3Client.send(
        new DeleteObjectCommand({ Bucket: bucketName, Key: "my-package.json" }),
    );
    await s3Client.send(
        new DeleteObjectCommand({ Bucket: bucketName, Key: "my-package-lock.json" }),
    );
    console.log('The objects were deleted.\n');

    // Получить объект
    console.log('Getting your "bucket-text" object')
    const { Body } = await s3Client.send(
        new GetObjectCommand({
            Bucket: bucketName,
            Key: "bucket-text",
        }),
    );
    console.log('Your "bucket-text" content:')
    console.log(await Body.transformToString(), '\n');

    // Удаление объектов в бакетах и затем самого бакета
    // Получаем список объектов постранично
    const paginator = paginateListObjectsV2(
        { client: s3Client },
        { Bucket: bucketName },
    );
    for await (const page of paginator)
    {
        const objects = page.Contents;
        if (objects)
        {
            // Выполняем команду удаления для каждого объекта через итерацию страниц с объектами
            for (const object of objects)
            {
                // Отправляем команду на удаление
                await s3Client.send(
                    new DeleteObjectCommand({ Bucket: bucketName, Key: object.Key }),
                );
            }
        }
    }

    // Удаляем ранее созданный бакет
    await s3Client.send(new DeleteBucketCommand({ Bucket: bucketName }));
    console.log('Your bucket was emptied and deleted.');
})()

В этом фрагменте кода мы добавили IIFE - Immediately Invoked Function Expression. Это позволит вызвать скрипт при запуске файла.

Запустите приложение:

node index.js

В выводе консоли появится пошаговое описание результатов операции.

Report Page