O @aws-sdk/client-s3 é a biblioteca oficial da AWS para trabalhar com o serviço S3 em JavaScript. Ela permite enviar e baixar arquivos, listar e excluir objetos, realizar uploads multipart e gerar URLs pré-assinadas.
Instale o pacote usando npm ou yarn:
npm install @aws-sdk/client-s3
Ou:
yarn add @aws-sdk/client-s3
Ao usar o @aws-sdk/client-s3, as credenciais de acesso podem ser configuradas de várias formas.
Ao usar a AWS CLI, um diretório .aws com arquivos de configuração é criado automaticamente no diretório home do usuário. Se necessário, você pode criar esse diretório e os arquivos manualmente, sem instalar a AWS CLI.
O arquivo ~/.aws/credentials deve conter o seguinte:
[default]
aws_access_key_id = <ACCESS_KEY>
aws_secret_access_key = <SECRET_KEY>
E o ~/.aws/config:
[default]
output = json
endpoint_url = https://s3.hmstorage.net
region = us-2
As credenciais também podem ser fornecidas por meio de variáveis de ambiente:
export AWS_ACCESS_KEY_ID=<ACCESS_KEY>
export AWS_SECRET_ACCESS_KEY=<SECRET_KEY>
Configuração completa do cliente com todos os parâmetros explicitamente especificados:
const { S3Client } = require("@aws-sdk/client-s3");
const s3 = new S3Client({
region: "us-2",
endpoint: "https://s3.hmstorage.net",
credentials: {
accessKeyId: "<ACCESS_KEY>",
secretAccessKey: "<SECRET_KEY>"
}
});
Se houver vários perfis da AWS CLI configurados, você pode selecionar o perfil necessário usando uma variável de ambiente:
export AWS_PROFILE=myprofile
Nesse caso, o cliente pode ser criado sem passar explicitamente as chaves de acesso:
const s3 = new S3Client({
region: "us-2",
endpoint: "https://s3.hmstorage.net"
});
O exemplo abaixo demonstra operações básicas com objetos usando o SDK. O script realiza as seguintes ações:
Antes de executar o script, crie um arquivo chamado example.txt no mesmo diretório do script.
Código de exemplo:
const {
S3Client,
ListObjectsV2Command,
PutObjectCommand,
GetObjectCommand,
DeleteObjectCommand
} = require("@aws-sdk/client-s3");
const { createReadStream, createWriteStream, existsSync } = require("fs");
const { pipeline } = require("stream");
const { promisify } = require("util");
const pipe = promisify(pipeline);
const bucketName = "bucket_name";
const region = "us-2";
const endpoint = "https://s3.hmstorage.net";
const localUploadPath = "example.txt";
const s3Key = "example.txt";
const localDownloadPath = "downloaded_example.txt";
// Criar cliente S3
const s3 = new S3Client({
region,
endpoint,
});
async function main() {
// 1. Enviar arquivo
if (existsSync(localUploadPath)) {
console.log(`Uploading ${localUploadPath} to the bucket...`);
await s3.send(new PutObjectCommand({
Bucket: bucketName,
Key: s3Key,
Body: createReadStream(localUploadPath),
}));
console.log("Upload completed.");
} else {
console.log(`File ${localUploadPath} not found. Skipping upload.`);
}
// 2. Listar objetos
console.log("\nBucket contents:");
const list = await s3.send(new ListObjectsV2Command({ Bucket: bucketName }));
(list.Contents || []).forEach((obj) => {
console.log(`- ${obj.Key}`);
});
// 3. Baixar arquivo
console.log(`\nDownloading ${s3Key} to ${localDownloadPath}...`);
const { Body } = await s3.send(new GetObjectCommand({
Bucket: bucketName,
Key: s3Key,
}));
if (Body) {
await pipe(Body, createWriteStream(localDownloadPath));
console.log("Download completed.");
}
// 4. Excluir arquivo
console.log(`\nDeleting ${s3Key} from the bucket...`);
await s3.send(new DeleteObjectCommand({ Bucket: bucketName, Key: s3Key }));
console.log("Deletion completed.");
}
main().catch((err) => {
console.error("Error while performing operations:", err);
});