S3トリガーを使用してGlueJobを呼び出し、変換処理後に直接Redshift Serverlessにデータをインサートするデータパイプラインをデプロイするためのリポジトリです。
本リポジトリでのデプロイ手順は後述する検証環境で行っています。
極力環境依存の手順は減らすようにしてはいますが、必要に応じて読み替えてご実施ください。
東京都が公開している以下のオープンデータを使用します。
Glue Jobでの取り込みのために事前にUTF-8への文字コード変換を実施済みです。
本リポジトリでは以下のようなアーキテクチャが構築されます。
- 検証時の環境バージョンは以下です。
- WSL バージョン: 2.1.5.0
- カーネル バージョン: 5.15.146.1-2
- Windows バージョン: 10.0.19045.4170
- Docker version 24.0.6, build ed223bc
- aws-vault 7.2.0-Homebrew
- デプロイに必要な1つのVPCと3AZ分のSubnetは既に作成されているものとします。
- 以下のツール群が既にインストールされているものとします。
- AWSのアクセスキー、シークレットアクセスキーを事前に作成され、利用可能な状態になっているものとします。
※今回はDockerとaws-vaultを使用してコンテナ上でterraformコマンドを実行するようにして、ローカルでのTerraformインストールを不要にしました。
最初にAWSの認証情報を登録します。
[プロファイル名]には自身がわかりやすいプロファイル名を設定してください。
$ aws-vault --version
$ aws-vault add [プロファイル名]
Enter Access Key ID:
Enter Secret Access Key:
設定した後に.awsフォルダ配下のconfigファイルを確認すると以下のように表示されると思います。
$ cat ~/.aws/config
[default]
region=ap-northeast-1
output=json
[プロファイル名]
viコマンドなどを使用してconfigファイルを以下のように修正してください。
mfa_serialにはご自身のものを設定してください。
$ cat ~/.aws/config
[default]
region=ap-northeast-1
output=json
[プロファイル名]
region=ap-northeast-1
output=json
mfa_serial=arn:aws:iam::123456789123:mfa/xxxxxxxx ※MFA設定している人のみ
リポジトリからソースコードを取得します。
$ git clone [Clone URL]
$ cd glue-redshift-pipeline
デプロイコマンドを実行する前にaws-vaultを呼び出してAWSの一時的な認証情報を取得・設定します。
$ aws-vault exec [プロファイル名]
Enter MFA code for arn:aws:iam::123456789123:mfa/xxxxxxxx: 111111 ※MFA設定している人のみ
Starting subshell /bin/bash, use `exit` to exit the subshell
エラーなく実行出来たら以下のコマンドを実行し、トークンの有効期限を確認します。
$ aws-vault list
Profile Credentials Sessions
======= =========== ========
default - -
[プロファイル名] [プロファイル名] sts.GetSessionToken:58m49s
本リポジトリのリソースは1つのVPCと3つのSubnetを利用するため、デプロイ先の環境のリソースIDに置き換えて以下を実行します。
$ export vpc_id=vpc-xxxxxxxxxxxxxxxxx
$ export subnet_private_1a_id=subnet-xxxxxxxxxxxxxxxxx
$ export subnet_private_1c_id=subnet-xxxxxxxxxxxxxxxxx
$ export subnet_private_1d_id=subnet-xxxxxxxxxxxxxxxxx
後は以下のコマンドを実行するだけです。
applyまで実行すればデプロイ先の環境に構築されていると思います。
$ docker compose run --rm terraform init
$ docker compose run --rm terraform plan
$ docker compose run --rm terraform apply
$ docker compose run --rm terraform destroy
$ docker compose run --rm terraform apply -refresh-only
正常にデプロイされたら、「raw-data-[accountid]」バケットの「from_samplesystem/sample_data/」プレフィックスにサンプルファイルが自動でアップロードされているはずです。
アップロードイベントによってEventBridgeからSrepFunctionsが実行され、Glue Jobが実行されます。
Glue Jobは大体1分半ぐらいで終了します。
※もし実行されてなければ、上記のS3上のファイルをダウンロードして、同じ場所に再アップロードしてください
Glue Jobが正常終了していれば、Redshift Serverlessにデータが追加されているはずなので、クエリを実行して確認します。
Redshift Serverlessが作成されていることを確認し、クエリエディタv2を開きます。
構築したRedshift Serverless名を選択して、「Edit connection」からクエリエディタ上での接続情報設定を行います。
今回は構築時にSecrets Managerで管理ユーザーの認証情報を管理するように設定しているため、「AWS Secrets Manager」を選択します。
「+」からEditorを開いて、以下のSQLを実行するとサンプルデータが取得されることが確認できます。
SELECT
*
FROM
public.nursery_info;
あとは自由にデータを変えてみたり変換処理を追加してみたりして遊んでみてください。