Ruby

27 de Fevereiro de 2024 - @Walmir Neto


Ontem mostrei Fazendo upload com ActiveStorage, mas na maioria dos casos não adianta muito fazer upload localmente, pois caso precise reconfigurar o servidor, seja porque motivo for, existe a possibilidade de perder os arquivos, para que isso não aconteça uma das opções de upload em nuvem é o AWS S3 e hoje é isso que vamos fazer… E para salvar na AWS precisamos…

Criando bucket na AWS

Precisamos criar tofu/aws_s3_buckets.tf

variable "s3_bucket_name" {
  type        = string
  description = "S3 bucket name"
  default     = "rails-demo-development" # must be unique
}

resource "aws_s3_bucket" "demo_bucket" {
  bucket = var.s3_bucket_name

  tags = {
    Name        = var.s3_bucket_name
    Environment = "development"
  }
}

Agora é só roda:

cd tofu
tofu validate # to validate if code is valid
tofu plan # to check if everything is ok
tofu apply -auto-approve # DON'T USE `-auto-approve` if you're not sure 

Com isso o bucket será criado

Screenshot 2024-02-27 at 07.37.11.png

Vamos precisar adicionar o sdk da AWS as nossas dependências

bundle add aws-sdk-s3

Isso vai alterar nosso Gemfile

--- a/Gemfile
+++ b/Gemfile
 gem "avo", ">= 3.2"
 gem "devise", "~> 4.9", ">= 4.9.3"
 # <https://github.com/tigrish/devise-i18n#customizing-views>
 gem "devise-i18n", "~> 1.12"
+# <https://github.com/aws/aws-sdk-ruby#configuration>
+gem "aws-sdk-s3", "~> 1.143"

No arquivo config/environments/development.rb vamos precisar alterar

--- a/config/environments/development.rb
+++ b/config/environments/development.rb
 Rails.application.configure do
   end
 
   # Store uploaded files on the local file system (see config/storage.yml for options).
-  config.active_storage.service = :local
+  config.active_storage.service = :amazon

Agora precisamos descomentar “amazon" no config/storage.yml

--- a/config/storage.yml
+++ b/config/storage.yml
local:
   root: <%= Rails.root.join("storage") %>
 
 # Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
-# amazon:
-#   service: S3
-#   access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
-#   secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
-#   region: us-east-1
-#   bucket: your_own_bucket-<%= Rails.env %>
+amazon:
+  service: S3
+  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
+  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
+  region: us-east-1
+  bucket: rails-demo-<%= Rails.env %>

Agora é preciso adicionar as chaves da AWS nas credentials