AWS SDK для JavaScript
KODAWS 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. (или другой в зависимости от выбранного вами сервиса)
Подготовка директории проекта
- Установите Node.js.
- Создайте директорию, в которой будет находиться пример кода и перейдите в нее:
mkdir app cd app
- Инициализируйте проект Node.js и установите библиотеку
aws-sdk/client-s3командой:
npm init -y && npm i @aws-sdk/client-s3
- Чтобы указать, что в проекте будет использоваться синтаксис ESM (ECMAScript Moudules), добавьте в файл package.json строку
"type": "module". В директории будет создан файлpackage.jsonс базовыми настройками проекта на Node.js. - Итоговый файл
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.
- В файл
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
В выводе консоли появится пошаговое описание результатов операции.