Engineer Blogs

No Tech No Life

AWS CDKでインフラ構築する際のメリットとデメリット

Engineer BlogsではバックエンドにAWSを利用しています。
インフラをAWS CDK(Cloud Development Kit)を利用し構築しました。

AWS CDKとは

AWS上にインフラを構築する場合、ServerlessFramework、Terraform、CloudFormation、手動など色々な手段が存在します。
AWS CDKもインフラ構築を目的としたツールキットです。
https://docs.aws.amazon.com/cdk/index.html

AWSに構築したいリソースをプログラミング言語で定義しデプロイできます。
CloudFormationなどを用いるとJSONYAMLを書く必要があります。細かい設定や複雑な設定が必要な場合JSONYAMLが読みにくくなります。その結果ミスに繋がりやすくなり保守性が低くなります。
AWS CDKを用いるとこのような煩わしさがなくなります。

メリット

AWS CDKを用いる際のメリットです。

メリット1、プログラミング言語による定義

テンプレート(JSONYAML)ではなくプログラミング言語(TypeScript、JavaScriptPythonJavaなど)で定義することによるメリットです。

  • ビルド時にミスがある場合エラーとなり、エラー個所もわかりやすいので、手早く修正できる
  • オブジェクトとして分割できるので、再利用性に富む
  • IDEを利用する場合、IDEの恩恵を受けることができる。

例えばLambda関数はこのように定義できます。

makeGetAllCompanies(stack: EngineerBlogsStack) {
    return new lambda.Function(stack, 'getAllCompanies', {
        code: lambda.Code.fromAsset('lambda/company'),
        handler: 'companyHandler.getAllCompaniesHandler',
        runtime: lambda.Runtime.NODEJS_12_X,
        environment: {
            TABLE_NAME: TableName,
            REGION: 'ap-northeast-1'
        },
    });
}

メリット2、スタックによる管理

定義したリソースはcdk bootstrapをすることでCloudFormationのテンプレートがローカル上に作成されスタックとして管理できます。
例えばcdk listをすると作成済みのスタックをリスト表示できます。

そしてcdk deployをするとクラウド上にデプロイできます。
デプロイ後にローカルでリソースの定義を変更すると、cdk diffで差分を確認することができます。
例 : 上記のソースコードruntime: lambda.Runtime.NODEJS_12_Xruntime: lambda.Runtime.GO_1_Xに変更した場合

$cdk diff
Stack EngineerBlogsStack
Resources
[~] AWS::Lambda::Function getAllCompanies getAllCompaniesF8157CDF 
 └─ [~] Runtime
     ├─ [-] nodejs12.x
     └─ [+] go1.x

このように差分を確認できます。

メリット3、Lambdaのロジックのデプロイ

APIやバッチなどの処理を担うLambdaのロジックをcdk deployでデプロイすることができます。

デメリット

AWS CDKを用いる際のデメリットは特にないと感じました。
しかしもともとプロジェクトでCloudFormationなどでリソースを定義している場合、コストがかかることがデメリットとなりそうです。
移行とAWS CDKの学習にコストがかかります。

最後に

こちらのWorkshopに沿って進めると理解しやすいと思います。僕は闇雲に進めたのでしんどかったです。 cdkworkshop.com

困った時はこちらが参考になります。