AWS CDK を触ってみよう

AWS CDK を触ってみよう

はじめに

現在私が参画している案件では AWS CDK を利用して環境構築をしています。具体的には以下の図のように多数の AWS テクノロジーを使用していますが、すべて CDK を利用して自動デプロイしています。

この記事では CDK を使ってみて感じたことや、実際に CDK のコードを書いて AWS 環境を構築する手順を紹介したいと思います。

AWS 環境の自動デプロイについて


AWS CDK について話す前に、まず AWS への自動デプロイ方法について軽く説明します。

通常、EC2 や RDS などの AWS リソースを作成する際には AWS マネジメントコンソールや AWS CLI などを使用して設定を行いますが、同じ環境を複数用意したり、構築しなおしたりしたい場合に毎回手作業で環境構築するのは手間がかかりますしミスも起きやすいです。

AWS CloudFormation を利用すれば、JSON や YAML 形式のファイルで定義された AWS リソースを自動でデプロイ(プロビジョニング)することができます。

また、AWS リソースだけでなく、アプリケーションのデプロイも可能です。たとえば EC2 に LAMP 環境を構築して PHP アプリケーションをデプロイするといったことができます。
(自動デプロイ方法は CloudFormation の他にもいくつかありますがここでは割愛します)

AWS Cloud Development Kit (AWS CDK) とは

AWS CDK とは、平たく言うとコードでインフラを定義することができるツールです。

CloudFormation では JSON/YAML ファイルで AWS リソースやアプリケーションを定義するのに対し、AWS CDK ではプログラミング言語(TypeScript、JavaScript、Python、Java、C#/.NET)を使用して定義することができます。CDK で書いたコードは CloudFormation を通じてデプロイされる仕組みになっています。

AWS CDK のメリット

AWS CDK のメリット・デメリットについては公式サイトを含め、すでに多数の記事が世に出ていますが、私が実際に使ってみて感じたメリット・デメリットについて記載します。

開発者がインフラを構築しやすい

私が過去に経験した案件では CloudFormation テンプレート の作成はインフラチームにお願いしていました。出来上がった YAML ファイル は 1000行を超えることもあり、開発者が見ても何を定義してあるのか理解できなかったため、リソースの修正や追加などは都度インフラチームにお願いしていました。

AWS CDK の導入によって使い慣れたプログラミング言語を使用して環境を作成できるようになり、リソースの追加や修正もすべて開発チームができるようになりました。現在の案件では、初期の環境構築だけでなく、開発していく中で S3 のバケットを追加したり、Cognito のユーザプールを追加したりする必要が出てきましたが、すべて開発者が CDK を利用してリソースを追加しました。環境だけでなく、Lambda 関数などのアプリケーションの追加も CDK で自動デプロイしています。

CloudFormation の JSON ファイルと比べてコード量が少なく、読みやすい点も開発者にとってはメリットかと思います。

同じ環境を複数準備しやすい

これは CDK だけに言えることではありませんが、同じ環境を複数作成することが容易にできます。

現在の案件では同じ環境を複数作成する必要がありますが、1つの本番環境を半日で作成することができます。また、手作業がほとんどないためミスもほぼありません。

AWS CDK のデメリット

学習コストがかかる

CloudFormation ほどではないと思いますが、AWS CDK のソースコードを書くにはインフラの知識も必要になるため、ある程度の学習コストがかかると思います。

私は AWS については S3 や EC2, RDS といった最低限の経験しかなく、Cognito や Lambda, SQS など初めて経験するリソースが多かったため、CDK の書き方以前にそれらの勉強をする必要がありました。

また、AWS CDK は2019年に正式リリースされていますが、やりたいことをネットで調べても CDK の書き方についての記事が少なく、公式ドキュメントも個人的には見辛いので、初めての場合は特にコードを書くのに時間がかかると感じました。

CDK を触ってみよう

ここからは実際に AWS CDK を触ってみたいと思います。

今回やること

AWS CDK を利用して AWS 環境に S3 のバケットを作成する

前提

  • 今回は Mac OSX で作業する前提で進めます
  • AWS アカウントを準備しておきましょう
  • サンプルソースは TypeScript で記載します

開発環境準備

Node.jsのインストール

こちら からNode.jsをインストールしておきます。

AWS CLI のインストール

まずは AWS CLI バージョン 2 をインストールします。

※ AWS CLI (AWS Command Line Interface) は、コマンドラインシェルでコマンドを使用して AWS サービスとやり取りするためのオープンソースツールです。

公式ドキュメントを参考にインストールします。

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

インストールできたらバージョンを確認しておきます。

$ aws --version
aws-cli/2.4.6 Python/3.8.8 Darwin/17.7.0 exe/x86_64 prompt/off

AWS CLI の設定

aws コマンドを使うために認証情報などの設定をしておきます。 詳細について知りたい方は こちらを参照してください。

以下のアクセスキーなどの値はサンプルです。事前に IAM コンソールでユーザーを作成してアクセスキーとシークレットアクセスキーを取得しておきます。作成方法の詳細はこちら

$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE ←アクセスキー
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY ←シークレットアクセスキー
Default region name [None]: ap-northeast-1 ←リージョン(この例は東京)
Default output format [None]: json ←出力形式


作成したユーザには以下のポリシーを付与しておきます。

  • AWSCloudFormationFullAccess
  • AmazonS3FullAccess

AWS CDK のインストール

npm install -g aws-cdk

AWS CDK アプリケーションの作成

ここまでで CDK アプリケーションを作成する準備が整いました。

ここからは実際に AWS CDK アプリケーションを作成していきます。
今回は公式サイトのチュートリアルを参考に AWS 環境に S3 のバケットを作成してみます。

ディレクトリの作成

mkdir hello-cdk
cd hello-cdk

CDK アプリケーションの初期化

今回は TypeScript を使用します。

cdk init app --language typescript

以下のようなパッケージ構成が出来上がります

  • /bin/hello-cdk.ts
    • package.json の bin に指定することで、こちらのソースコードが起点となってビルドされます
  • /lib/hello-cdk-stack.ts
    • こちらで定義した Stack クラスを hello-cdk.ts から初期化して参照しています

S3 のバケットを操作するためのライブラリをインストールする

npm install @aws-cdk/aws-s3

CDK コードを書く

実際に S3 のバケットを作成するコードを書いてみましょう

初期作成されたファイルでは aws-cdk-lib を使用していますが、今回は S3 を操作したいので @aws-cdk/core ライブラリを使用するように修正します。

ファイル:/bin/hello-cdk.ts

import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { HelloCdkStack } from '../lib/hello-cdk-stack';

const app = new cdk.App();
new HelloCdkStack(app, 'HelloCdkStack', {});

ファイル:/lib/hello-cdk-stack.ts

import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';

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

    new s3.Bucket(this, 'MyFirstBucket', {
      // バケット名を指定しない場合はstack名_バケットID+乱数のバケットができます
      // バケット名はグローバルでユニークにする必要があるのでここではタイムスタンプを付けています
      bucketName: 'my-first-bucket-20211231190700',
    });
  }
}

ビルド確認

ビルドできるかどうか確認しておきます

npm run build

ビルドが成功すると cdk.out というディレクトリが作成され、その下に CloudFormation テンプレートが出力されます。

CloudFormation テンプレート確認

cdk synth コマンドで CloudFormation にデプロイされるテンプレートの内容を確認することができます。

cdk synth

以下のような結果が出力されます。

Resources:
  MyFirstBucketB8884501:
    Type: AWS::S3::Bucket
    Properties:
      VersioningConfiguration:
        Status: Enabled
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Metadata:
      aws:cdk:path: HelloCdkStack/MyFirstBucket/Resource
      ...

デプロイ

では、AWS 環境にデプロイしてみましょう

cdk deploy

途中経過

完了

CloudFormation スタック確認

デプロイが完了したらまずは CloudFormation でスタックを確認してみましょう。

HelloCdkStack が作成されています。

HelloCdkStack をクリックし、テンプレートのタブを開くと、先ほど cdk synth で確認した CloudFormation のテンプレートが表示されています。

S3 確認

それでは実際に S3 バケットができているか確認してみます。

指定したバケットができていますね!

CDK アプリケーションの作成については以上です。

最後に

いかがでしたでしょうか?

Infrastructure as Code(IaC) のツールとしては他に Terraform を使用している方も多いかと思います。前述した他にも CDK にはメリット・デメリットがあり、案件の状況や環境によって使い分けできると良いと思います。

これを読んだ開発者の方が AWS CDK に興味を持って頂けたら幸いです。

採用情報

メンバーズエッジで最高のチームで最高のプロダクトを作りませんか?

最高のプロダクトをつくる 最高のチームで働く

在宅でも、地方でも、首都圏でも。多様な働き方で最高のチームをつくり、お客様のプロダクトパートナーを目指します。アジャイル開発を通じ、開発現場の第一線で活躍し続けたいエンジニアを募集しています。