AWS-CodePipeline

GlueジョブをVersion Control機能を使ってCodePipelineでCI/CDしてみた

はじめに

こんにちは、omkです。

GlueではVersion Controlを使用することでCodeCommitやGithubなどと連携してソースコードをバージョン管理出来ます。
Glueコンソールで生じた変更をGitに上げたりGitからプルして反映したりといったことが可能です。

ジョブの内容に限らず実行設定やパラメータなどの設定も記録されます
(Visual ETLの場合は設定のJSONファイル1つ、自前のPySparkスクリプトの場合はジョブスクリプトのPythonファイルと設定のJSONファイルがそれぞれ作成されます)。

今回はローカルでジョブスクリプトを編集してCodeCommitにプッシュした際を想定して、Glueにジョブを反映するパイプラインを作っていきます。
一部EventBridgeの仕様的に十分な機能が得られない箇所があり、以降はお試し程度でやってみるもののであるためあしからず。

やってみた

流れ

以下の流れで動くようにします。

ローカル → Codecommitにプッシュ → EventBridgeでトリガー → CodePipeline開始 → CodeCommitからソース取得 → CodeBuildでジョブを更新

CodeCommitのリポジトリとデプロイ先のジョブについては既にある想定で進めます。

ビルドプロジェクト作成

以下のbuildspecを利用してGlueジョブを更新します。

buildspec.yml

version: 0.2
phases:
  build:
    commands:
      - aws glue update-job-from-source-control --region "${AWS_DEFAULT_REGION}" --job-name "${JOB_NAME}" --provider AWS_CODE_COMMIT --repository-name "${REPOS_NAME}" --branch-name "${ENV}" --folder "${JOB_NAME}"

AWS CLIを実行してジョブを更新します。
必要な環境変数について、「AWS_DEFAULT_REGION」はCodeBuild標準の変数で、それ以外はCodePipelineから渡します。
「デプロイ先のジョブ名 = CodeCommitのパス名」になるので事故防止の目的で「JOB_NAME」は使いまわすようにしています。
ビルド用のIAMRoleにはCodeCommitの参照やGlueの更新、IAMのPassRoleなどの権限を付与しておきます。

パイプライン作成

以下Pipeline V2を想定します。
トリガーをEventBridgeにするのですが、現時点ではCodeCommitのパスまでをEventBridge側の条件に設けることは出来ないようで、
対象のリポジトリの対象のブランチ、というところまでを指定します。
Glueジョブ事にリポジトリを分けずにパスで分けるのがバージョンコントロール側の想定だと思うのでちょっと要件とマッチしていなさはありますが今回は我慢します。

EventBridgeのイベントパターンは以下になります(パイプラインをコンソールから作ればCodeCommitの指定時に勝手に設定してくれます)。

{
  "source": ["aws.codecommit"],
  "detail-type": ["CodeCommit Repository State Change"],
  "resources": ["arn:aws:codecommit:{リージョン}:{アカウントID}:{リポジトリ名}"],
  "detail": {
    "event": ["referenceCreated", "referenceUpdated"],
    "referenceType": ["branch"],
    "referenceName": ["{ブランチ名}"]
  }
}

ブランチは「main」で作りました。

CodeCommitを設定したら次はCodeBuildの設定をします。
CodeBuildも作ったものを設定すれば良いですが、環境変数をCodePipelineから渡す必要があります。

先ほどのbuildspecで必要な環境変数は以下です。

JOB_NAME: Glueジョブ名
REPOS_NAME: リポジトリ名
ENV: ブランチ名

それぞれ以下で設定しました。

JOB_NAME: #{variables.JOB_NAME}
REPOS_NAME: #{SourceVariables.RepositoryName}
ENV: #{SourceVariables.BranchName}

「SourceVariables」はCodeCommitの出力変数の名前空間ですね。
「REPOS_NAME」と「ENV(ブランチ名)」はCodeCommitから取ってくるようにしています。

JOB_NAMEについてはCodePipeline自体の環境変数に設定します。
CodePipelineの環境変数は「variables」に入るのでそこから参照します。

このあたりの変数についての記載は以下のドキュメントに記載があります。
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/reference-variables.html

そんな感じで保存したらパイプラインも完成です。

今回はソース用のCodeCommitとデプロイ用のCodeBuildだけを設定しています。
この2つだけなら別にCodePipelineは使わなくてもいいかなーって感じですが間にテストとかも含めるならあった方がいいですね。

以上で動くようになりました。
CodeCommitにプッシュしてみます。

パイプラインは問題なく成功しましたのでジョブを確認していきます。

実行前

実行後

ジョブに変更が反映されました。

おわりに

もっといい方法はありそうな気がしますがCodeCommitからCI/CDできるようにしました!
以上、最後までお付き合いありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA