[RAILS] Procédure d'utilisation de S3 de LocalStack pour le stockage actif

J'ai eu beaucoup de mal, alors je vais l'écrire sous forme de mémorandum.

Qu'est-ce que LocalStack?

Veuillez lire ici. https://github.com/localstack/localstack https://qiita.com/rio_matsui/items/e0c2c772d4579d00a312

Paramètres de LocalStack

Pour le moment, écrivez comme suit dans 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

Explication ci-dessous

Variable d'environnement

SERVICES: s3

Décrivez ici le service que vous souhaitez utiliser, et si vous souhaitez en utiliser plusieurs, écrivez-les séparés par des virgules.

AWS_ACCESS_KEY: 1234
AWS_SECRET_ACCESS_KEY: 12345678

Ceci est approprié, SECRET est en colère s'il ne contient pas plus de 8 caractères

DEFAULT_REGION: ap-northeast-1

Pour le moment, c'est aussi votre choix.

DATA_DIR: /data

Volume, l'emplacement de stockage des données à conserver, est créé et monté dans ce répertoire.

START_WEB: 0

LocalStack a quelque chose comme un écran de gestion, Si vous souhaitez l'utiliser, vous devez utiliser l'image localstack / localstack-full. S'il s'agit de localstack / localstack, l'écran de gestion ne peut pas être utilisé, mais lorsque je regarde le journal, je lance une erreur en essayant de le démarrer, alors désactivez-le.

HOSTNAME_EXTERNAL: localstack

La raison est probablement la même que celle écrite ici. Si vous n'écrivez pas ceci, vous ne pourrez pas accéder à partir du conteneur côté Rails. https://qiita.com/imunew/items/b74cecb7e12a9b9c4441

INIT_SCRIPTS_PATH: /root/init

Emplacement du script d'initialisation Si vous écrivez un script comme celui ci-dessous ici, il sera exécuté au démarrage.

cd /root/init
#Comme aws local est inclus dans le conteneur, créez un Bucket en utilisant
awslocal s3 mb s3://test-bucket

Cette fois, le script créé est monté côté conteneur et exécuté.

      - ./docker/localstack:/root/init

Voir ici pour les variables d'environnement non écrites ici https://github.com/localstack/localstack#configurations

Port

    ports:
      - 4566:4566

LocalStack accepte l'accès avec 4566, alors définissez la redirection de port À propos, lorsque vous utilisez awscli, spécifiez Endpoint comme indiqué ci-dessous.

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

Si vous venez de l'intérieur du conteneur, la commande aws local est incluse, il est donc plus facile de l'utiliser.

Lorsque vous le démarrez avec cela, Bucket doit être créé dans S3.

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

Paramètres latéraux des rails

Consultez cette page pour les paramètres d'utilisation de S3 avec Active Storage. https://qiita.com/tsubasan1122/items/0171fe04754a760f7e4a

Seuls les paramètres requis pour utiliser LocalStack sont décrits ici.

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

Explication ci-dessous

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

Cela doit correspondre aux paramètres du côté LocalStack

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

Réglez pour changer la destination de prise de l'api aws vers le côté de la pile locale. Cependant, tel quel, lors de l'accès à S3, il essaiera d'accéder avec http: // # {endpoint}. # {Bucket name}. Évitez en définissant l'option force_path_style sur true.

Il devrait maintenant être enregistré du côté LocalStack. Vérifiez ci-dessous

#Enregistrez correctement l'image
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)

#Vérifiez la clé de l'image S3
image.image.attachment.blob.key
"p1fp3sd0mqxscrvcx960nqa7caal"

#Vérifiez si l'image est enregistrée du côté de la pile locale
aws --endpoint=http://localhost:4566 s3 ls s3://gpa-dev-image                                                              
2020-11-02 11:59:17      14845 p1fp3sd0mqxscrvcx960nqa7caal #La même clé existe

Autre

Je peux enregistrer le fichier, mais le domaine de l'URL obtenu lorsque j'essaie d'afficher l'image sur le navigateur est http: // localstack: 4566. Cette zone a été prise en charge par la création d'une méthode qui renvoie une URL comme indiqué dans la page ci-dessous. https://qiita.com/shouta-dev/items/0b9569bf5522cca4cf3c

Recommended Posts

Procédure d'utilisation de S3 de LocalStack pour le stockage actif
[Rails] Comment utiliser Active Storage
Déplacer le stockage actif sur S3 localement
Comment utiliser setDefaultCloseOperation () de JFrame
Utilisé pour une raison quelconque
[Pour les débutants Rails] Résumé de l'utilisation de RSpec (obtenir un aperçu)
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
Comment utiliser binding.pry pour afficher le fichier
À propos de la procédure pour que Java fonctionne
[Ruby] Comment utiliser slice pour les débutants
[Java] [Maven3] Résumé de l'utilisation de Maven3
Problème de lenteur de traitement lors de l'utilisation d'Active Storage avec le stockage cloud (GCS, S3, etc.)
Utilisez jenv pour activer plusieurs versions de Java
Procédure JAVA pour le chargement de MySQL JDBC à l'aide d'Eclipse
Comment utiliser un tableau pour les clés HashMap
Sortie de la façon d'utiliser la méthode slice
Critères pour utiliser correctement render et redirect_to
Comment utiliser JQuery dans Rails 6 js.erb
Comment lier des images à l'aide de FactoryBot Active Storage
[Pour les super débutants] Comment utiliser l'autofocus: vrai
[Introduction à Java] Bases de l'arithmétique Java (pour les débutants)
Comment spécifier l'index de JavaScript pour l'instruction
Explication de Ruby on rails pour les débutants ④ ~ À propos des règles de dénomination et comment utiliser form_Tag ~