Este tutorial é parte integrante do vídeo Tutorial S3 Básico publicado no canal Um Inventor Qualquer no YouTube.
Neste tutorial vamos entender as características básicas do Simple Storage Serve (S3), configurar um bucket e executar algumas ações como upload, download e permissões de objetos.
Você também pode encontrar esse tutorial e os códigos usados aqui no nosso repositório do GitHub:
https://github.com/UmInventorQualquer/tutorial-s3-basico
Este tutorial está dividido em etapas que devem ser executadas na sequência disposta abaixo. Caso algo não funcione como esperado, volte, e refaça as etapas anteriores.
- Criando um Bucket no AWS S3
- Criando as permissões do IAM para seu bucket no AWS S3
- Preparando seu ambiente
- Acessando a API do S3 via command-line
- Acessando a API da AWS através do AWS-SDK com Node JS
Claro que além da facilidade e automatizar processos através do AWS-CLI nos seus scripts shell, a principal vantagem de consumir uma infra-estrutura as a service (IaaS) é você poder integrá-la à sua aplicação. E fazer isso é mais fácil do que você imagina.
Neste tutorial vou mostrar como configurar e consumir a API do AWS S3 utilizando o AWS-SDK com o Node JS.
Requisitos
- https://nodejs.org/
- Alternativamente você pode rodar um container docker do Node JS: https://hub.docker.com/_/node
Instalação
Na pasta do seu projeto, onde encontra-se o arquivo package.json
execute o comando de instalação do paco do S3:
NPM:
npm install @aws-sdk/client-s3
YARN:
yarn add @aws-sdk/client-s3
PNPM:
pnpm add @aws-sdk/client-s3
Configuração
Se você já instalou o AWS-CLI e fez as configurações das suas credenciais no sistema operacional onde o sistema vai rodar, ou fez isso no seu docker, a configuração do seu script será muito mais simples.
Basta importar a lib do "@aws-sdk/client-s3
e criar uma constante de configuração contendo a região onde seus buckets estão.
import { S3Client } from "@aws-sdk/client-s3";
const config = {
region: 'us-east-1'
};
const client = new S3Client(config);
Através do objeto client
será possível interagir com todos os seus buckets da região us-east-1
.
Caso você esteja rodando este script fora da infra-estrutura da AWS, ou em uma máquina onde você não tem permissão para alterar/criar o arquivo ~/.aws/credentials
, ainda há a possibilidade de passar as credenciais diretamente pelo código, mas…
ATENÇÃO aos critérios de segurança, armazenar credenciais de acesso dentro do código pode causar:
- Vazamento de dados por invasão de contas de GitHub/BitBucket/etc; 💩
- Vazamento de dados por invasão de máquinas de desenvolvedores; 💩
- Vazamento de dados por desenvolvedores mau intencionados, inconsequentes ou inexperientes; 💩
- Adulteração e/ou perda de dados de produção por erro humano; 🔥
Credenciais de acesso a recursos de produção devem ficar isoladas nos ambientes de produção, de preferência através das variáveis de ambiente das máquinas ou através de serviços de configuração distribuídos. Fora do ambiente de produção estas credenciais devem estar protegidas com criptografia e disponíveis ao menos número de pessoas possível, para maior controle de danos.
Para inserir as credenciais diretamente através do código use a seguinte sintaxe:
import { S3Client } from "@aws-sdk/client-s3";
const config = {
region: 'us-east-1',
credentials: {
accessKeyId: '<YOUR_ACCESS_KEY_ID>',
secretAccessKey: '<YOUR_SECRET_ACCESS_KEY>'
}
};
const client = new S3Client(config);
Mas se você está pensando em fazer isso porque precisa utilizar várias credenciais diferentes na mesma aplicação, você pode utilizar os profiles
do arquivo de configurações do AWS-CLI.
Veja um exemplo do ~/.aws/credentials
com várias credenciais:
[default]
aws_access_key_id = <YOUR_ACCESS_KEY_ID>
aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>
[meuperfilum]
aws_access_key_id = <YOUR_ACCESS_KEY_ID>
aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>
[meuperfildois]
aws_access_key_id = <YOUR_ACCESS_KEY_ID>
aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>
O primeiro perfil [default]
será utilizado mesmo que você não especifique nenhum perfil na carga das configurações, os outros devem ser chamados da seguinte forma no seu código:
import { S3Client } from "@aws-sdk/client-s3";
const config = {
region: 'us-east-1',
credentials: fromIni({profile: 'meuperfilum'})
};
const client = new S3Client(config);
Desta forma você pode instanciar quantos S3Client’s precisar com credenciais diferentes dentro de uma única aplicação.
Preparando seu ambiente
Siga as instruções do tutorial Criando Permissões do S3 no IAM e insira as credenciais geradas no seu arquivo ~/.aws/credentials
da seguinte forma:
[tutorials3]
aws_access_key_id = <YOUR_ACCESS_KEY_ID>
aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>
Agora você pode entrar na pasta scripts cd scripts
para executar os scripts de teste.
Instalação de dependências
Antes de mais nada é necessário instalar as dependências dos scripts em Node JS.
npm i
Upload
node upload.js
Você deve ver algo similar a isto no seu terminal:
response: {
'$metadata': {
httpStatusCode: 200,
requestId: undefined,
extendedRequestId: '55aoeeJXOFB4S8W53E4+q4ictivVfk1s9IUPxD8DtcGIswODglIw2wLYcHULv927C26U/LUd480=',
cfId: undefined,
attempts: 1,
totalRetryDelay: 0
},
BucketKeyEnabled: undefined,
ETag: '"535a8b268d78765c6ebc47eed8835e01"',
Expiration: undefined,
RequestCharged: undefined,
SSECustomerAlgorithm: undefined,
SSECustomerKeyMD5: undefined,
SSEKMSEncryptionContext: undefined,
SSEKMSKeyId: undefined,
ServerSideEncryption: undefined,
VersionId: undefined
}
Download
node download.js
O resultado será o arquivo photo.jpg
gravado na pasta downloads
.
Delete
node delete.js
O resultado exibido no terminal será o seguinte:
response: {
'$metadata': {
httpStatusCode: 204,
requestId: undefined,
extendedRequestId: 'seCJRBPT0z0Cp/KxCMeNMijoB4qpP48GZAMLelXKBrqa6wgPyowefKMValTzeLgPXmMONUbV7TE=',
cfId: undefined,
attempts: 1,
totalRetryDelay: 0
},
DeleteMarker: undefined,
RequestCharged: undefined,
VersionId: undefined
}
E o arquivo photo.jpg
removido do seu bucket.
Hora de morphar
Agora que você viu o quanto é fácil interagir com a API da AWS é hora de começar a implantar o AWS-SDK à sua aplicação.
Boa sorte!
Documentação oficial do AWS-SDK
Versão padrão: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/index.html
Utilizando o client S3 diretamente: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/s3.html