Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CDKとCloudFormationどちらが好み?
Search
NaoyaYamamoto
April 15, 2025
3
510
CDKとCloudFormationどちらが好み?
AWS Community Builder (Dev Tools)
JAWS-UG 東京
AWS Community Builders Night
2025年4月15日 (火)
NaoyaYamamoto
April 15, 2025
Tweet
Share
More Decks by NaoyaYamamoto
See All by NaoyaYamamoto
AWS Infrastructure Composerの良さを伝えたい
naonana777
1
370
AWS Community Buildersのススメ
naonana777
4
210
IaCジェネレーターはマネコンとCDKの架け橋になれるのか
naonana777
1
180
デプロイのベストプラクティス
naonana777
1
420
とあるチームの手動作業の多いCloudFormation運用とその改善
naonana777
0
200
Well-Architectedレビューの啓蒙活動
naonana777
0
36
RedshiftのサーチパスとDBメンテ
naonana777
2
540
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
223
9.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Speed Design
sergeychernyshev
29
920
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
Automating Front-end Workflow
addyosmani
1370
200k
Music & Morning Musume
bryan
47
6.5k
Code Review Best Practice
trishagee
67
18k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Transcript
CDKとCloudFormationどちらが好み? 山本 直弥 AWS Community Builder (Dev Tools) JAWS-UG 東京
AWS Community Builders Night 2025年4月15日 (火)
名前:山本 直弥 (SNSでは Nao) 所属:株式会社シーイーシー 在住:CDKの街 名古屋 出身:京都 2025~ AWS
Community Builders ( DevTools ) 2025~ JAWS-UG 名古屋 運営メンバー 2023-2024 Japan AWS All Certifications Engineer 社内のWell-Architected Program リード 好きなAWSサービス: AWS Step Functions、 AWS CloudFormation AWS Lambda、 AWS CDK ※Xのアイコン 自己紹介
2 2024年10月28日(月) 名古屋は“CDKの街”と呼ばれる 名古屋のエンジニアが一斉に 「名古屋はCDKの街」 と世界に発信する事象が発生 今日からここを、 CDKの街とするッ!!! 当時のX→ 背景
~名古屋はCDKの街~
3 IaC・・・ IaC勉強するぞー 背景 ~名古屋のLT大会:「IaC運用のリアルを語りたい!」~ ↓自分(この日LT予定) LT 頑張るぞー (燃) ↑IaC勉強したい人、集結
4 CloudFormation使ってる人ー? は~い ※この後、CloudFormationのLT予定 ・・・ 背景 ~IaCツール何を使っているか コール&レスポンス~ ←自分 ↑登壇者
↑他の参加者
5 CDK使ってる人ー? ハーイ! ※ほぼ全員 ・・・! 背景 ~悲報、名古屋民CDK派しかいない~ ←自分 ↑登壇者 ↑他の参加者
ハーイ! ※ほぼ全員 ハーイ! ※ほぼ全員
6 名古屋はCDKの街ー☆ 名古屋はCDKの街ー☆ これが「名古屋はCDKの街」と呼ばれる始まりだった・・・ この後 CloudFormation のLTするんだが うぇーい! 背景 ~CDKの街、爆誕~
←自分 名古屋はCDKの街って 伝えなきゃ エッホエッホ Xポスト ↑他の参加者 ↑登壇者 名古屋はCDKの街ー☆ 名古屋はCDKの街ー☆
7 • CDKがデファクトスタンダードだから? • CloudFormationは何がデメリット? • あらゆる場面でCDKがベストな選択になる? AWS CloudFormation (
Cfn ) AWS Cloud Development Kit ( AWS CDK ) CDKだけではなく、CloudFormationも活躍できる場はないか? ※ Terraformのことは一旦、忘れます 疑問 ~なぜCDKを選ぶ人が多い? ~
8 まずは世界の利用者の声を聴いてみよう 訳:CDK を超える CloudFormation の利点とは何か? 海外サイトでよさそうなスレッドを発見
デプロイが簡単なこと以外に Cfnにメリットなし みんな最初は使う けど、すぐに飽きる 利用者の声、 CloudFormationの利点はないらしい Cfnにメリット無し 大規模環境ではCfnは 避けるべき Cfnにメリット無し
参考:https://www.reddit.com/r/aws/comments/17pxpam/benefit_of_cloudformation_over_cdk/?rdt=62676
10 • CDK自体がCfn運用を楽にするためのツール。Cfnテンプレートを効率的に作れる。 → CfnにできることはCDKでもできるので Cfn を選択する理由がほとんどない • Cfnはデプロイが簡単だが、コードを書く量が多くて大変 →管理するインフラが大きくなればなるほどCfnのデメリットが浮き彫りになる
AWS CloudFormation ( Cfn ) AWS Cloud Development Kit ( AWS CDK ) CDKはCfnテンプレートが作れる のでCfn用ツールも使える CDKによりCfnのコードを短 くでき、運用負荷を低減 Cfnはデプロイが簡単 CfnはIaCコードの 作成と運用が大変 (管理するコードが多い) 簡単に利用者の声をまとめると コード作成が大変って、どれくらい大変?
{ "Resources": { "TESTMyLambdaFunctionServiceRole6FF4D431": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument":
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" } } ], "Version": "2012-10-17" }, "ManagedPolicyArns": [ { "Fn::Join": [ "", [ "arn:", { "Ref": "AWS::Partition" }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" ] ] } ] }, "Metadata": { "aws:cdk:path": "CdkHelloWorldStack/TESTMyLambdaFunction/ServiceRole/Resource" } }, "TESTMyLambdaFunction8E16014C": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { "S3Bucket": "cdk-hnb659fds-assets-111111111111-ap-northeast-1", "S3Key": "fe7e1908d59e783c3f2793117673f2e93c85f0ce91cd99bed0239de3d41e8d3b.zip" }, "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "TESTMyLambdaFunctionServiceRole6FF4D431", "Arn" ] }, "Runtime": "nodejs20.x" }, "DependsOn": [ "TESTMyLambdaFunctionServiceRole6FF4D431" ], "Metadata": { "aws:cdk:path": "CdkHelloWorldStack/TESTMyLambdaFunction/Resource", "aws:asset:path": "asset.fe7e1908d59e783c3f2793117673f2e93c85f0ce91cd99bed0239de3d41e8d3b", "aws:asset:is-bundled": false, "aws:asset:property": "Code" } }, "MyApiGateway04A753E5": { "Type": "AWS::ApiGateway::RestApi", "Properties": { "Name": "MyApiGateway" }, "Metadata": { "aws:cdk:path": "CdkHelloWorldStack/MyApiGateway/Resource" } }, "MyApiGatewayDeployment44AAC0313efdafc08b1d170892a3a89794c0f77f": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "MyApiGateway04A753E5" } }, "DependsOn": [ "MyApiGatewayitemsGETBDFA38EE", "MyApiGatewayitemsPOST3EB9C420", "MyApiGatewayitemsAC8CBE57" ], "Metadata": { "aws:cdk:path": "CdkHelloWorldStack/MyApiGateway/Deployment/Resource" } }, "MyApiGatewayDeploymentStageprodEBC77C1B": { "Type": "AWS::ApiGateway::Stage", "Properties": { "DeploymentId": { "Ref": "MyApiGatewayDeployment44AAC0313efdafc08b1d170892a3a89794c0f77f" }, "RestApiId": { "Ref": "MyApiGateway04A753E5" }, "StageName": "prod" }, "Metadata": { "aws:cdk:path": "CdkHelloWorldStack/MyApiGateway/DeploymentStage.prod/Resource" } }, "MyApiGatewayitemsAC8CBE57": { "Type": "AWS::ApiGateway::Resource", "Properties": { "ParentId": { "Fn::GetAtt": [ "MyApiGateway04A753E5", "RootResourceId" ] }, "PathPart": "items", "RestApiId": { "Ref": "MyApiGateway04A753E5" } }, "Metadata": { "aws:cdk:path": "CdkHelloWorldStack/MyApiGateway/Default/items/Resource" } }, "MyApiGatewayitemsGETApiPermissionCdkHelloWorldStackMyApiGateway18BBB2E7GETitemsAE87E112": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { "Fn::GetAtt": [ "TESTMyLambdaFunction8E16014C", "Arn" ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { "Fn::Join": [ "", [ "arn:aws:execute-api:ap-northeast-1:111111111111:", { 11 CloudFormationはそんなにコーディングが大変? CDKのコード (30行くらい) CloudFormationのコード (350行くらい) 10倍以上長いコードを手動で書いて運用するのは非効率かも Cfn、長すぎワロタ import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as apigateway from 'aws-cdk-lib/aws-apigateway'; export class CdkHelloWorldStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Lambda関数を定義 const myLambda = new lambda.Function(this, 'TESTMyLambdaFunction', { runtime: lambda.Runtime.NODEJS_20_X, code: lambda.Code.fromAsset('lambda'), handler: 'index.handler', }); // API Gateway を定義 const api = new apigateway.LambdaRestApi(this, 'MyApiGateway', { handler: myLambda, proxy: false, }); // メソッドを設定 const items = api.root.addResource('items'); items.addMethod('GET'); // GET /items items.addMethod('POST'); // POST /items } } const app = new cdk.App(); new CdkHelloWorldStack(app, 'CdkHelloWorldStack'); Lambdaを呼び出すAPI 構成 コード変換すると 行数が多いと 可読性が下がる
コード量が多いなら分割すれば良い?そんな簡単じゃなかった 12 リソースの種類ごとに分割? システムの単位で分割? 参考:https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-CloudFormation-Dev-Test-Deploy_1231_v1.pdf スタック間の参照を 調整するのが大変 デプロイ順序や 削除の考慮が必要 テンプレートがあま
り短くならない どう分割しても、課題が残る・・・ Cfn、検討事多すぎワロタ
13 • CDKがCloudFormationのIaCコードを効率的に管理するツールであるように、 他のツールと組み合わせることで、 CloudFormationの活用の幅を広げられるのでは? AWS CloudFormation AWS CDK Cfn単独運用はきつそう。
他のツールを組み合わせてはどうか? 他にツールの選択肢はないのか? 他のツールもありなのかよ
14 • CDK以外にも、便利なツールがたくさんある。 CloudFormation運用をサポートできるツールがいくつも登場 ・・・・・!! 2019年7月 CDK 登場 2020年11月 Rain
1.0 登場 これならCloudFormationも活躍できるかも 2024年2月 IaCジェネレーター リリース Rain 生成AIによるコード生成 対応 2023年3月 AWS Application Composer (現 Infrastructure Composer) GA 2024年10月 Console-to-Code GA AWS Application Composer GUI操作でIaCコード管理 IaCジェネレーター 実環境をIaCコード化 Console-to-Code マネコン操作をIaC コード変換 Rain コマンドで雛形作成、 スタック管理 2024年12月~ Amazon Q Developer、 Cline、MCP いろいろ応用 Amazon Q Developer エラー原因調査支援 チャット形式開発 AI駆動開発
15 • マネコンポチポチでリソースを作った後、一括でIaC(Cfnテンプレート化)できる! マネコン ノーコードで IaCコードができた! IaCジェネレータを使えばマネコンポチポチでIaCコードが書ける ポチ! ポチ! ポチポチ!
テンプレート ↑テンプレートにしたいリソース選択 ↑スキャン開始 ↑IaCジェネレーター選択 ↑マネコンで作った リソース ・・・・・ CDK コマンド操作で CDKコードに変換可能
16 • GUIを操作すると、操作の結果を自動でIaCコードにしてくれる便利ツール Infrastructure Composer ならGUI操作でIaCコードが作れる 構成も見やすくてIaC コードも自動生成 リソースの関連を GUIで作成
StepFunctionsフロー をGUIで作成 穴埋めでコードを 見ずに定義作成 ・・・・・ 自動コード化 自動コード化
17 生成AIを利用してIaCコードを対話形式で作成できる AIでIaCコード 作成/運用が楽々 Amazon Qで 対話形式でテンプレート作成、修正 Clineで対話形式でテンプレート作成、エラーチェック (ローカルのファイルも分析して回答をくれる) 素敵やん
18 • CloudFormation単体運用はつらいが、他ツールを使えば便利な使い方ができる • 今後も(生成AI含む)ツールの組み合わせにより、既存ツールの活躍の幅が広がる、 ツールが持つデメリット解消や実装、学習のハードルが下がると期待 • (個人的には)いろいろツールを工夫して活用を考えるのは 、 “楽しい”
→DevToolsのコミュニティビルダーとしてツールの良さを好みや偏りなく発信していきたい DevToolsはCDKだけじゃないって伝えなきゃ まとめ DevToolsのCBとして、ツールの良さを伝えなきゃ
ご清聴ありがとうございました 19 次はAWS Summitでお会いしましょ! (名古屋にも遊びに来てね) JAWS-UG名古屋では毎月オフラインイベントを開催しています https://jawsug-nagoya.connpass.com/