DEA / ドメイン1 データの取り込みと変換
IaC (CloudFormation・CDK・SAM)
(Infrastructure as Code) は、 、 ジョブ、 関数、 のステートマシン、 ロールなどのリソースを、手作業ではなくコード (テンプレート) で定義してデプロイする考え方です。同じテンプレートから開発・検証・本番の環境を何度でも同じ形で作れます。
DEA では、、、 の役割の違いと、のデータパイプラインを SAM でパッケージ化してデプロイする流れが問われます。
Point
- IaC = Infrastructure as Code (コードとしてのインフラストラクチャ) の略です。
- CDK = Cloud Development Kit の略で、Python や TypeScript などのプログラミング言語でインフラを書く道具です。
- SAM = Serverless Application Model の略で、サーバーレスのアプリケーションを短く書くための CloudFormation の拡張です。
- 和訳
- Provision: 用意する、供給する
- Weblio英和辞書「provision」
概要
3つの道具は、最終的にどれも のスタックとしてデプロイされます。違いは「何で書くか」です。
| 道具 | 書き方 | 向く場面 |
|---|---|---|
| CloudFormation | / で宣言的に書きます | すべての基本。リソースを明示的に定義したいとき |
| プログラミング言語で書き、CloudFormation テンプレートを生成します | ループや条件、共通部品の再利用でテンプレートを短くしたいとき | |
| CloudFormation に短い記法を足したテンプレートと SAM CLI | 、、 などの構成をまとめて作り、ローカルでも試したいとき |
試験では、「手作業の設定をやめ、環境ごとに同じ構成を再現したい」は 、「サーバーレスのデータパイプラインをパッケージ化してデプロイしたい」は SAM、を選びます。
主要技術
①CloudFormation のスタックと変更セット ⚠️ 頻出
は、テンプレートに書いたリソースをまとめて「スタック」として作成、更新、削除します。
| 機能 | 内容 | データパイプラインでの使い方 |
|---|---|---|
| パラメータ | デプロイ時に値を渡します | 環境名 (dev / prod)、名、ワーカー数を変えます。 |
| 変更セット | 更新の前に、どのリソースが追加・変更・置き換え・削除されるかを確かめます | 本番の ジョブや の設定変更を事前に確認します。 |
| ロールバック | 作成や更新に失敗したら元の状態に戻します | 途中まで作られた中途半端な環境を残しません。 |
| DeletionPolicy / UpdateReplacePolicy | スタックの削除やリソースの置き換えでデータを消さないようにします | バケットや のテーブルに Retain や Snapshot を指定します。 |
| 削除保護 (termination protection) | スタックそのものを削除できないようにします | 本番のスタックの誤削除を防ぎます。スタックを消しつつデータだけ残したい場合は DeletionPolicy を使います。 |
| ドリフトの検出 | テンプレートと実際の設定のずれを見つけます | 誰かがコンソールで手作業の変更をしていないか確かめます。 |
| StackSets | 複数のアカウントとに同じスタックを展開します | 各アカウントに同じログ用バケットを作ります。 |
| 出力 (Outputs) とエクスポート | 作ったリソースの値を他のスタックへ渡します | 共通のバケット名を別のスタックで参照します。 |
⚠️ 頻出: データを持つリソース (S3 バケット、DynamoDB のテーブル、) は、スタックの削除やリソースの置き換えでデータが消えないよう、DeletionPolicy を Retain (Snapshot に対応するものは Snapshot) にします。
②AWS CDK のコンストラクト
では、リソースを「コンストラクト」という部品として扱います。
| レベル | 内容 | 例 |
|---|---|---|
| L1 | のリソースと1対1の低レベルの部品 | CfnJob ( ジョブ) |
| L2 | 使いやすい既定値とメソッドを持つ部品 | Bucket。bucket.grantRead(role) で必要な ポリシーを自動で作ります。 |
| L3 (パターン) | 複数のリソースをまとめた構成 | 「キュー + 処理用の 」をまとめた部品 |
cdk synth で CloudFormation テンプレートを生成し、cdk diff で差分を確かめ、cdk deploy でデプロイします。プログラミング言語で書けるため、たとえば「10 個のテーブルごとに同じ形の Glue ジョブを作る」といった繰り返しをループで書けます。単体テストのフレームワークでテンプレートの中身をテストすることもできます。
③AWS SAM でサーバーレスパイプラインをデプロイ ⚠️ 頻出
テンプレートは、先頭に Transform: AWS::Serverless-2016-10-31 を書いた テンプレートです。用の短い記法のリソースが使えます。
| SAM のリソース | 作られるもの |
|---|---|
AWS::Serverless::Function | 関数、実行ロール、イベントソース (、、、スケジュールなど) |
AWS::Serverless::StateMachine | のステートマシンとロール |
AWS::Serverless::SimpleTable | 主キーだけを持つ簡単な テーブル |
AWS::Serverless::Api | の |
AWS::Serverless::LayerVersion | Lambda レイヤー |
SAM のポリシーテンプレート (例: S3ReadPolicy、DynamoDBCrudPolicy) を使うと、の ポリシーを短く書けます。DynamoDB の複雑な設定 ( など) が必要なら、同じテンプレートに通常の AWS::DynamoDB::Table を書けます。
SAM CLI の主なコマンドは次のとおりです。
| コマンド | 役割 |
|---|---|
sam build | 関数のコードと依存パッケージをビルドします。 |
sam local invoke | Lambda 関数をローカルので実行して試します。 |
sam package | コードを S3 にアップロードし、参照を書き換えたテンプレートを作ります (sam deploy が内部でも行います)。 |
sam deploy | CloudFormation の変更セットを作ってデプロイします。--guided で対話的に設定できます。 |
sam sync | 開発中の変更をクラウドへすばやく反映します。 |
⚠️ 頻出: 「Lambda 関数、Step Functions のワークフロー、DynamoDB テーブルから成るサーバーレスのデータパイプラインを、まとめてパッケージ化してデプロイしたい」は AWS SAM です。
SAM は CodeDeploy と組み込みで連携し、Lambda 関数を段階的にデプロイできます。関数に AutoPublishAlias (新しいバージョンを発行し、エイリアスをそれに向ける) と DeploymentPreference (Canary10Percent5Minutes や Linear10PercentEvery1Minute などの移し方、ロールバックのきっかけにする 、切り替え前後の検証用の関数) を書くと、トラフィックを少しずつ新しいバージョンへ移し、アラームが鳴れば自動で戻します。なお sam sync は開発中にすばやく反映するためのもので、本番の環境には sam deploy を使います。
④反復可能なデプロイの作り方
で同じ構成を何度でも再現するための工夫です。
| 工夫 | 内容 |
|---|---|
| 環境の差はパラメータで渡す | テンプレートは1つにし、環境名やサイズをパラメータで変えます。ハードコードを避けます。 |
| 名前は自動生成か、環境名を含める | 同じアカウントで複数の環境を作っても名前が衝突しないようにします。 |
| 機密情報はテンプレートに書かない | パスワードは や Parameter Store を参照します (動的参照)。 |
| テンプレートを Git で管理 | 変更の履歴とレビューを残し、 でデプロイします (#29)。 |
| 手作業の変更をしない | ドリフトを生まないよう、変更はテンプレート経由に限ります。 |
試験対策
①判断マトリクス
| 問題文のキーワード | 選ぶもの | 理由 |
|---|---|---|
| 手作業の構築をやめ、同じ環境を繰り返し作りたい | () | テンプレートから何度でも同じスタックを作れます。 |
| プログラミング言語でインフラを書き、部品を再利用したい | コンストラクトとループで定義を短くできます。 | |
| ・・ をまとめてパッケージ化・デプロイ | 向けの短い記法と SAM CLI があります。 | |
| Lambda をデプロイ前にローカルで試したい | sam local invoke | ローカルので実行できます。 |
| 本番の更新前に影響を確かめたい | 変更セット (CDK なら cdk diff) | 置き換えや削除が起きるかを事前に確認できます。 |
| スタックを消してもデータは残したい | DeletionPolicy: Retain / Snapshot | や DynamoDB のデータを保護します。 |
| 複数アカウント・に同じ構成 | CloudFormation StackSets | 一括で展開できます。 |
| コンソールでの手作業の変更を見つけたい | ドリフトの検出 | テンプレートとのずれを検出します。 |
②よくある誤答
- と を別物と考えること。SAM は CloudFormation の拡張で、デプロイは CloudFormation のスタックとして行われます。
- でデプロイすると CloudFormation を使わないと考えること。CDK は CloudFormation テンプレートを生成してデプロイします。
- テンプレートにデータベースのパスワードを直接書くこと。 などを参照します。