🧑‍💻

#116 AWS CDKを使ってIaCしてみた①

に公開

はじめに

今回は、AWS CDK(Cloud Development Kit)を使ってインフラストラクチャをコードで管理する(Infrastructure as Code: IaC)方法についてご紹介します。TerraformやAWS CloudFormationに触れたことがある方には、CDKの考え方が馴染みやすいかもしれません。CDKを使うと、インフラの定義を一般的なプログラミング言語(TypeScript、Python、Java、C#など)で記述できるため、開発者にとっては非常に扱いやすいツールです。

AWS CDKとは?

AWS CDKは、クラウドリソースをプログラムコードで定義・管理するためのツールです。従来のAWS CloudFormationでは、YAMLやJSONで記述する必要がありましたが、CDKを使うことで、例えばTypeScriptやPythonなど、より柔軟で強力なプログラミング言語を使ってリソースを定義できるようになります。
CDKは、これらのコードをAWS CloudFormationテンプレートに変換し、AWSにデプロイすることができます。そのため、CloudFormationの強力な機能を活かしながら、より開発者フレンドリーな方法でインフラ管理ができるのが特徴です。

AWS CDKの基本的な操作

AWS CDKの基本操作は大きく以下の流れで進めます。
・CDKのインストール
・CDKプロジェクトの作成
・リソースの定義
・デプロイ

1. CDKのインストール

AWS CDKを使うには、まずCLI(コマンドラインインターフェース)ツールをインストールする必要があります。以下のコマンドでインストールできます。

Terminal
npm install -g aws-cdk
cdk --version

これで、cdkコマンドが使えるようになります。次に、AWS CLIがセットアップされていることを確認し、AWSのクレデンシャルを設定しておきます。

2. CDKプロジェクトの作成

CDKプロジェクトは、cdk initコマンドを使って作成します。たとえば、TypeScriptプロジェクトを作成する場合は以下のコマンドを実行します。

Terminal
mkdir my-cdk-app
cd my-cdk-app
cdk init app --language typescript

このコマンドで、CDK用の基本的なファイルやフォルダが生成されます。今回注目すべきファルダは”lib”フォルダで、スタック定義を格納するディレクトリになります。このディレクトリ配下に作成したAWSリソースの定義ファイルを作成します。

3. リソースの定義

次に実際にリソースを定義します。CDKでは、スタック(Stack)という単位でリソースを管理します。Libディレクトリ配下に“aws-cdk-stack.ts”というファイルがあります。それを以下のように書き換えてCDKでS3バケットを作ってみましょう!

TypeScript
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

export class AwsCdkStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // S3バケットの作成
    new s3.Bucket(this, 'MyFirstS3BukcetForCDKStudy2024', {
      versioned: true,
    });
  }
}

ここでは、aws-cdk-libのBucketクラスを使って、バージョニングが有効なS3バケットを作成しています。

4. デプロイ

リソースの定義が完了したら、デプロイを行います。まず、cdk synthコマンドを使ってCloudFormationテンプレートを生成します。cdk.outというフォルダが自動で生成されAWSリソースを作成するためのCloudformationファイルが出力されます。

Terminal
cdk synth

次に、デプロイコマンドを実行して、実際にAWSにリソースを作成します。

Terminal
cdk deploy    

✨  Synthesis time: 13.2s

AwsCdkStack: start: Building a085cf876a23d885f73c2193b3a64ec47eaa5ccf299213dd9dcc8358091b4ffc:current_account-current_region
AwsCdkStack: success: Built a085cf876a23d885f73c2193b3a64ec47eaa5ccf299213dd9dcc8358091b4ffc:current_account-current_region
AwsCdkStack: start: Publishing a085cf876a23d885f73c2193b3a64ec47eaa5ccf299213dd9dcc8358091b4ffc:current_account-current_region
AwsCdkStack: success: Published a085cf876a23d885f73c2193b3a64ec47eaa5ccf299213dd9dcc8358091b4ffc:current_account-current_region
AwsCdkStack: deploying... [1/1]
AwsCdkStack: creating CloudFormation changeset...
AwsCdkStack | 0/3 | 19:29:59 | REVIEW_IN_PROGRESS   | AWS::CloudFormation::Stack | AwsCdkStack User Initiated
AwsCdkStack | 0/3 | 19:30:05 | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack | AwsCdkStack User Initiated
AwsCdkStack | 0/3 | 19:30:07 | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata/Default (CDKMetadata)
AwsCdkStack | 0/3 | 19:30:07 | CREATE_IN_PROGRESS   | AWS::S3::Bucket    | MyFirstS3BukcetForCDKStudy2024 (MyFirstS3BukcetForCDKStudy2024C7F0F781)
AwsCdkStack | 0/3 | 19:30:08 | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata/Default (CDKMetadata) Resource creation Initiated
AwsCdkStack | 1/3 | 19:30:08 | CREATE_COMPLETE      | AWS::CDK::Metadata | CDKMetadata/Default (CDKMetadata)
AwsCdkStack | 1/3 | 19:30:08 | CREATE_IN_PROGRESS   | AWS::S3::Bucket    | MyFirstS3BukcetForCDKStudy2024 (MyFirstS3BukcetForCDKStudy2024C7F0F781) Resource creation Initiated
AwsCdkStack | 2/3 | 19:30:22 | CREATE_COMPLETE      | AWS::S3::Bucket    | MyFirstS3BukcetForCDKStudy2024 (MyFirstS3BukcetForCDKStudy2024C7F0F781) 
AwsCdkStack | 3/3 | 19:30:23 | CREATE_COMPLETE      | AWS::CloudFormation::Stack | AwsCdkStack 

 ✅  AwsCdkStack

✨  Deployment time: 30.91s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:000000000000000:stack/AwsCdkStack/e59721c0-a4ce-11ef-b6da-0ef49295c121

✨  Total time: 44.11s

これで、定義したリソースがAWSにデプロイされました。


今回作成したS3バケットは不要なので、削除しておきます。

Terminal
cdk destroy

AWS CDKのメリット

AWS CDKを使うと、以下のようなメリットがあります。
• プログラムコードでの定義: CDKはTypeScriptやPythonなどの一般的なプログラミング言語を使用してリソースを定義できるため、ロジックやループ、条件分岐などの柔軟な処理が可能です。
• 再利用性: 関数やクラスを使って、定義したリソースを再利用しやすくなります。大規模なインフラを構築する際に非常に有用です。
• 自動の依存関係管理: CDKはリソース間の依存関係を自動的に処理します。これにより、手動で依存関係を管理する手間が省けます。

まとめ

今回はAWS CDKを使った基本的な操作を紹介しました。CDKは、プログラミングに馴染みのある方にとっては非常に使いやすいツールであり、クラウドインフラをより効率的に管理できる強力な手段です。今後さらに複雑な構成やマルチスタックの管理もできるようになるので、ぜひ試してみてください!

次回は、さらに高度なCDKの使い方や、他のAWSサービスとの連携方法についてご紹介したいと思います。

Discussion