Skip to content

Instantly share code, notes, and snippets.

@luismendes070
Created January 31, 2025 12:46
Show Gist options
  • Save luismendes070/132bf5e1159d34212deadbc802b57216 to your computer and use it in GitHub Desktop.
Save luismendes070/132bf5e1159d34212deadbc802b57216 to your computer and use it in GitHub Desktop.
ChatGPT patch-s3-aws-free-tier
npm install @aws-sdk/client-s3
@luismendes070
Copy link
Author

`import { S3Client, GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3";
import { Readable } from "stream";

const s3 = new S3Client({ region: "us-east-1" });

const bucketName = "meu-bucket";
const objectKey = "dados.json";

async function streamToString(stream: Readable): Promise {
return new Promise((resolve, reject) => {
const chunks: Uint8Array[] = [];
stream.on("data", (chunk) => chunks.push(chunk));
stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
stream.on("error", reject);
});
}

async function patchS3Object() {
try {
// 1️⃣ Baixar o JSON do S3
const getCommand = new GetObjectCommand({ Bucket: bucketName, Key: objectKey });
const { Body } = await s3.send(getCommand);

if (!Body) throw new Error("Objeto não encontrado!");

const jsonString = await streamToString(Body as Readable);
let data = JSON.parse(jsonString);

// 2️⃣ Modificar localmente
data.updatedAt = new Date().toISOString();
data.counter = (data.counter || 0) + 1;

console.log("Novo JSON:", data);

// 3️⃣ Enviar o objeto atualizado
const putCommand = new PutObjectCommand({
  Bucket: bucketName,
  Key: objectKey,
  Body: JSON.stringify(data, null, 2),
  ContentType: "application/json"
});

await s3.send(putCommand);
console.log("Arquivo atualizado com sucesso!");

} catch (error) {
console.error("Erro ao modificar o objeto:", error);
}
}

patchS3Object();
`

@luismendes070
Copy link
Author

luismendes070 commented Jan 31, 2025

@luismendes070
Copy link
Author

O AWS Free Tier oferece um nível gratuito para o Amazon S3, mas com algumas limitações. Atualmente, o plano gratuito inclui:

5 GB de armazenamento na classe S3 Standard
20.000 solicitações GET
2.000 solicitações PUT, COPY, POST ou LIST
15 GB de transferência de saída gratuita para a internet por mês (somando todos os serviços da AWS)

Esse benefício é válido por 12 meses após a criação da conta. Depois disso, as cobranças seguem a tabela de preços padrão do S3.

Se precisar testar localmente sem custo, você pode usar o LocalStack, que simula os serviços da AWS, incluindo o S3. Isso pode ser útil se você estiver desenvolvendo com Java/Kotlin e Spring Boot. 🚀

@luismendes070
Copy link
Author

No AWS Free Tier, as solicitações PATCH não estão explicitamente listadas nas métricas gratuitas do S3, porque o S3 não suporta PATCH diretamente.

No S3, para modificar um objeto, você geralmente precisa:

  1. Baixar (GET) o objeto, modificar localmente e reenvia-lo com um PUT.
  2. Usar Multipart Upload para alterar partes do objeto sem precisar reescrevê-lo inteiro.

Se você estiver lidando com APIs e precisar de PATCH, talvez esteja pensando em algo como o Amazon API Gateway + Lambda + S3, onde o API Gateway pode processar solicitações PATCH antes de atualizar um objeto no S3.

Se estiver testando algo específico, me conta mais detalhes para ver a melhor alternativa! 🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment