[RAILS] Vorgehensweise zur Verwendung von S3 von LocalStack für Active Storage

Ich hatte ziemlich viel zu kämpfen, deshalb werde ich es als Memorandum schreiben.

Was ist LocalStack?

Bitte lesen Sie hier. https://github.com/localstack/localstack https://qiita.com/rio_matsui/items/e0c2c772d4579d00a312

LocalStack-Einstellungen

Schreiben Sie vorerst wie folgt in docker-compose.yml

  localstack:
    image: localstack/localstack:0.12.1
    environment:
      SERVICES: s3
      AWS_ACCESS_KEY: 1234
      AWS_SECRET_ACCESS_KEY: 12345678
      DEFAULT_REGION: ap-northeast-1
      DATA_DIR: /data
      START_WEB: 0
      HOSTNAME_EXTERNAL: localstack
      INIT_SCRIPTS_PATH: /root/init
    volumes:
      - localstack-data:/data
      - ./docker/localstack:/root/init
    ports:
      - 4566:4566

volumes:
  localstack-data:
    driver: local

Erklärung unten

Umgebungsvariable

SERVICES: s3

Beschreiben Sie den Dienst, den Sie hier verwenden möchten. Wenn Sie mehrere Dienste verwenden möchten, schreiben Sie diese durch Kommas getrennt.

AWS_ACCESS_KEY: 1234
AWS_SECRET_ACCESS_KEY: 12345678

Dies ist angemessen, SECRET ist wütend, wenn es nicht mehr als 8 Zeichen ist

DEFAULT_REGION: ap-northeast-1

Dies ist vorerst auch Ihre Wahl.

DATA_DIR: /data

Das Volume, der Speicherort für die Daten, die beibehalten werden sollen, wird in diesem Verzeichnis erstellt und bereitgestellt.

START_WEB: 0

LocalStack hat so etwas wie einen Verwaltungsbildschirm. Wenn Sie es verwenden möchten, müssen Sie das Image localstack / localstack-full verwenden. Der Verwaltungsbildschirm kann nicht mit localstack / localstack verwendet werden. Wenn ich mir jedoch das Protokoll ansehe, wird beim Versuch, es zu starten, ein Fehler ausgegeben. Deaktivieren Sie es daher.

HOSTNAME_EXTERNAL: localstack

Der Grund ist wahrscheinlich der gleiche wie hier geschrieben. Wenn Sie dies nicht schreiben, können Sie vom Container auf der Rails-Seite nicht darauf zugreifen. https://qiita.com/imunew/items/b74cecb7e12a9b9c4441

INIT_SCRIPTS_PATH: /root/init

Speicherort des Initialisierungsskripts Wenn Sie ein Skript wie das folgende schreiben, wird es beim Start ausgeführt.

cd /root/init
#Da aws local im Container enthalten ist, erstellen Sie damit einen Bucket
awslocal s3 mb s3://test-bucket

Dieses Mal wird das erstellte Skript auf der Containerseite bereitgestellt und ausgeführt.

      - ./docker/localstack:/root/init

Hier finden Sie Umgebungsvariablen, die hier nicht geschrieben sind https://github.com/localstack/localstack#configurations

Port

    ports:
      - 4566:4566

LocalStack akzeptiert den Zugriff mit 4566, stellen Sie also die Portweiterleitung ein Übrigens, wenn Sie mit awscli treffen, geben Sie den Endpunkt wie unten gezeigt an.

aws --endpoint=http://localhost:4566 s3 ls s3://test-bucket --recursive

Wenn Sie sich innerhalb des Containers befinden, ist der lokale Befehl aws enthalten, sodass die Verwendung einfacher ist.

Wenn Sie damit beginnen, sollte Bucket in S3 erstellt werden.

aws --endpoint=http://localhost:4566 s3 ls                                                                            
2020-11-02 10:12:10 test-bucket

Schienenseitige Einstellungen

Auf dieser Seite finden Sie die Einstellungen für die Verwendung von S3 mit Active Storage. https://qiita.com/tsubasan1122/items/0171fe04754a760f7e4a

Hier werden nur die Einstellungen beschrieben, die für die Verwendung von LocalStack erforderlich sind.

storage.yml

localstack:
  service: S3
  access_key_id: 1234
  secret_access_key: 12345678
  region: ap-northeast-1
  endpoint: http://localstack:4566
  force_path_style: true
  bucket: test-bucket

Erklärung unten

  service: S3
  access_key_id: 1234
  secret_access_key: 12345678
  region: ap-northeast-1

Dies sollte mit den Einstellungen auf der LocalStack-Seite übereinstimmen

  endpoint: http://localstack:4566
  force_path_style: true

Stellen Sie ein, dass das Tap-Ziel von aws api auf die Localstack-Seite geändert werden soll. Beim Zugriff auf S3 wird jedoch versucht, mit http: // # {Endpunkt}. # {Bucket-Name} darauf zuzugreifen. Vermeiden Sie dies, indem Sie die Option force_path_style auf true setzen.

Es sollte jetzt auf der LocalStack-Seite gespeichert werden. Überprüfen Sie unten

#Speichern Sie das Bild richtig
file = "1.jpg "
content_type = 'image/jpg'
image = Image.first
image.image.attach(io: File.open(file), filename: File.basename(file), content_type: content_type)

#Überprüfen Sie den Schlüssel des S3-Bildes
image.image.attachment.blob.key
"p1fp3sd0mqxscrvcx960nqa7caal"

#Überprüfen Sie, ob das Bild auf der Localstack-Seite gespeichert ist
aws --endpoint=http://localhost:4566 s3 ls s3://gpa-dev-image                                                              
2020-11-02 11:59:17      14845 p1fp3sd0mqxscrvcx960nqa7caal #Der gleiche Schlüssel existiert

Andere

Ich kann die Datei speichern, aber die Domäne der URL, die beim Versuch angezeigt wird, das Bild im Browser anzuzeigen, lautet http: // localstack: 4566. Dieser Bereich wurde durch die Erstellung einer Methode unterstützt, die eine URL zurückgibt, wie auf der folgenden Seite gezeigt. https://qiita.com/shouta-dev/items/0b9569bf5522cca4cf3c

Recommended Posts

Vorgehensweise zur Verwendung von S3 von LocalStack für Active Storage
[Rails] Verwendung von Active Storage
Verschieben Sie Active Storage auf S3 lokal
Verwendung von setDefaultCloseOperation () von JFrame
Verwenden Sie aus irgendeinem Grund zu verwenden
[Für Rails-Anfänger] Zusammenfassung der Verwendung von RSpec (Überblick)
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Verwendung von binding.pry für die Ansichtsdatei
Über das Verfahren, damit Java funktioniert
[Ruby] Wie man Slice für Anfänger benutzt
[Java] [Maven3] Zusammenfassung der Verwendung von Maven3
Problem der langsamen Verarbeitung bei Verwendung von Active Storage mit Cloud-Speicher (GCS, S3 usw.)
Verwenden Sie jenv, um mehrere Java-Versionen zu aktivieren
JAVA-Prozedur zum Laden von MySQL JDBC mit Eclipse
So verwenden Sie ein Array für HashMap-Schlüssel
Ausgabe der Verwendung der Slice-Methode
Kriterien für die ordnungsgemäße Verwendung von render und redirect_to
Verwendung von JQuery in Rails 6 js.erb
So verknüpfen Sie Bilder mit FactoryBot Active Storage
[Für Super-Anfänger] Verwendung des Autofokus: true
[Einführung in Java] Grundlagen der Java-Arithmetik (für Anfänger)
So geben Sie den JavaScript-Index für die Anweisung an
Erklärung von Ruby on Rails für Anfänger ④ ~ Informationen zu Benennungsregeln und zur Verwendung von form_Tag ~