AWSリソースをコードを利用して作成する方法はいくつかあります。IaCツールとしては、CloudFormationやTerraform、Ansible、Pulumiが有名ですよね。
しかし、わたしは上記以外の方法である、AWS CDK (Amazon Web Services Cloud Development Kit)について学び始めました。
今回の記事はAWS CDKについて基本を押さえるために知っておくべきことをまとめた内容です。
後編である「AWS CDKはじめました【実践編】」では、実際にAWS CDKを触るハンズオンを紹介していますので、合わせて読んでみてください。
AWS Cloud Development Kitについて調べてみた
AWS CDKはAWS CloudFormationクラウドインフラストラクチャをコードで定義し、それをプロビジョニングするためのオープンソースのソフトウェア開発フレームワークです。
"AWS CloudFormationでいいじゃないか"と思われる方もいるかと思いますが、AWS CDKの柔軟性や利便性、テストの容易さはAWS CloudFormationとは段違いです。そんなAWS CDKについて知ってもらうために、特徴をひとつひとつ見ていきましょう。
■AWS CDKとは
AWS CDK (Amazon Web Services Cloud Development Kit) は、AWSリソースをソフトウェアとして定義するためのオープンソースのソフトウェア開発フレームワークです。
開発者はAWSリソースを設定し、プロビジョニングするためのコードを書くことができます。CDKを使用すると、インフラストラクチャをコードとして扱うこと(IaC)ができるため、バージョン管理、コードレビュー、自動化されたテストなどのソフトウェア開発のベストプラクティスをインフラストラクチャの管理に適用できます。
また、AWS CDKは、TypeScript、JavaScript、Python、Java、C#など複数のプログラミング言語をサポートしています。開発者はこれらの言語の中から自身が普段使っている言語を使用して、AWSリソースを定義するスタックを記述できます。CDKはこれらの定義をCloudFormationテンプレートに変換し、AWS CloudFormationを使用してリソースをデプロイします。
■AWS CDKのメリットは?
先述したとおり、AWSリソースを作成するIaCツールは複数あります。その中からAWS CDKを使用するメリットについて説明します。
メリット①開発言語の豊富さ
AWS CDKは、TypeScript、JavaScript、Python、Java、C#など、複数のプログラミング言語をサポートしています。これにより、開発者は自身が普段使っている言語でインフラストラクチャを定義できます。日本ではTypeScriptを使ったブログ記事が多い印象ですね。
詳しくはこちら
メリット②抽象化レベルの高さ
AWS CDKは、AWSリソースの宣言的な抽象化を提供します。これにより、開発者は低レベルの詳細について心配することなく、アプリケーションのインフラストラクチャを簡単に定義し、デプロイできます。S3バケットを作成する場合、手動だと複数の項目を入力する必要がありますが、AWS CDKの場合は以下のコードで作成可能です。
import aws_cdk as cdk
import aws_cdk.aws_s3 as s3
class S3Stack(cdk.Stack):
def __init__(self, scope: cdk.App, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
bucket = s3.Bucket(self, "MyBucket", versioned=True)
詳しくはこちら
メリット③コードによるインフラストラクチャ管理
インフラストラクチャをコードとして扱うことで、バージョン管理、コードレビュー、自動テストなどのソフトウェア開発プラクティスをインフラストラクチャの構築に適用できます。これにより、エラーの発生を減らし、デプロイメントの信頼性を高めることができます。インフラ観点で見ると、単体テストが楽になるのは魅力的ですよね。事前にテストコードを用意しておけば、各フェーズですぐにテストが可能です。
import aws_cdk as cdk
from aws_cdk import assertions
from my_cdk_app.s3_stack import S3Stack
def test_s3_bucket_created():
app = cdk.App()
stack = S3Stack(app, "S3Stack")
template = assertions.Template.from_stack(stack)
template.has_resource_properties("AWS::S3::Bucket", {
"DeletionPolicy": "Retain"
})
詳しくはこちら
メリット④再利用可能なコンポーネント
AWS CDKでは、カスタムコンストラクトを作成して、複数のプロジェクト間で再利用することができます。これにより、開発の効率化が図れ、一貫性のあるインフラストラクチャパターンの実装が容易になります。
詳しくはこちら
メリット⑤統合された環境
AWS CDKはAWS CloudFormationに密接に統合されており、CDKで定義したインフラストラクチャはCloudFormationテンプレートに変換されてデプロイされます。これにより、AWSの広範なサービスとリソースを効率的に利用できます。CloudFormationで作成できるものはほとんど作成できますね。
詳しくはこちら
■AWS CDKのユースケースは?
AWS CDKを利用する一般的なユースケースを紹介します。
ユースケース1: ウェブアプリケーションの自動デプロイメントとスケーリング
【概要】
多くの企業では、ウェブアプリケーションのデプロイメントとスケーリングの自動化が重要な課題です。AWS CDKを使用すると、EC2インスタンス、オートスケーリンググループ、ロードバランサー、および関連するセキュリティグループをプログラム的に定義し、デプロイすることができます。
【具体的なタスク】
- EC2インスタンスで実行されるウェブサーバーの設定。
- トラフィックの増加に基づいてインスタンスを自動的にスケールアップおよびダウンするオートスケーリンググループの設定。
- アプリケーションへのトラフィックのバランスをとるロードバランサーの設定。
- これらのリソースに適用されるセキュリティグループとIAMポリシーの定義。
ユースケース2: サーバーレスイベント駆動アーキテクチャ
【概要】
サーバーレスアーキテクチャは、コードの実行に必要なサーバー管理から開発者を解放します。AWS CDKを使用して、AWS Lambda関数、Amazon S3バケット、Amazon DynamoDBテーブル、およびそれらの間のイベント通信を設定する完全なサーバーレスアーキテクチャを構築できます。
【具体的なタスク】
- ユーザーがファイルをアップロードするたびにトリガーされるLambda関数を持つS3バケットの設定。
- Lambda関数が処理を行い、結果をDynamoDBテーブルに保存する。
- イベント通知を設定して、特定のアクションが発生した際に別のサービスやチームに通知する。
後編である「AWS CDKはじめました【実践編】」では、ユースケース2を想定したハンズオンを紹介していますので、合わせて読んでみてください。
また、AWSがgithubにCDKサンプルコードの公式リストを公開しています。自身のケースにあったコードがあるかもしれませんので、ぜひ見てみてください。
■AWS CDKで知っておくべき用語
AWS CDKを使う上で、知っておくべき用語があります。代表的な用語を7つ紹介します。
用語①Construct
Constructは、AWS CDKの基本的なビルディングブロックです。AWSのリソース(例えば、S3バケットやLambda関数など)を表すクラスで、これらを組み合わせてクラウドアプリケーションを定義します。Constructは、単一のリソースから複数リソースを含む複雑なコンポーネントまで、さまざまな粒度で作成されます。 –Constructsより
用語②Stack
Stackは、一連の関連するAWSリソース(Constructの集まり)をグループ化するためのコンテナです。CDKアプリケーションは一つ以上のStackを含むことができ、各StackはCloudFormationスタックとしてデプロイされます。この構造により、リソースの管理とデプロイメントが容易になります。 –Working with stacksyori
用語③App
Appは、一つ以上のStackを含む最上位レベルのコンポーネントです。CDKアプリケーション全体を初期化し、実行するためのエントリーポイントとして機能します。通常、アプリケーションの実行可能ファイルにはAppインスタンスの作成と起動が含まれています。 –AWS CDK appsより
用語④Synthesize(synth)
Synthesizeは、CDKアプリケーションの構成からCloudFormationテンプレートを生成するプロセスです。CDKアプリケーションをデプロイする前に、CDKコードからCloudFormationのJSONまたはYAML形式のテンプレートを作成する必要があります。
用語⑤CDK Toolkit
CDK Toolkitは、CDKアプリケーションを管理するためのコマンドラインツールセットです。このツールキットを使用すると、CDKアプリケーションの初期化、テンプレートの合成、デプロイ、リソースの削除などが行えます。 –AWS CDK Toolkit (cdk command)より
用語⑥Assets
Assetsは、CDKアプリケーションで使用される外部ファイルやリソースを指します。これには、Lambda関数のコード、Dockerイメージ、静的ファイルなどが含まれます。CDKはこれらのアセットを適切に処理し、必要なAWSリソースに関連付けます。 –Assetsより
用語⑦Context
Contextは、CDKアプリケーションが実行時に利用できる環境固有の情報(キーと値のペア)を提供します。例えば、リージョンやアカウントIDなどのAWSの環境設定、外部からのパラメータ値などが含まれます。CDK Toolkit は、コンテキストを使用して、合成中に AWS アカウントから取得した値をキャッシュします。コンテキストキャッシュを使用しない場合、デプロイするときに予期しないものや望ましくないものになる可能性があります。 –Contextより
■AWS CDKを選択する基準は?
AWSリソースを作成するIaCツールが複数ある中で、AWS CDKを選ぶ基準について紹介します。状況によっては他のIaCツールを利用したほうがプロジェクトに合っている場合があります。
基準①技術スタックの一貫性
プロジェクトや組織で既に使用している技術やツールとの一貫性を考えると、選択に大きな影響を与えます。プロジェクトの要件や技術の将来性とサポートも考慮事項です。
基準②チームのスキルセット
チームメンバーが既にPythonやJavaScriptなどの言語に精通している場合、CDKが開発者の学習コストを低減し、迅速な採用を可能にします。
基準③クロスプラットフォームの要件
もしマルチクラウド環境でのデプロイメントや異なるクラウドプロバイダー間でのリソース管理が必要な場合、Terraformが最適です。Terraformはそのクロスプラットフォーム対応によって、異なるクラウドプラットフォーム間での統一された操作を実現しているからですね。
基準④プロジェクトの複雑性と規模
より複雑で動的なインフラストラクチャ要件がある場合、AWS CDKのプログラミング言語を使用したアプローチが強力です。プログラミング言語を使用することで、より複雑なロジックの組み込みや条件分岐が容易になります。しかし、プロジェクトの規模が小さい場合や単純なデプロイメントであれば、TerraformやCloudFormationの方が手軽かつ迅速に対応可能です。
基準⑤セキュリティとコンプライアンスの要件
Terraformでは、stateファイルがインフラの現状を記録しており、これをセキュリティの観点から適切に管理する必要があります。一方、AWS CDKはAWS CloudFormationのテンプレートを生成するため、AWSのセキュリティモデルと緊密に統合されています。セキュリティ要件が厳格な場合、AWS CDKはその要件を他のIaCツールより満たすかもしれません。
基準⑥開発と運用のフィードバックループ
これが最大の利点かもしれないのですが、AWS CDKはAWSサービスとの直接的な統合が進んでいるため、AWS環境での開発者体験が向上します。特に、AWSの新しいサービスや機能が迅速にCDKに反映されるため、常に最新のAWS機能を活用できる利点があります。
一方、TerraformやAnsibleは多くのプロバイダーをサポートしているため、新しい機能のサポートには時間がかかる場合があります。は多くのプロバイダーをサポートしているため、新しい機能のサポートには時間がかかる場合があります。
選定基準となる要素を6つ紹介しました。ほかにも考慮しなければいけいない事項がありますので、AWS CDKのベストプラクティスも併せて確認することをオススメします。
まとめ
わたしは現プロジェクトでAWS CDKを使うことになったので、調べたことをザっとまとめてみました。
正直IaCツールの中でAWS CDKを使っている人の割合が小さい印象があり、ブログ記事も他のツールに比べ少ないです。
しかし、AWSリソースを作成するという点では、AWS CDKは他のツールと比べて抜きんでていると思います。AWS CDKに興味がある方はぜひ、後編である「AWS CDKはじめました【実践編】」を通して、AWS CDKがどういったものかをつかんでほしいです。
参考リンク: AWS公式ドキュメント
↓ほかの協栄情報メンバーもEBSについての記事を公開しています。ぜひ参考にしてみてください。
■【AWS CDK】3分でつかむ、ライブラリとしてのAWS CDK(tanaka.h)