10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

闘魂LocalStack ── LocalStackを楽しむ

Last updated at Posted at 2023-08-20

$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$

$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$

本記事の内容は、macOS Ventura 13.5(M2)でのみ試しています。

はじめに

LocalStack完全に理解しました(※)。

(※)例の意味です。「製品を利用をするためのチュートリアルを完了できたという意味」私はチュートリアルを全部やったわけではないのでまだ早いのかもしれません。

開発マシンにあれこれインストールしたくなかったので、全部Dockerコンテナ内で実行することにします。なぜインストールしたくないの? と言われると明確な答えはなく、「なんとなく」の気分です。憧れとまでは行きませんが、なんとなく前からDockerコンテナの中でdockerコマンドを使うことをやってみたかったというのもあります。

What is LocalStack ?

LocalStackとは

LocalStack is a cloud service emulator that runs in a single container on your laptop or in your CI environment. With LocalStack, you can run your AWS applications or Lambdas entirely on your local machine without connecting to a remote cloud provider!

です。

https://docs.localstack.cloud/getting-started/ に書いてあります。
AWSをエミュレートできます。会社の後輩に教えてもらいました。
LocalStackDockerコンテナとして動作します。
AWS CLIでリソースの作成などの操作をエミュレートできます。

Ubuntuのコンテナの中でLocalStackのコンテナを動かす

How can i run docker command inside a docker container?」が参考になります。

どうやら2つの手法があるそうです。

  • DinD(Docker in Docker)
  • DooD(Docker outside of Docker)

を参考にさせていただきました。ありがとうーーーーッ!!! でございます。

以下、DooD(Docker outside of Docker)でやってみます。

環境構築

DooD(Docker outside of Docker)でやってみます。

Dockerfiledocker-compose-for-copy.ymlの2つのファイルを用意します。

Dockerfile
FROM ubuntu:22.04

WORKDIR /root

# Docker
# https://docs.docker.com/engine/install/ubuntu/
RUN apt-get update && apt-get install -y \
  ca-certificates \
  curl \
  gnupg \
  sudo \
  vim \
  unzip \
  jq \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

RUN sudo install -m 0755 -d /etc/apt/keyrings
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
RUN sudo chmod a+r /etc/apt/keyrings/docker.gpg
RUN echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt-get update && apt-get install -y \
  docker-ce \
  docker-ce-cli \
  containerd.io \
  docker-buildx-plugin \
  docker-compose-plugin \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

# LocalStack
COPY docker-compose-for-copy.yml docker-compose.yml 

# aws cli
# https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN sudo ./aws/install

ベースイメージはUbuntuを使っています。
ここでやっていることは次の通りです。

  • Ubuntuコンテナにてdockerコマンドが使えるようにDockerをインストール
  • LocalStackを動かすdocker-compose.yml/rootに配置
  • awsコマンドが使えるようにAWS CLIをインストール
    • M2ではなくIntelをお使いの場合はダウンロードするバイナリが違いますので、コメントのリンク先をご参照ください
docker-compose-for-copy.yml
version: "3.8"

services:
  localstack:
    container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}"
    image: localstack/localstack
    ports:
      - "4566:4566"            # LocalStack Gateway
      - "4510-4559:4510-4559"  # external services port range
    environment:
      - DEBUG=${DEBUG-}
      - DOCKER_HOST=unix:///var/run/docker.sock
    volumes:
      - volume:/var/lib/localstack
      - "/var/run/docker.sock:/var/run/docker.sock"

volumes:
  volume:

docker-compose-for-copy.ymlは、

を参考に作りました。/root/docker-compose.ymlとして配置します。

ホスト(開発マシン)でビルドします。

docker build -t my-image:latest .

環境構築は以上です。

Run

Ubuntuコンテナを動かします。

docker run -it --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
my-image:latest

ここでのポイントは、"-v /var/run/docker.sock:/var/run/docker.sock"です。
Ubuntuコンテナ側からホスト(開発マシン)のdocker.sock (/var/run/docker.sock)をマウントすることでUbuntuコンテナ上のdockerコマンドはホスト(開発マシン)上のDocker環境で実行されます。

Ubuntuコンテナのbashが立ち上がりますので次のコマンドを実行してみましょう。

curl gateway.docker.internal:4566/_localstack/health | jq

gateway.docker.internalに対して接続しているのは、コンテナの中から実行するんだったらlocalhostとか127.0.0.1でいけそうな気がしましたが駄目でした。頭がこんがらがりそうですが、Dockerコンテナ自体は結局ホスト(開発マシン)で動いている関係でこうなるのだと思います。

gateway.docker.internalについては、「コンテナからホスト上のサービスに対して接続したい」を参考にしました。

次のような実行結果が得られます。

{
  "services": {
    "acm": "available",
    "apigateway": "available",
    "cloudformation": "available",
    "cloudwatch": "available",
    "config": "available",
    "dynamodb": "available",
    "dynamodbstreams": "available",
    "ec2": "available",
    "es": "available",
    "events": "available",
    "firehose": "available",
    "iam": "available",
    "kinesis": "available",
    "kms": "available",
    "lambda": "available",
    "logs": "available",
    "opensearch": "available",
    "redshift": "available",
    "resource-groups": "available",
    "resourcegroupstaggingapi": "available",
    "route53": "available",
    "route53resolver": "available",
    "s3": "running",
    "s3control": "available",
    "scheduler": "available",
    "secretsmanager": "available",
    "ses": "available",
    "sns": "available",
    "sqs": "available",
    "ssm": "available",
    "stepfunctions": "available",
    "sts": "available",
    "support": "available",
    "swf": "available",
    "transcribe": "available"
  },
  "version": "2.2.1.dev"
}

:tada::tada::tada:
各種AWSのサービスが動いていそうです。

LocalStackでS3を操作してみる

以下、Ubuntuコンテナの中での操作です。

docker compose up -d
export AWS_ACCESS_KEY_ID=1
export AWS_SECRET_ACCESS_KEY=2
export AWS_DEFAULT_REGION=us-west-2

docker compose up -dは、Dockerfileの中に書いた「COPY docker-compose-for-copy.yml docker-compose.yml」により、/app/docker-compose.ymlが配置されておりますのでそれを開始しています。AWS_ACCESS_KEY_ID等は、aws configをする代わりに環境変数で初期設定をしています。今回はAWSに接続するのではなく、LocalStackでエミュレートするので値は適当でよいです。

AWS CLI で高レベル (S3) コマンドを使用する」を参考にLocalStack上でS3の操作をしてみます。

S3とはSimple Storage Serviceの略で、「場所を問わず、任意の量のデータを保存および取得できるように構築されたオブジェクトストレージ」です。

awesome-bucketを作成し、そこにawesome.txtをアップロードし、awesome.txtがアップロードされたことを確かめてみます。
--endpoint-urlオプションで、LocalStackを指すようにします。
gateway.docker.internalをホスト名にしているのは前項で説明した通りです。

aws --endpoint-url=http://gateway.docker.internal:4566 s3 mb s3://awesome-bucket

echo "We are the Alchemists, my friends!!!" >> awesome.txt

aws --endpoint-url=http://gateway.docker.internal:4566 s3 cp awesome.txt s3://awesome-bucket/

aws --endpoint-url=http://gateway.docker.internal:4566 s3 ls s3://awesome-bucket

:tada::tada::tada:
S3をエミュレートすることができました!!!

さいごに

本記事では、はじめてのLocalStackということで、S3の操作のみを行ってみました。
LocalStackの公式には「Quickstart」がありますのでもっと複雑で実践的なことをやりたい人は、そちらをやってみるとよいでしょう。私はまだやっていませんが「Tutorials」もあります。

AWS CLIAWS CloudFormationTerraformServerlessなどを試してみるときに、AWSアカウント上にリソースを作ることなくローカルの開発環境でエミュレートできるので便利そうです。公式にも書いてあるように時短と経費の節約(Save time and resources)ができます。

スクリーンショット 2023-08-20 12.02.51.png

他には単なる趣味に近いところで、Dockerコンテナの中でdockerコマンドを実行することをやってみました。この記事では、「DooD(Docker outside of Docker)」をやってみました。


闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。


$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?