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などを用いるとJSONやYAMLを書く必要があります。細かい設定や複雑な設定が必要な場合JSONやYAMLが読みにくくなります。その結果ミスに繋がりやすくなり保守性が低くなります。
AWS CDKを用いるとこのような煩わしさがなくなります。
メリット
AWS CDKを用いる際のメリットです。
メリット1、プログラミング言語による定義
テンプレート(JSON、YAML)ではなくプログラミング言語(TypeScript、JavaScript、Python、Javaなど)で定義することによるメリットです。
例えば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_X
をruntime: 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
困った時はこちらが参考になります。