【Airflow】MWAA ~ aws-mwaa-local-runner + LocalStack ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/11/05/233309

の続き。
aws-mwaa-local-runner と LocalStack との
組み合わせについて扱う。

目次

【1】構築方針
 1)前提条件
【2】構築手順
 1)docker-compose の作成
 2)「docker-compose up -d」の実行
 3)動作確認
【3】その他操作
 1)S3を操作
 2)Redshiftのクラスタ作成
【4】課題

【1】構築方針

* docker-compose を使用して構築する
 => docker-compose については、以下の関連記事を参照のこと。

Docker ~ 基本編 / docker-compose ~
https://dk521123.hatenablog.com/entry/2020/04/11/000000
Docker ~ 基本編 / docker-compose.yml の書き方 ~
https://dk521123.hatenablog.com/entry/2020/12/18/152949

1)前提条件

* Docker/Docker composeを使える環境
* Port : 8080/4566 を使っていない環境
 => ポートが使用されている場合は、別ポートに振りなおす
* Shell が実行できる環境
 => 参考にしたdocker-compose.ymlがLinux環境前提で作成されている
 => 今回は、Git for windowsをインストール時に
  付与されてくる Git Bash を使って対応した

【2】構築手順

1)docker-compose の作成
2)「docker-compose up -d」の実行
3)動作確認

1)docker-compose の作成

* 以下のサービスを追加できる docker-compose を作成する
[1] aws-mwaa-local-runner
[2] LocalStack
[3] PostgreSQL
[4] AWS CLI

docker-compose.yml

version: "3"

services:
  localstack:
    image: localstack/localstack:latest
    container_name: "localstack"
    ports:
      - "4566:4566"
    environment:
      # 自分の使いたいAWSサービスを追加
      - SERVICES=dynamodb,sqs,s3,iam,sns,redshift,lambda
      - DOCKER_HOST=unix:///var/run/docker.sock
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/tmp/localstack:/tmp/localstack"
  postgres:
      image: postgres:10-alpine
      environment:
          - POSTGRES_USER=airflow
          - POSTGRES_PASSWORD=airflow
          - POSTGRES_DB=airflow
      logging:
          options:
              max-size: 10m
              max-file: "3"
      volumes:
          - "${PWD}/db-data:/var/lib/postgresql/data"
  # 以下をコピぺ
  # https://github.com/aws/aws-mwaa-local-runner/blob/main/docker/docker-compose-local.yml
  local-runner:
      image: amazon/mwaa-local:2.0.2
      restart: always
      depends_on:
          - postgres
      environment:
          - LOAD_EX=n
          - EXECUTOR=Local
      logging:
          options:
              max-size: 10m
              max-file: "3"
      volumes:
          - ${PWD}/dags:/usr/local/airflow/dags
          - ${PWD}/plugins:/usr/local/airflow/plugins
      ports:
          - "8080:8080"
      command: local-runner
      healthcheck:
          test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
          interval: 30s
          timeout: 30s
          retries: 3
  aws-cli:
    image: mesosphere/aws-cli
    container_name: "aws-cli"
    volumes:
      - ./resources:/tmp/resources
    environment:
      - AWS_ACCESS_KEY_ID=dummyaccess
      - AWS_SECRET_ACCESS_KEY=dummysecret
      - AWS_DEFAULT_REGION=us-east-1
    entrypoint: /bin/sh -c
    command: >
      "
        aws dynamodb create-table --endpoint http://localstack:4566 \
        --table-name report-request \
        --attribute-definitions AttributeName=reportRequestId,AttributeType=S  \
        --key-schema AttributeName=reportRequestId,KeyType=HASH  \
        --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
        aws dynamodb batch-write-item --endpoint http://localstack:4566 \
        --request-items file:///tmp/resources/report-request.json \
        --return-consumed-capacity INDEXES \
        --return-item-collection-metrics SIZE
        aws sqs create-queue --endpoint http://localstack:4566 \
        --queue-name myqueue
        aws --endpoint http://localstack:4566 s3 mb s3://reports
        aws --endpoint http://localstack:4566 s3 mb s3://reports-output
        aws --endpoint http://localstack:4566 s3 cp /tmp/resources/fake-report.json \
        s3://reports/fake-report.json
      "
    depends_on:
      - localstack

2)「docker-compose up -d」の実行

# Windowsの場合、「Git-bash」で実行する
docker-compose up -d

3)動作確認

* ブラウザで以下にアクセスする

Airflow
http://localhost:8080/home
LocalStack
http://localhost:4566

【3】その他操作

1)S3を操作

# S3バケット「local-demo-bucket」作成
$ aws s3api create-bucket --bucket local-demo-bucket --endpoint-url http://localhost:4566

{
    "Location": "http://local-demo-bucket.s3.localhost.localstack.cloud:4566/"
}

2)Redshiftのクラスタ作成

* 以下のサイトを参考にした。

https://qiita.com/greenteabiscuit/items/73e5552655cb38685d10

[1] プロファイル作成

aws configure --profile localstack

[2] Redshiftのクラスタ作成

aws redshift create-cluster --cluster-identifier demo-for-mwaa --node-type dw.hs1.xlarge --master-username user --master-user-password password --profile localstack --endpoint-url=http://localhost:4566

【4】課題

* LocalStack については、S3 や RedShift を対応しているが
 EMRは非対応なので、もし、EMRを使っている場合は、
 別途、どうするか考えなくてはならない

参考文献

https://aws.plainenglish.io/end-to-end-pipeline-mocking-with-localstack-and-airflow-mwaa-ac4f019c3a0e
https://medium.com/codex/how-to-setup-a-local-mwaa-development-environment-92e4e7557ecb

関連記事

MWAA ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/09/29/131101
MWAA ~ aws-mwaa-local-runner ~
https://dk521123.hatenablog.com/entry/2021/11/05/233309
LocalStack ~ awscli-local ~
https://dk521123.hatenablog.com/entry/2020/12/16/211127
LocalStack ~ ローカルで疑似AWSを作成する ~
https://dk521123.hatenablog.com/entry/2019/12/14/010524
LocalStack ~ ローカルで疑似Lambda/S3/DynamoDBを作成する ~
https://dk521123.hatenablog.com/entry/2019/12/16/231149
Amazon DynamoDB Local
https://dk521123.hatenablog.com/entry/2019/11/13/221326
Git ~ 初期設定 / Windows 編 ~
https://dk521123.hatenablog.com/entry/2018/08/14/215814
Docker Desktop / WSL2 ~ Windows / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2020/12/08/165505
WindowsAWS CLIを使うには
https://dk521123.hatenablog.com/entry/2020/12/01/000000
Docker ~ 基本編 / docker-compose ~
https://dk521123.hatenablog.com/entry/2020/04/11/000000
Docker ~ 基本編 / docker-compose.yml の書き方 ~
https://dk521123.hatenablog.com/entry/2020/12/18/152949