Настройка подключения к S3 при помощи клиентов AWS CLI, S3cmd, Cyberduck, Rclone, Goofys, MinIO Client и SDK

Клиенты для S3 Storage

В этой статье мы рассмотрим, как подключиться к облачному объектному хранилищу S3, используя популярные клиенты и SDK.

Технические ограничения

  • Максимальное количество бакетов – 100, может быть увеличено по запросу в техническую поддержку
  • Максимальный размер имени бакета – 50 символов (a-z, 0-9, -)
  • Максимальное количество объектов в контейнере – не ограничено
  • Максимальный размер объекта – 50 ТБ
  • Максимальный размер имени объекта – 1024 символов UTF-8
  • Максимальный размер данных для загрузки за один запрос – 5 ГБ
  • Максимальное количество сегментов при сегментированной загрузке – 10000
  • Максимальное количество заголовков метаданных для объекта – 90
  • Максимальный размер имени заголовка – 128 символа UTF-8
  • Максимальное количество символов в значении заголовка – 1024 символов UTF-8
  • Объем хранилища – не ограничено
  • Максимальное количество HTTP-запросов к S3 API для аккаунта – 2000 запросов в секунду
  • Максимальное количество HTTP-запросов к бакету (GET, HEAD, OPTIONS) – 2000 запросов в секунду
  • Функции, направленные на взаимодействие с бакетами (например, их создание и удаление) доступны только из панели управления и не могут быть использованы в сторонних клиентах (aws create-bucket … в aws-cli, s3.create_bucket() в SDK и т.д.)

AWS CLI

AWS CLI — это интерфейс командной строки для работы с сервисами AWS. Общий порядок вызова команд смотрите в официальной документации Amazon.

Установка

Для установки AWS CLI воспользуйтесь инструкцией на сайте разработчика.

Настройка

Для настройки AWS CLI в терминале введите команду aws configure. Команда запросит значения для следующих параметров:

  • AWS Access Key IDAccess Key созданного вами бакета, доступен в панели управления при выборе бакета.
  • AWS Secret Access KeySecret Key созданного вами бакета, доступен в панели управления при выборе бакета.
  • Значения остальных параметров оставьте без изменений.

Конфигурационные файлы

В результате работы команда aws configure сохранит ключи доступа.

Формат ключей доступа в .aws/credentials:

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

Вы можете создать несколько профилей для разных сервисных аккаунтов, указав их данные в файле .aws/credentials:

[default]
aws_access_key_id = <идентификатор_статического_ключа_1>
aws_secret_access_key = <содержимое_статического_ключа_1>
[<имя_профиля_2>]
aws_access_key_id = <идентификатор_статического_ключа_2>
aws_secret_access_key = <содержимое_статического_ключа_2>
...
[<имя_профиля_n>]
aws_access_key_id = <идентификатор_статического_ключа_n>
aws_secret_access_key = <содержимое_статического_ключа_n>

Где default — профиль по умолчанию.

Чтобы при использовании S3 переключаться между разными профилями в командах AWS CLI, используется опция --profile, например:

aws --endpoint-url=https://s3.ru1.storage.beget.cloud --profile <имя_профиля_2> s3 ls s3://<имя_бакета>

Чтобы при работе постоянно не указывать параметр --endpoint-url=https://s3.ru1.storage.beget.cloud, вы можете добавить в файл aws/config строку endpoint_url = https://s3.ru1.storage.beget.cloud

s3cmd

S3cmd — это консольный клиент (Linux, Mac) для сервисов, поддерживающих HTTP API Amazon S3.

Установка

Чтобы установить S3cmd, ознакомьтесь с разделом установки в репозитории S3cmd на GitHub.

Настройка

Для настройки S3cmd используйте команду s3cmd --configure. При запросе укажите значения для следующих параметров:

  • Access KeyAccess Key созданного вами бакета, доступен в панели управления при выборе бакета.
  • Secret KeySecret Key созданного вами бакета, доступен в панели управления при выборе бакета.
  • Default Region — введите ru1.
  • S3 Endpoint — введите s3.ru1.storage.beget.cloud
  • DNS-style bucket+hostname:port template for accessing a bucket — введите %(bucket).s3.ru1.storage.beget.cloud.
  • Значения остальных параметров оставьте без изменений.

Программа попытается установить соединение с Object Storage и получить список бакетов. В случае успеха это ПО для S3 выведет Success. Your access key and secret key worked fine :-).

Команда s3cmd --configure сохранит настройки в файле ~/.s3cfg в формате:

[default]
access_key = id
secret_key = secretKey
bucket_location = ru1
host_base = s3.ru1.storage.beget.cloud
host_bucket = %(bucket).s3.ru1.storage.beget.cloud

При необходимости эти настройки можно изменить напрямую в файле. Также можно указать настройки при запуске программы с помощью соответствующих параметров.

Cyberduck

CyberDuck — это графический клиент для работы с облачными хранилищами, в том числе совместимыми с Amazon S3 API. CyberDuck доступен для macOS и Windows, а также в виде консольного клиента для Linux.

Установка

Скачайте дистрибутив CyberDuck для вашей операционной системы и запустите его.

Подключение

  1. Запустите CyberDuck.
  2. Нажмите кнопку Новое подключение.
  3. Выберите тип подключения — Amazon S3.
  4. Укажите параметры подключения:
    1. Servers3.ru1.storage.beget.cloud, протокол (http/https) при этом указывать не нужно
    2. Port443.
    3. Access Key IDAccess Key созданного вами бакета, доступен в панели управления при выборе бакета.
    4. Secret Access Key — Secret Key созданного вами бакета, доступен в панели управления при выборе бакета.
Настройка подключения Amazon s3
  1. Нажмите кнопку “Подключиться

После подключения откроется бакет, созданный ранее.

S3 amazon бакет

Rclone

Rclone – это кроссплатформенная консольная программа для управления файлами в облачном хранилище.

Установка

Загрузите Rclone для вашей операционной системы с официальной страницы загрузки.

Настройка

Чтобы настроить Rclone, выполните следующую команду:

$ rclone config

В открывшемся диалоге нажмите n и затем Enter, чтобы подключить удаленное хранилище:

$ rclone config 
No remotes found, make a new one? 
n) New remote 
s) Set configuration password 
q) Quit config

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

Enter name for new remote. 
name> Beget

Далее необходимо выбрать тип хранилища:

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.

Выберите тип хранилища Amazon S3 Compliant Storage Providers including AWS, в списке под номером 4:

Storage> 4

На следующем шаге необходимо выбрать провайдера S3:

Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.

Выберите провайдера S3 – Any other S3 compatible provider в списке под номером 34:

provider> 34

На следующем шаге необходимо выбрать то, как будут указаны данные для подключения:

Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).

Выберите первый пункт, чтобы ввести данные для доступа к хранилищу вручную:

1 / Enter AWS credentials in the next step. 
\ (false) 
2 / Get AWS credentials from the environment (env vars or IAM). 
\ (true)
env_auth> 1

Далее необходимо ввести реквизиты для подключения к хранилищу:

  • access_key_id> Access Key созданного вами бакета, доступен в панели управления при выборе бакета.
  • secret_access_key>Secret Key созданного вами бакета, доступен в панели управления при выборе бакета.
  • region> – введите ru1.
  • endpoint> – введите https://s3.ru1.storage.beget.cloud.
  • location_constraint> – оставьте пустым.
  • acl> – выберите первый пункт.

Настройка расширенной конфигурации не потребуются, выберите n:

Edit advanced config? 
y) Yes 
n) No (default) 
y/n>n

Проверьте корректность указанных данных и нажмите y, если данные верны:

Configuration complete. 
Options: 
- type: s3 
- provider: Other 
- access_key_id: ACCESS_KEY 
- secret_access_key: SECRET_KEY 
- endpoint: https://s3.ru1.storage.beget.cloud 
- acl: private 
Keep this "other-storage" remote? 
y) Yes this is OK (default) 
e) Edit this remote 
d) Delete this remote

Хранилище добавлено в Rclone. Выйдите из конфигурации, нажав q, и проверьте подключение, выполнив следующую команду:

$ rclone lsd Beget:

Если подключение успешно, отобразится список бакетов на аккаунте:

$ rclone lsd  Beget: 
-1 2024-11-27 16:20:08        -1 dse938ab5602-timid-natalia

Goofys

goofys — программа для Linux и macOS, позволяющая монтировать бакет Объектного хранилища через FUSE.

Установка

Загрузите goofys для вашей операционной системы с официального репозитория проекта.

Настройка

Обратите внимание!
Для того чтобы подключение происходило корректно, необходимо настроить авторизацию. Процесс описан в начале раздела SDK.

Для монтирования бакета выполните следующую команду:

goofys --endpoint=https://s3.ru1.storage.beget.cloud <имя-бакета> /mnt/s3

Укажите имя вашего бакета в соответствующем параметре. Вместо /mnt/s3 укажите необходимую точку монтирования в системе.

Для монтирования бакета при запуске системы добавьте следующую строку в файл /etc/fstab, указав необходимый бакет и точку монтирования:

goofys#<имя-бакета>   /mnt/s3        fuse     _netdev,allow_other,--file-mode=0666,--dir-mode=0777,--endpoint=https://s3.ru1.storage.beget.cloud    0       0

Обновите системные демоны:

sudo systemctl daemon-reload

Выполните монтирование:

sudo mount -a

Проверьте, что хранилище примонтировано в необходимую директорию:

$ mount | grep '/mnt/s3' 
dce938ab5611-timid-natalia on /mnt/s3 type fuse (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)

MinIO Client

MinIO Client - консольный клиент, разработанный создателями MinIO-сервера

Установка

Загрузите Minio Client для вашей операционной системы с официальной страницы загрузки.

Настройка

Добавьте алиас для хранилища, выполнив следующую команду:

mc  alias set <имя-алиаса> https://s3.ru1.storage.beget.cloud  ACCESS_KEY SECRET_KEY

Подставьте в команду следующие данные:

  • <имя-алиаса> – желаемое имя хранилища в Minio.
  • ACCESS_KEY Access Key созданного вами бакета, доступен в панели управления при выборе бакета.
  • ACCESS_KEYSecret Key созданного вами бакета, доступен в панели управления при выборе бакета.

Чтобы проверить подключение, используйте команду:

mc ls <имя-алиаса>

Если подключение успешно, будет отображен список бакетов на аккаунте:

$ mc ls <имя-алиаса> 
[2024-11-27 16:20:08 UTC]     0B dse938ab5602-timid-natalia/

SDK

В качестве SDK в данном разделе будет использоваться AWS SDK. Для авторизации используется файл credentials в директории ~/.aws. Директорию и файл в ней необходимо создавать для пользователя, от имени которого будет запускаться код. Для создания директории и файла с помощью терминала выполните на требуемой машине следующие команды:

mkdir -p ~/.aws
touch ~/.aws/credentials

После чего откройте файл удобным вам текстовым редактором, например, vim:

vim ~/.aws/credentials

И укажите в нем следующие данные, чтобы задать данные авторизации для бакета по умолчанию:

[default]
aws_access_key_id = <access_key_указанный_на_странице_бакета>
aws_secret_access_key = <secret_key_указанный_на_странице_бакета>

После чего сохраните и закройте файл. Затем создайте файл config:

touch ~/.aws/config

Откройте его в текстовом редакторе и укажите в нем регион и url эндпоинта:

[default]
endpoint_url = s3.ru1.storage.beget.cloud
region = ru1
Обратите внимание!
Инструкции и примеры кода ниже предполагают, что соответствующие средства разработки/запуска уже установлены. Если на вашей машине они отсутствуют, потребуется установить их в соответствии с инструкциями в официальных источниках.

JavaScript (AWS SDK v3)

Обратите внимание!
Для того, чтобы подключение происходило корректно, необходимо настроить авторизацию. Процесс описан в начале раздела SDK.

Для использования AWS SDK с Node.js:

Создайте директорию проекта либо перейдите в директорию уже существующего. Для создания директории используйте команду mkdir <название_директории> :

mkdir nodeawstest

Перейдите в созданную директорию:

cd nodeawstest

Для создания стандартного package.json выполните команду:

npm init -y

Затем установите клиент для S3:

npm i @aws-sdk/client-s3 

Откройте файл package.json удобным вам текстовым редактором и добавьте строку "type": "module" для использования современного синтаксиса ESM. Итоговый файл будет иметь следующий вид:

{
  "name": "nodeawstest",
  "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.651.1"
  }
  "type": "module"
}

Для проверки работы SDK создайте файл index.js со следующим содержимым, скорректировав имя бакета на указанное на его странице в разделе “Облако”:

// This is used for getting user input.
import { createInterface } from "readline/promises";

import {
  S3Client,
  PutObjectCommand,
  DeleteObjectCommand,
  paginateListObjectsV2,
  ListObjectsV2Command,
  GetObjectCommand,
} from "@aws-sdk/client-s3";

export async function main() {
  // A region and credentials can be declared explicitly. For example
  // `new S3Client({ region: 'us-east-1', credentials: {...} })` would
  //initialize the client with those settings. However, the SDK will
  // use your local configuration and credentials if those properties
  // are not defined here.
  const s3Client = new S3Client({});

  const bucketName = `f6bcd57c2800-whywouldyoudothat`;

  // Put an object into an Amazon S3 bucket.
  await s3Client.send(
	new PutObjectCommand({
  	Bucket: bucketName,
  	Key: "my-first-object.txt",
  	Body: "Hello JavaScript SDK!",
	})
  );

  // Read the object.
  const { Body } = await s3Client.send(
	new GetObjectCommand({
  	Bucket: bucketName,
  	Key: "my-first-object.txt",
	})
  );

  console.log(await Body.transformToString());

  // Confirm file listing
  const prompt = createInterface({
	input: process.stdin,
	output: process.stdout,
  });

  const result = await prompt.question(`Would you like to see the contents of the bucket ${bucketName}?(y/n) `);
  prompt.close();

  if (result === "y") {
	const command =
        	new ListObjectsV2Command({
          	Bucket: bucketName,
          	MaxKeys: 1,
        	});
	try {
  	let isTruncated = true;

  	console.log("Your bucket contains the following objects:\n");
  	let contents = "";

  	while (isTruncated) {
    	const { Contents, IsTruncated, NextContinuationToken } =
      	await s3Client.send(command);
    	const contentsList = Contents.map((c) => ` • ${c.Key}`).join("\n");
    	contents += contentsList + "\n";
    	isTruncated = IsTruncated;
    	command.input.ContinuationToken = NextContinuationToken;
  	}
  	console.log(contents);
	} catch (err) {
  	console.error(err);
	}
  }
}

// Call a function if this file was run directly. This allows the file
// to be runnable without running on import.
import { fileURLToPath } from "url";
if (process.argv[1] === fileURLToPath(import.meta.url)) {
  main();
}

Для проверки работы скрипта выполните команду:

node index.js

Пример вывода:

node index.js
Hello JavaScript SDK!
Would you like to see the contents of the bucket f6bcd57c2800-whywouldyoudothat?(y/n) y
Your bucket contains the following objects:

 • Program.cs
 • Roboto-Regular.woff2
 • UltiMaker-Cura-5.7.2-linux-X64.AppImage
 • blep
 • blep/bprof1.png
 • bprof.png
 • cyberpanel.png
 • example.php
 • index.js
 • ispconfig.png
 • my-first-object.txt
 • object_name
 • py_script.py
 • s3example.go
 • script/py_script.py
 • style.css
 • webmin.png

Другие примеры кода вы можете найти в репозитории AWS, описание методов – в официальной документации.

Python (boto3)

Обратите внимание!
Для того, чтобы подключение происходило корректно, необходимо настроить авторизацию. Процесс описан в начале раздела SDK.

Создайте директорию проекта либо перейдите в директорию уже существующего. Для создания директории используйте команду mkdir <название_директории> :

mkdir pyboto3

Перейдите в созданную директорию:

cd pyboto3

Для установки boto3 создайте виртуальное окружение или активируйте виртуальное окружение вашего проекта:

$ python3 -m venv .venv
...
$ source .venv/bin/activate

После чего установите boto3:

python -m pip install boto3

Создайте скрипт main.py со следующим содержимым, заменив название бакета на указанное на странице бакета в разделе “Облако”:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import boto3
session = boto3.session.Session()
s3 = session.client(
	service_name='s3',
)
bucket_name = 'название_бакета'

# Загрузить объекты в бакет

## Из строки
s3.put_object(Bucket=bucket_name, Key='object_name', Body='TEST')

## Из файла
s3.upload_file('main.py', bucket_name, 'py_script.py')
s3.upload_file('main.py', bucket_name, 'script/py_script.py')

# Получить список объектов в бакете
for key in s3.list_objects(Bucket=bucket_name)['Contents']:
	print(key['Key'])

# Удалить несколько объектов
# forDeletion = [{'Key':'object_name'}, {'Key':'script/py_script.py'}]
# response = s3.delete_objects(Bucket='bucket-name', Delete={'Objects': forDeletion})

# Получить объект
get_object_response = s3.get_object(Bucket=bucket_name,Key='py_script.py')
print(get_object_response['Body'].read())

Для проверки выполните скрипт:

python main.py

Пример вывода:

python main.py
UltiMaker-Cura-5.7.2-linux-X64.AppImage
blep
blep/bprof1.png
bprof.png
cyberpanel.png
ispconfig.png
my-first-object.txt
object_name
py_script.py
script/py_script.py
webmin.png
b"#!/usr/bin/env python\n#-*- coding: utf-8 -*-\nimport boto3\nsession = boto3.session.Session()\ns3 = session.client(\n\tservice_name='s3',\n)\nbucket_name = 'f6bcd57c2800-whywouldyoudothat'
\n\n# \xd0\x97\xd0\xb0\xd0\xb3\xd1\x80\xd1\x83\xd0\xb7\xd0\xb8\xd1\x82\xd1\x8c \xd0\xbe\xd0\xb1\xd1\x8a\xd0\xb5\xd0\xba\xd1\x82\xd1\x8b \xd0\xb2 \xd0\xb1\xd0\xb0\xd0\xba\xd0\xb5\xd1\x82\n\n##
 \xd0\x98\xd0\xb7 \xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb8\ns3.put_object(Bucket=bucket_name, Key='object_name', Body='TEST')\n\n## \xd0\x98\xd0\xb7 \xd1\x84\xd0\xb0\xd0\xb9\xd0\xbb\x
d0\xb0\ns3.upload_file('main.py', bucket_name, 'py_script.py')\ns3.upload_file('main.py', bucket_name, 'script/py_script.py')\n\n# \xd0\x9f\xd0\xbe\xd0\xbb\xd1\x83\xd1\x87\xd0\xb8\xd1\x82\xd1
\x8c \xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xbe\xd0\xba \xd0\xbe\xd0\xb1\xd1\x8a\xd0\xb5\xd0\xba\xd1\x82\xd0\xbe\xd0\xb2 \xd0\xb2 \xd0\xb1\xd0\xb0\xd0\xba\xd0\xb5\xd1\x82\xd0\xb5\nfor key in s3
.list_objects(Bucket=bucket_name)['Contents']:\n\tprint(key['Key'])\n\n# \xd0\xa3\xd0\xb4\xd0\xb0\xd0\xbb\xd0\xb8\xd1\x82\xd1\x8c \xd0\xbd\xd0\xb5\xd1\x81\xd0\xba\xd0\xbe\xd0\xbb\xd1\x8c\xd0\
xba\xd0\xbe \xd0\xbe\xd0\xb1\xd1\x8a\xd0\xb5\xd0\xba\xd1\x82\xd0\xbe\xd0\xb2\n# forDeletion = [{'Key':'object_name'}, {'Key':'script/py_script.py'}]\n# response = s3.delete_objects(Bucket='bu
cket-name', Delete={'Objects': forDeletion})\n\n# \xd0\x9f\xd0\xbe\xd0\xbb\xd1\x83\xd1\x87\xd0\xb8\xd1\x82\xd1\x8c \xd0\xbe\xd0\xb1\xd1\x8a\xd0\xb5\xd0\xba\xd1\x82\nget_object_response = s3.g
et_object(Bucket=bucket_name,Key='py_script.py')\nprint(get_object_response['Body'].read())\n"

Другие примеры кода вы можете найти в репозитории, описание методов – в официальной документации.

.NET

Обратите внимание!
Для того, чтобы подключение происходило корректно, необходимо настроить авторизацию. Процесс описан в начале раздела SDK.

Создайте директорию проекта либо перейдите в директорию уже существующего. Для создания тестового проекта воспользуемся CLI-утилитой dotnet, создав новый консольный проект.

dotnet new console --name dotnets3

Перейдите в созданную директорию:

cd dotnets3

Для установки AWS SDK будет использоваться NuGet. Установите SDK командой:

dotnet add package AWSSDK.S3

После чего отредактируйте Program.cs, вставив указанный ниже код и заменив название бакета на указанное на странице бакета в разделе “Облако”.

using Amazon.S3;
using Amazon.S3.Model;

const string bucketName = "название_бакета";

IAmazonS3 s3Client = new AmazonS3Client();

string fileName = "Program.cs";
var keyName = Path.GetFileName(fileName);

Console.WriteLine($"Uploading {keyName} to {bucketName}...");

await s3Client.UploadObjectFromFilePathAsync(bucketName, fileName, keyName, null);

Console.WriteLine($"Listing the objects contained in {bucketName}:");
await ListingObjectsAsync(s3Client, bucketName);

async Task ListingObjectsAsync(IAmazonS3 client, string bucketName)
{
	var listObjectsV2Paginator = client.Paginators.ListObjectsV2(new ListObjectsV2Request
	{
    	BucketName = bucketName,
	});

	await foreach (var response in listObjectsV2Paginator.Responses)
	{
    	Console.WriteLine($"HttpStatusCode: {response.HttpStatusCode}");
    	Console.WriteLine($"Number of Keys: {response.KeyCount}");
    	foreach (var entry in response.S3Objects)
    	{
        	Console.WriteLine($"Key = {entry.Key} Size = {entry.Size}");
    	}
	}
}

Для сборки и запуска программы выполните команду:

dotnet run

Пример вывода:

dotnet run
Uploading Program.cs to f6bcd57c2800-whywouldyoudothat...
Listing the objects contained in f6bcd57c2800-whywouldyoudothat:
HttpStatusCode: OK
Number of Keys: 14
Key = Program.cs Size = 1065
Key = UltiMaker-Cura-5.7.2-linux-X64.AppImage Size = 313369792
Key = blep Size = 0
Key = blep/bprof1.png Size = 410
Key = bprof.png Size = 410
Key = cyberpanel.png Size = 550288
Key = example.php Size = 839
Key = ispconfig.png Size = 236477
Key = my-first-object.txt Size = 21
Key = object_name Size = 4
Key = py_script.py Size = 964
Key = s3example.go Size = 1102
Key = script/py_script.py Size = 964
Key = webmin.png Size = 524468

Другие примеры кода и описание методов вы можете найти в официальной документации.

PHP

Обратите внимание!
Для того, чтобы подключение происходило корректно, необходимо настроить авторизацию. Процесс описан в начале раздела SDK.

Создайте директорию проекта либо перейдите в директорию уже существующего. Для создания директории используйте команду mkdir <название_директории> :

mkdir phps3

Перейдите в созданную директорию:

cd phps3

Для установки AWS SDK будет использоваться Composer. Установите SDK командой:

composer require aws/aws-sdk-php

После чего создайте файл example.php со следующим содержимым, заменив имя бакета на указанное на его странице в разделе “Облако”:

<?php

require 'vendor/autoload.php';

use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;

$bucket = 'название_бакета';


try {
  $s3Client = new S3Client([
	'profile' => 'default'
  ]);

  echo 'Trying to upload example.php...  ';
  $upload_result = $s3Client->putObject([
	'Bucket' => $bucket,
	'Key' => basename(__FILE__),
	'SourceFile' => __FILE__
  ]);

  if ($upload_result->get("@metadata")['statusCode'] == 200) {
	echo 'Success!' . PHP_EOL;
  } else {
	echo 'Something went wrong' . PHP_EOL;
  }

$results = $s3Client->getPaginator('ListObjects', [
    	'Bucket' => $bucket
	]);

	foreach ($results as $result) {
    	foreach ($result['Contents'] as $object) {
        	echo $object['Key'] . PHP_EOL;
    	}
	}
} catch (S3Exception $e) {
  echo $e->getMessage() . "\n";
}

Для запуска выполните команду:

php example.php

Пример вывода:

php example.php
Trying to upload example.php...  Success!
UltiMaker-Cura-5.7.2-linux-X64.AppImage
blep
blep/bprof1.png
bprof.png
cyberpanel.png
example.php
ispconfig.png
my-first-object.txt
object_name
py_script.py
s3example.go
script/py_script.py
webmin.png

Другие примеры кода вы можете найти в репозитории AWS, описание методов – в официальной документации.

Go

Обратите внимание!
Для того, чтобы подключение происходило корректно, необходимо настроить авторизацию. Процесс описан в начале раздела SDK.

Создайте директорию проекта либо перейдите в директорию уже существующего. Для создания директории используйте команду mkdir <название_директории> :

mkdir gos3

Перейдите в созданную директорию:

cd gos3

Инициализируйте модуль:

go mod init example

Установите AWS SDK:

go get github.com/aws/aws-sdk-go-v2
go get github.com/aws/aws-sdk-go-v2/config
go get github.com/aws/aws-sdk-go-v2/service/s3

После чего создайте файл example.go со следующим содержимым, заменив имя бакета на указанное на его странице в разделе “Облако”:

package main

import (
	"context"
	"log"
	"os"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
	bucket := "название_бакета"
	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
    	log.Fatal(err)
	}

	client := s3.NewFromConfig(cfg)

	// upload the source file to the bucket
	file, err := os.Open("example.go")
	if err != nil {
    	log.Fatal(err)
	} else {
    	defer file.Close()
    	_, err = client.PutObject(context.TODO(), &s3.PutObjectInput{
        	Bucket: aws.String(bucket),
        	Key:	aws.String(file.Name()),
        	Body:   file,
    	})
    	if err != nil {
        	log.Fatal(err)
    	} else {
        	log.Printf("File %s uploaded to %s", file.Name(), bucket)
    	}
	}

	// Listing the first page of objects in the bucket
	output, err := client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
    	Bucket: aws.String(bucket),
	})
	if err != nil {
    	log.Fatal(err)
	}

	log.Println("first page of file listing results:")
	for _, object := range output.Contents {
    	log.Printf("key=%s size=%d", aws.ToString(object.Key), object.Size)
	}
}

Данная программа в случае успеха загрузит исходный код в бакет и отобразит первую страницу списка файлов в бакете. Для сборки и запуска кода выполните команду:

go run .

Пример вывода:

go run .
2024/09/19 11:00:22 File example.go uploaded to f6bcd57c2800-whywouldyoudothat
2024/09/19 11:00:22 first page of file listing results:
2024/09/19 11:00:22 key=UltiMaker-Cura-5.7.2-linux-X64.AppImage size=824636440816
2024/09/19 11:00:22 key=blep size=824636441000
2024/09/19 11:00:22 key=blep/bprof1.png size=824636441208
2024/09/19 11:00:22 key=bprof.png size=824636441512
2024/09/19 11:00:22 key=cyberpanel.png size=824636441720
2024/09/19 11:00:22 key=ispconfig.png size=824636441928
2024/09/19 11:00:22 key=my-first-object.txt size=824636442104
2024/09/19 11:00:22 key=object_name size=824636442312
2024/09/19 11:00:22 key=py_script.py size=824636442520
2024/09/19 11:00:22 key=example.go size=824636442728
2024/09/19 11:00:22 key=script/py_script.py size=824636442904
2024/09/19 11:00:22 key=webmin.png size=824636443144

Другие примеры кода вы можете найти в репозитории AWS, описание методов – в официальной документации.

Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить эту статью или наши продукты с коллегами по цеху и сотрудниками Бегета – ждем вас в нашем сообществе в Telegram.

10
1985