【Docker】Docker compose ~ LocalStack/Glue4.0 ~

■ はじめに

Spark/Scalaの開発環境構築 ~ Windows編 ~
https://dk521123.hatenablog.com/entry/2023/03/20/115450

で、『本当は、Dockerで一発でばーんって作りたい、、、』って
言ったのだが、それを実践してみた
以前やった

https://dk521123.hatenablog.com/entry/2022/01/31/165650
https://dk521123.hatenablog.com/entry/2022/01/31/165650

の Glue4.0版でLocalStackを加えて、Docker composeで作ってみた

目次

【1】導入するコンポーネント
 1)LocalStack
 2)Glue v4 on Local
【2】前提条件
 1)Docker/Docker compose
 2)その他開発環境
【3】構築手順
 1)設定ファイル作成
 2)コンテナ起動
 3)動作確認
 4)コンテナ停止
【4】トラブル
 1)エラー「Cannot connect to the Docker daemon」が表示

【1】導入するコンポーネント

* 以下のコンポーネントを Docker compose を使って導入する
~~~~~~~~
1)LocalStack
2)Glue v4 on Local
~~~~~~~~

1)LocalStack

* Glue から S3 API を呼ぶことを想定して導入

https://localstack.cloud/
Github
https://github.com/localstack/localstack

2)Glue v4 on Local

前述「1)LocalStack」の有償版であれば、
Glueがサポート内であるのだが、貧乏人なので、、、

Github
https://github.com/awslabs/aws-glue-libs
Docker hub
https://hub.docker.com/r/amazon/aws-glue-libs/tags

【2】前提条件

* 以下が必要。
~~~~~~
1)Docker/Docker compose (compose v2)
2)AWS CLI (awscli-local)
~~~~~~

1)Docker/Docker compose

* Docker/Docker compose を使える環境
 => 今回は、Docker compose v2を想定(v1はサポートが切れるし)
 => 用意する場合は、以下の関連記事を参照のこと

WSL ~ Docker-CE + Genie / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2021/11/03/003836

2)その他開発環境

Docker composeで「LocalStack/Glue Scala」を構築する際には
関係ないかもしれないが、目的としてそこで開発するので
それ以外の開発に必要なツールを紹介。

[1] AWS CLI (awscli-local)

* 作成した疑似AWS環境(LocalStack)に対して操作するAWS CLI が必要
 => 今回は、以前扱ったawscli-localを使う

https://dk521123.hatenablog.com/entry/2020/12/16/211127

[2] JDK/SBT

* Glue / Scala で開発するので、JDK/SBT
 => 構築については、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2023/03/10/193805

[3] その他

* VS Code とかも入れることを考えたが、
 以下の関連記事の「【4】WSLで作成したファイルの場所」で
 書いた通り、「\\wsl$」で見れるので、とりあえず保留。

https://dk521123.hatenablog.com/entry/2023/01/29/000000

【3】構築手順

1)設定ファイル作成

[1] Docker compose「compose.yaml

services:
  # [1] For LocalStack
  localstack:
    container_name: localstack
    image: localstack/localstack:latest
    ports:
      # LocalStack Gateway
      - 4566:4566
    volumes:
      - ./docker/localstack:/docker-entrypoint-initaws.d
      -  /var/run/docker.sock:/var/run/docker.sock
      - 'localstack-data:/tmp/localstack'
    networks:
      - glue.local.network
    environment:
      # Add the AWS service, If you want
      - SERVICES=kms,sns,ses,s3,lamdba,secretsmanager
      - AWS_ACCESS_KEY_ID=dummy
      - AWS_SECRET_ACCESS_KEY=dummy
      - AWS_DEFAULT_REGION=us-west-1
      - DATA_DIR=/tmp/localstack/data
      # Add the hostname for SQS, If you want
      # See https://qiita.com/imunew/items/b74cecb7e12a9b9c4441
      - HOSTNAME_EXTERNAL=localstack
  # [2] For Glue local
  glue.local:
    container_name: glue.local
    image: amazon/aws-glue-libs:glue_libs_4.0.0_image_01
    volumes:
      - ./:/home/glue_user/workspace/jupyter_workspace
      - ./glue-local-spark.conf:/home/glue_user/spark/conf/spark-defaults.conf
    environment:
      - DISABLE_SSL=true
      - AWS_ACCESS_KEY_ID=dummy
      - AWS_SECRET_ACCESS_KEY=dummy
      - AWS_DEFAULT_REGION=us-west-1
    ports:
      # Port of jupyterlab
      - 18888:8888
      # Port of Spark UI
      - 14040:4040
    networks:
      - glue.local.network
    command: /home/glue_user/jupyter/jupyter_start.sh
volumes:
  localstack-data:
networks:
  glue.local.network:
    name: glue.local.network

[2] Sparkの設定ファイル「glue-local-spark.conf」

spark.driver.extraClassPath /home/glue_user/spark/jars/*:/home/glue_user/aws-glue-libs/jars/*
spark.executor.extraClassPath   /home/glue_user/spark/jars/*:/home/glue_user/aws-glue-libs/jars/*
spark.sql.catalogImplementation hive
spark.eventLog.enabled  true
spark.history.fs.logDirectory   file:////tmp/spark-events
spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version    2
spark.hadoop.mapreduce.fileoutputcommitter.marksuccessfuljobs   false
spark.unsafe.sorter.spill.read.ahead.enabled    false
spark.network.crypto.enabled    true
spark.network.crypto.keyLength  256
spark.network.crypto.keyFactoryAlgorithm    PBKDF2WithHmacSHA256
spark.network.crypto.saslFallback   false
spark.authenticate  true
spark.io.encryption.enabled false
spark.io.encryption.keySizeBits 256
spark.io.encryption.keygen.algorithm    HmacSHA256
spark.authenticate.secret       62e100c5-5281-4030-992b-1f60391ed508

2)コンテナ起動

# ファイルの確認
ls
~~~~
compose.yaml  glue-local-spark.conf
~~~~

# コンテナ起動
sudo docker compose up -d

3)動作確認

[1] LocalStackの確認 (S3)

# To create S3 bucket
#  Only use AWS CLI, add --endpoint-url http://localhost:4566
# aws s3 mb s3://local-demo-bucket --endpoint-url http://localhost:4566
awslocal s3 mb s3://local-demo-bucket

# To check the S3 bucket
# aws s3 ls --endpoint-url http://localhost:4566
awslocal s3 ls

# Upload files
mkdir demo
echo "Hello world!" > ./demo/hello.txt
echo "Hi, world!" > ./demo/hi.txt
# aws s3 cp ./demo s3://local-demo-bucket/sample --recursive --endpoint-url http://localhost:4566
awslocal s3 cp ./demo s3://local-demo-bucket/sample --recursive

# To check uploaded files
# aws s3 ls s3://local-demo-bucket/sample/ --endpoint-url http://localhost:4566
awslocal s3 ls s3://local-demo-bucket/sample/
2023-03-21 23:03:15         13 hello.txt
2023-03-21 23:03:15         11 hi.txt

[2] LocalStackの確認 (Secrets manager)

# Create Secret
$ aws --endpoint-url=http://localhost:4566 secretsmanager create-secret \
 --name "app/local/DemoSecrets" \
 --secret-string '{"CLIENT_SECRET_VALUE1":"Hello", "CLIENT_SECRET_VALUE2":"World" }'

# Get Secret
$ aws --endpoint-url=http://localhost:4566 secretsmanager get-secret-value \
    --secret-id app/local/DemoSecrets

{
    "ARN": "arn:aws:secretsmanager:us-west-1:000000000000:secret:app/local/DemoSecrets-TNEKYE",
    "Name": "app/local/DemoSecrets",
    "VersionId": "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx",
    "SecretString": "{\"CLIENT_SECRET_VALUE1\":\"Hello\", \"CLIENT_SECRET_VALUE2\":\"World\" }",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2023-04-02T23:44:48.267328+09:00"
}

4)コンテナ停止

環境が不要になったら、以下を実行

docker compose down --volumes

【5】トラブル

1)エラー「Cannot connect to the Docker daemon」が表示

「docker compose up -d」実行後に、以下のエラー内容が発生した。

エラー内容

Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
Is the docker daemon running?

原因

Dockerデーモンが動いていないため。

対応案

# restart docker
sudo service docker stop
sudo service docker start

参考文献

https://future-architect.github.io/articles/20220428a/

関連記事

Docker ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2020/04/24/160044
Docker compose ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2022/04/28/000000
Docker compose ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/05/21/222910
Docker compose ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/04/11/000000
Docker compose ~ docker-compose.yml ~
https://dk521123.hatenablog.com/entry/2020/12/18/152949
Docker compose ~ Version 2 ~
https://dk521123.hatenablog.com/entry/2023/01/02/000000
WSL ~ Docker-CE + Genie / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2021/11/03/003836
WSL2 ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/01/29/000000
AWS Glue ~ ローカル環境を作成する ~
https://dk521123.hatenablog.com/entry/2022/01/31/165650
AWS Glue ~ ローカル環境を作成する / Glue v3.0版 ~
https://dk521123.hatenablog.com/entry/2022/01/31/165650
LocalStack ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/14/010524
LocalStack ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2019/12/16/231149
LocalStack ~ awscli-local ~
https://dk521123.hatenablog.com/entry/2020/12/16/211127
Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Spark/Scalaの開発環境構築 ~ Windows編 ~
https://dk521123.hatenablog.com/entry/2023/03/20/115450
AWS Glue ~ Scalaでの実装 ~
https://dk521123.hatenablog.com/entry/2023/03/17/000000
ScalaAWS SDK / S3サンプル ~
https://dk521123.hatenablog.com/entry/2023/04/01/002005
ScalaAWS SDK / Secrets Managerサンプル ~
https://dk521123.hatenablog.com/entry/2023/04/03/012600
Visual Studio Code ~ WSLプラグイン
https://dk521123.hatenablog.com/entry/2023/04/02/172851