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.

  1. Criando um Bucket no AWS S3
  2. Criando as permissões do IAM para seu bucket no AWS S3
  3. Preparando seu ambiente
  4. Acessando a API do S3 via command-line
  5. 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

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:

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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *