![]() |
こんにちは!SCSK猿橋です。
関西万博が盛況のようですが皆さん遊びに行かれましたでしょうか?
せっかくの関西開催なので一度行ってみたいと思っているのですが、万博に走る前にAWS CDKに走ってみたいと思います!
今回やりたいこと
DevOpsでは一貫したインフラ環境の構築の為にIaC(Infrastracture as Code)の活用が増えていると思います。
IaCではAWS CloudFormation、AWS CDKを活用することが多いと思いますが、最近はリソースからCloudFormationテンプレート、CDKソースを生成する機能もでてきました。
今回はCDKを実践活用したい、というテーマで、よくあるWebアプリケーションで活用するシステム構成をCDK化することにTryしてみました。
cdk migrateコマンドの「from-scan」オプションで既存リソースからCDKソースを生成できる機能がリリースされているので、それを使えば簡単にCDK化できるんじゃないか!という目論見です。
AWS CloudFormation、AWS CDKの関係とCDKソース生成については以下の記事がわかりやすかったので参考にしてみて下さい。
さっそくつまづいた
一つ目のつまづき。以下のハンズオンでエッジサービスを活用したWebアプリケーションを構築し、このシステム構成をさくっとCDKソース化することにTryしました。
各リソースにはTagKey=CdkMigrateTestを設定しています。
TagKeyでフィルタリングして既存リソースからfrom-scanでmigrateしてみることにしました。
cdk migrate --from-scan new --stack-name "cdk-test-edgeservice" --filter tag-key="CdkMigrateTest"
XXXStack could not be generated because None is not implemented for ResourceValue::Object
24リソース抽出できているものの、CDK生成でエラーが発生。このCDK生成エラーには今後都度悩まされることになります。
ネット検索やAmazon Qでエラー原因を調査しましたが、この時点では原因掴めず。migrateコマンドの難しさの入り口でした。
リソース別にmigrateしてみる
cdk migrate –from-scanコマンドは、
- 既存リソースのスキャン(filterに合致するリソースの抽出)
- スキャンしたリソースのCloudFormationテンプレート化
- テンプレートからCDKソースを生成
という3ステップを一括で実行できる素敵なコマンドなのですが、途中でエラーが発生するととても原因が掴みづらかったです。
少しでも複雑度を落とすべく、個別のリソース毎にmigrateしてみることにしました。
イメージとして、サーバレスAPIをイメージし、以下のリソースを作成した上で個別にmigrateすることとしました。
No | サービス | リソース名 | tag設定 | 備考 |
1 | S3 | 20250815-cdktest | Key=CdkMigrateResource Value=S3 |
|
2 | Lambda | 20250815-cdktest-lambda | Key=CdkMigrateResource Value=Lambda |
|
3 | API Gateway | 20250815-cdktest-api | Key=CdkMigrateResource Value=ApiGateway |
Lambda統合のGETメソッドを1つ設定 |
4 | DynamoDB | 20250815-cdktest-dynamodb | Key=CdkMigrateResource Value=DynamoDB |
S3のmigrate
cdk migrate --from-scan new --stack-name "cdk-migrate-s3" --filter tag-key="CdkMigrateResource",tag-value="S3"
cdkソース生成に成功!
生成されたソース内のmigrate.json(migrate結果が格納されているファイル)
想定したbucketが抽出できている
cdkソースはlib配下に生成されている
lib/cdk-migrate-s3-stack.ts
Lambdaのmigrate
cdk migrate --from-scan --stack-name "cdk-migrate-lambda" --filter tag-key="CdkMigrateResource",tag-value="Lambda"
XXXStack could not be generated because RecursiveLoop is not a valid property
4リソース抽出できているもののCDKソース生成でエラーが発生。
こちらのissueが関連していそう。まだopenのようなので、このissueが解決しないとLambdaへのmigrateコマンドはエラーが発生しそう。
Lambdaコンソール上の設定は恐らくこちら
テンプレート生成まではRecursiveLoopに追随できているが、テンプレートからのCDKソース生成ライブラリは未対応、ということでしょうか?
API Gatewayのmigrate
cdk migrate --from-scan --stack-name "cdk-migrate-apigateway" --filter tag-key="CdkMigrateResource",tag-value="ApiGateway"
3リソース抽出でき、CDKソースの生成が成功!
migrate.jsonの確認。
Deployment、RestApi、Stageが抽出されている。
CDKソースを確認すると、Lambda統合のGETメソッドが生成されていなさそう。
再度filterでresource-type-prefixでAPI Gatewayを抽出してみたが、GETメソッドソースは生成されず。(一旦置いて、次行ってみよー!
DynamoDBのmigrate
cdk migrate --from-scan --stack-name "cdk-migrate-dynamodb" --filter tag-key="CdkMigrateResource",tag-value="DynamoDB"
XXXStack could not be generated because WarmThroughput is not a valid property
1リソース抽出できていますが、CDKソース生成でエラーが発生。
こちらのissueが関連していそうです
cdk migrate処理の問題
issueを追っていく中で、冒頭の「ResourceValue::Object」エラーもCloudFrontのissueとして登録されていることがわかりました。
さらにissueを追っていくと、根本対策としては以下のチケットが登録されていることがわかりました。
issue#771にはこれまでハマったエラーに関するissueが見事関連issueとして紐づけられていました。
DynamoDBのissue#525のコメントに投稿されていましたが、migrate処理の裏側でcdk-from-cfnライブラリが動いており、このバージョンが古いそうです。(2025/08/16時点情報)
https://github.com/cdklabs/cdk-from-cfn/blob/main/src/specification/cdk-resources.jsonで定義されていない新しいプロパティは対応できていないとのこと。
cdk migrateリリース直後は当時の最新プロパティが反映されていたのかと思いますが、少し期間がたって上記issueの通り最新プロパティに反映できていない問題が顕在化してきた過渡期、とも言えるかと思います。タイミングが悪く既存issueを踏みまくってしまいましたが、isseu#771が解決すればmigrateエラーも解消するのではないかと期待します。
代替手段(マネジメントコンソール上での段階実行)
cdk migrate –from-scanは、既存リソースのスキャン、Cfnテンプレート化、CDKソース生成を一気に実行してくれるコマンドですが、途中でエラーが発生するとほぼ対処のしようがありません。
マネジメントコンソール上ではそれらを別々に実行できるので、途中のテンプレートを修正して進めてみる、という手もありそうです。
以下の記事を参考にマネジメントコンソールで作業を進めてみます。
1.IaCジェネレータでのスキャン
上記の記事通りCloudFormation>IaCジェネレーター>新しいスキャンを開始 でスキャンが実行できます。
cdk migrate –from-scanで実行しているスキャン結果はマネジメントコンソール上でも共有されているので今回は省略します。
2.テンプレートの作成
今回は問題となったLambdaのテンプレートを作成してみます。
IaCジェネレーター>テンプレートを作成
タグを指定してLambdaをテンプレートに追加
関連リソースが推奨されるので、こちらもテンプレートに追加してテンプレートを作成
3.CDKソース生成
テンプレート作成後、AWS CDKタブを表示してCDK処理を進めてみます。
テンプレートをダウンロードし、cdkコマンドをコピーして実行
cdk migrate --stack-name CfnLambdaTemplate-20250815 --from-path ./CfnLambdaTemplate-20250815-1755311593670.yaml --language typescript
XXXStack could not be generated because RecursiveLoop is not a valid property
想定通りのエラーが発生。テンプレートから「RecursiveLoop」プロパティを削除して、再度cdk migrateを実行してみる。
無事CDKソースの生成が成功!手間はかかりますが、エラーは回避できそうです。
ちなみにLambdaのCDKソースにAPI GatewayのGETメソッドの設定がありそうでした。(一旦置いておいた問題が解消
余談(苦労話)
スタックに含まれているリソースはmigrateでスキャン対象外の模様
当初は以下のサーバレスサービスをベースとしたWebXRアプリケーションをベースにcdk migrateを試そうとしていました。
CDKソースでgithubで提供されており、このCDKソースとcdk migrateで生成したCDKソースを比較したら面白んじゃないかという目論見でした。
結果、想定していたリソースが何度やってみ抽出されず。当初はfilterオプションの書式に誤りがあるのかと様々な書式を試してみましたが抽出できず。Amazon Qに聞き倒したところ、ようやくスタックに既に含まれているリソースはscan対象外であるという条件がわかりました。
そもそも前提としていた動作確認シナリオからして間違っていた、ということですね(これでどれだけ時間を費やしたか。。。涙
おわりに
今回のcdk migrate動作検証は、まさに「夏休み自由研究」レベルの作業時間となってしまいました(1~2日で終わらせるつもりだったのに。。。
エラーにまみれたときはお先真っ暗な感じでブログアウトプットに辿り着けるのか、、と焦りましたが、なんとかエラー原因も見えてきて形にできました。
今回はタイミング悪くCDKソース生成が難しい状況で、冒頭の参考blogの記載の通り、このツールを使うより1からCDKソースを書いたほうが、エラーまみれの近道よりは前に進める遠回り、という印象でした。
ただし、うまくCDKソースがしゅるしゅるっと生成できた時は感動モノだったので、issue#771が解決することを切に願っております!