■ はじめに
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」を構築する際には 関係ないかもしれないが、目的としてそこで開発するので それ以外の開発に必要なツールを紹介。
* 作成した疑似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
Scala ~ AWS SDK / S3サンプル ~
https://dk521123.hatenablog.com/entry/2023/04/01/002005
Scala ~ AWS 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