DEA / ドメイン1 データの取り込みと変換

データパイプラインの CI/CD とソフトウェア工学

データパイプラインも、アプリケーションと同じくコードです。 ジョブのスクリプト、、 の定義、 のテンプレートを、バージョン管理、テスト、ログ記録、といったソフトウェア工学の習慣で扱うと、変更を安全に、何度でも同じ手順で本番へ届けられます。

DEA では、ソフトウェアエンジニアリングのベストプラクティスをデータエンジニアリングに当てはめること、そして (データパイプラインの実装、テスト、デプロイ) を説明できることが問われます。

Point
  • CI = Continuous Integration (継続的インテグレーション) です。変更をこまめに統合し、そのたびに自動でビルドとテストを行います。
  • CD = Continuous Delivery / Deployment (継続的デリバリー / デプロイ) です。テストを通った変更を、自動で (または承認を経て) 本番へ届けます。
  • 和訳

概要

データパイプラインの は、コードの変更をきっかけに、ビルド、テスト、デプロイを自動で流す仕組みです。

概要の図 開発者Git にプッシュ ソースGit リポジトリ ビルドとテストCodeBuild単体テスト・データのテスト 検証環境へデプロイCloudFormation / SAM 手動の承認 本番環境へデプロイ CloudWatch で監視
段階AWS のサービス内容
ソースGit リポジトリ (GitHub などを AWS CodeConnections で接続、または AWS CodeCommit)コードとテンプレートの版を管理します。
ソース → ビルド → デプロイの各段階を順に自動で流します。
ビルドとテストbuildspec.yml に従って、依存の導入、テスト、パッケージ化を実行します。
デプロイ / / 、AWS CodeDeployインフラと などをデプロイします。

主要技術

①バージョン管理

の スクリプト、 ファイル、、ステートマシンの定義、 テンプレートは、すべて Git で管理します。

習慣内容効果
ブランチとプルリクエスト機能ごとにブランチを作り、レビューを経てメインに統合します誤りを本番前に見つけます。
コードとインフラを同じリポジトリで管理Glue スクリプトと、それを動かす Glue ジョブの定義を一緒に管理しますどの版のコードがどの設定で動くかがそろいます。
タグとリリース本番に出した版にタグを付けます問題が出たら前の版へ戻せます。
大きなデータは Git に入れないデータそのものは に置き、Git にはコードと設定だけを入れますリポジトリが重くなりません。S3 のでデータの版を管理します。

Glue Studio のジョブは、Git リポジトリ (GitHub、GitLab、Bitbucket、AWS CodeCommit) と連携してスクリプトをプッシュ・プルできます。

よく使う Git の操作は次のとおりです。

操作内容使いどころ
git clone / git pullリポジトリを手元に複製する / 最新の変更を取り込む作業を始める前に最新にそろえます。
git branch / git switchブランチを作る / 切り替える機能ごとに作業を分け、メインを壊しません。
git commit / git push変更を記録する / 共有のリポジトリへ送る小さな単位で記録し、プルリクエストでレビューを受けます。
git merge別のブランチの変更を統合するレビュー済みのブランチをメインに取り込みます。
git revert指定したコミットを打ち消す新しいコミットを作る共有済みの履歴を書き換えずに、誤った変更を取り消します。
git resetブランチの先端を過去のコミットへ戻すまだ共有していない手元の変更のやり直しに使います。共有済みの履歴に使って強制プッシュすると、他の人の履歴と食い違います。
git tagコミットに名前 (例: v1.4.0) を付ける本番に出した版を示し、戻す先を明確にします。
.gitignoreGit で管理しないファイルを指定する認証情報のファイルや、ローカルで作った大きなデータを誤ってコミットしないようにします。

②テスト ⚠️ 頻出

データパイプラインのテストは、コードのテストとデータのテストの2つに分けて考えます。

テストの種類確かめること例
単体テスト変換の関数が正しい結果を返すか小さな入力データを用意し、日付の変換や重複除去の関数を pytest で検証します。
結合テストサービスをつないだときに動くか検証環境で ジョブを実行し、出力のテーブルを で確かめます。
データのテスト (品質チェック)実データが期待どおりか必須の列が空でないか、件数が急減していないかを のルールで確かめます (#57)。
スキーマのテスト列の追加や型の変更で下流が壊れないか期待するスキーマと比べます。
のテストテンプレートが正しいかcfn-lint での検査、 のアサーションでのテスト、変更セットの確認

Glue ジョブは、Glue のイメージやインタラクティブセッションを使って、ローカルや開発環境でテストできます。 は sam local invoke でローカルで試せます。


③CodePipeline・CodeBuild・CodeDeploy

サービス役割データパイプラインでの使い方
パイプライン全体の流れを定義し、段階を順に実行しますGit へのプッシュをきっかけに、テストと各環境へのデプロイを自動で流します。手動の承認アクションを本番の前に入れられます。
マネージドのビルド環境でコマンドを実行しますbuildspec.yml で、Python の依存の導入、pytest の実行、 のビルド、 スクリプトの へのアップロードを行います。
CodeDeployアプリケーションのデプロイを段階的に行います 関数の新しい版へ、トラフィックを段階的 (カナリア、線形) に移し、 のが鳴ったら自動で戻します。

デプロイの方法としては、 (SAM・ を含む) のアクションで、スタックを環境ごとに更新するのが基本です。

Point
  • Canary (カナリア) デプロイは、まず一部 (例: 10%) のトラフィックだけを新しい版に流し、問題がなければ残りを移す方法です。炭鉱でカナリアを先に入れて安全を確かめた故事に由来します。
  • Linear (線形) デプロイは、一定の間隔で一定の割合ずつ移す方法です。

④ログ記録とモニタリングを組み込む

本番のパイプラインが「静かに失敗する」のを防ぐため、ログとを最初から組み込みます。

習慣内容
構造化ログ 形式で、ジョブ名、実行 ID、処理件数、エラーを出力します。 で検索しやすくなります (#63)。
処理件数の読み込んだ件数と書き込んだ件数をカスタムメトリクスとして送り、急減をで知らせます。
失敗の通知ジョブの失敗を で受け、 で通知します。
デプロイ後の確認デプロイ後にスモークテスト (小さなデータで実行) を行います。
監査誰がいつデプロイしたかは、 の実行履歴と で追跡します。

試験対策

①判断マトリクス

問題文のキーワード選ぶもの理由
Git へのプッシュで、テストとデプロイを自動化 + ソースからデプロイまでを自動で流します。
本番へ出す前に人の確認を入れたいCodePipeline の手動承認アクション承認されるまで次の段階を止めます。
変換ロジックが正しいかをデプロイ前に確かめたい単体テスト (CodeBuild で pytest など)小さな入力で関数を検証します。
実データの品質を本番の処理中に確かめたいデータのテスト ()件数や空欄などを毎回の実行で検査します。
の新しい版を少しずつ本番に出したいCodeDeploy のカナリア / 線形デプロイ問題があればで自動的に戻します。
インフラの変更もレビューと履歴を残したい を Git で管理し、パイプラインでデプロイ手作業の変更をなくします。

②よくある誤答

  • 本番の ジョブのスクリプトをコンソールで直接編集すること。版の管理とレビューが失われます。
  • データの品質の検査を単体テストだけで済ませること。実データの変化は本番の処理中のチェックで見つけます。
  • 大きなデータファイルを Git に入れること。データは に置き、版は S3 ので管理します。

参考文献

  1. ※1出題比率: AWS 公式の試験ガイドに記載された、採点対象の設問のうちその分野が占める割合です。

検索

キーワードを入力してください