Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20250708_JAWS_opscdk

 20250708_JAWS_opscdk

Avatar for Takuya Yonezawa

Takuya Yonezawa

July 08, 2025
Tweet

More Decks by Takuya Yonezawa

Other Decks in Programming

Transcript

  1. 1 © 2025 Japan Digital Design, Inc. Takuya Yo nezawa

    2025.07.08 みんなで楽しくサステナブルに CDK開発するために Ops-JAWS Meetup #35
  2. 2 © 2025 Japan Digital Design, Inc. 米澤 拓也 Software

    Engineer Technology & Development Div. and Corporate Culture室 プロフィール 米澤 前職ではCCoE、現職ではSoftware Engineer フロント/バックエンドの実装からインフラ構築など何でもやってます JAWSイベントのWEBサイト構築屋をやってましたが引退 Fin-JAWSの運営、CBはServerlessで2023年生 好きなAWSサービスは CloudFront、Lambda、CDK AWS資格0冠ですお手柔らかにお願いします
  3. 3 CONFIDENTIAL © 2025 Japan Digital Design, Inc. 4ヶ月くらいでCDKでこんだけリソースを作りました(主要部分のみピックアップ) Lambda

    × 30 NodejsFunction × 6 PythonFunction × 24 SNS × 12 SQS × 10 ECS Service × 4 VPC × 1 DynamoDB × 9 S3 Bucket × 10 Step Functions × 6 Bedrock 他リソースも含めると、計450
  4. 9 © 2025 Japan Digital Design, Inc. ユニットテストの定義? “コードの最小機能ユニットを テストするプロセスです”

    (※)コードの最小機能: 関数またはメソッド 【出典】 https://aws.amazon.com/jp/what-is/unit-testing/ テストコードを自動的に実行することで、 バグやエラー、予期せぬ挙動をするコードを素早く特定する
  5. 10 © 2025 Japan Digital Design, Inc. ユニットテストの定義? “コードの最小機能ユニットを テストするプロセスです”

    (※)コードの最小機能: 関数またはメソッド E2EやIntegrationテストと比較して、 システム全体構成を理解する必要がない 意識するべき領域のスモール化 反復実行による即フィードバック ドキュメントとしての役割 ユニットテストの特性上、テスト実行が高速で回る 誤修正したらすぐに気付けるし、 どこが間違っているのかが明確に直ぐ分かる そして毎回AWS環境にデプロイして確認する必要もない 関数やメソッドがどのような動きをするのか? がテストコードを見ると分かる 他にも良いことが リファクタリングのキッカケに handlerが1個だけとかだと、テスト書いてて辛くなる → 自ずとメソッド・関数に切り出すことを意識するようになる (※)ただし、質の良いテストコード、テスト実施構成があるというのは大前提
  6. 11 © 2025 Japan Digital Design, Inc. 例えばこんなLambda SQS Lambda

    外部API ① SQSのメッセージ数 をチェック ② メッセージ受信 (わざマシンID) ③ わざマシン情報を 取得 ④ <Return> ・わざ名(英語) ・タイムスタンプ Client Layer
  7. 12 © 2025 Japan Digital Design, Inc. ユニットテスト実装する際に気になること SQS Lambda

    外部API Client Layer 実SQSにPublish・Recieveする? ・テスト実行のタイミングが 他の人と被ったら? ・イマイチなテスト実行で AWS利用料跳ねない? 毎回HTTPS通信走らせる? ・外部APIがメンテ中だったら? ・テスト回しすぎてブロックされたら?
  8. 13 © 2025 Japan Digital Design, Inc. ユニットテスト実装する際に気になること SQS Lambda

    外部API Client Layer モック化 モック化 LocalStackは使いません AWS APIの向き先変える設定入れるの面倒くさいし、 Docker Compose書くのも面倒だし、 ライセンスの話とか考えたくない
  9. 14 © 2025 Japan Digital Design, Inc. AWSのコントロールプレーンのモック化ライブラリ aws-sdk-client-mock aws-sdk-client-mock-jest

    https://github.com/takuya-yone/cdk-ops-sample /blob/main/tests/lambda/recieve-sqs-message.test.ts import周りは省略 get-queue-attributesコマンド 発行時のダミーレスポンス定義 → キュー内にメッセージが1件 receive-messageコマンド 発行時のダミーレスポンス定義 → ダミーのSQSメッセージを返す Lambdaのハンドラー実行+チェック
  10. 15 © 2025 Japan Digital Design, Inc. AWSのコントロールプレーンのモック化ライブラリ moto pytest

    https://github.com/takuya-yone/cdk-ops-sample/ blob/main/tests/conftest.py conftest.pyに、pytest実行時に利用する fixtureを事前定義しておく - SQSのboto3クライアント(ダミー) - SQSキューの作成 - テスト時ダミー環境変数設定 - ダミーメッセージ1件の仕込み fixture:日本語訳は”治具”、テスト実行時に仕込む処理 conftest.py:fixtureをまとめて記載する。 pytest実行時に自動的にインポートされる 階層構造的に複数定義することもできる import周りは省略
  11. 16 © 2025 Japan Digital Design, Inc. AWSのコントロールプレーンのモック化ライブラリ https://github.com/takuya-yone/cdk-ops-sample/blob/main/tests/lambda/test_recieve_sqs_message.py テスト実行時に呼び出すfixtureを

    引数に設定(自動的に呼ばれる) Lambdaのハンドラー実行+チェック lambdaのハンドラーをインポート (このタイミングでやらないと環境変数周りでエラーを食らう) moto pytest
  12. 21 © 2025 Japan Digital Design, Inc. サンプルプロジェクトのCDK構成 Nodejs、PythonのHandlerから Layer内メソッドをインポート

    AWS環境にLambdaをデプロイすると 問題なく動くがローカルでテスト回すと。。
  13. 23 © 2025 Japan Digital Design, Inc. サンプルプロジェクトのCDK構成 pnpm ts:test

    pnpm py:test Lambdaデプロイ時のモジュール空間設計に 合わせるとローカルで参照エラー (テストできない、ビルドもできない)
  14. 24 © 2025 Japan Digital Design, Inc. CDK構成でのImport Error解消 tsconfig.json

    jest.config.js CDK Synth(Deploy)だけ通すのであればtsconfig.jsonのみの修正でOK Jestからもtsconfig.jsonのpathsを読むには仕込みが必要 参照
  15. 25 © 2025 Japan Digital Design, Inc. CDK構成でのImport Error解消(パターン1) index.py

    Lambda Layer仕様のpath importで失敗したら ローカル実行仕様のpathでimportを試みる イケてない!! (泣)
  16. 27 © 2025 Japan Digital Design, Inc. その他 ユニットテスト全般のTips Pythonが絡むディレクトリ・ファイルは

    スネークケース命名にしておく タイムスタンプ取得や外部APIを使う部分は 関数化しておくとモック化が楽
  17. 32 © 2025 Japan Digital Design, Inc. 例えばこんなケース CDK修正のPR出しました! 確認お願いします!

    この部分xxx要件満たせてないから 再修正してください そんな記載どこに。。 先に言っといてくれよ!怒 再度CDKの修正PRを(ry (続く) コンプラの番人 フッ軽デベロッパー (※)これはフィクションです
  18. 33 © 2025 Japan Digital Design, Inc. 例えばこんなケース CDK修正のPR出しました! 確認お願いします!

    この部分xxx要件満たせてないから 再修正してください そんな記載どこに。。 先に言っといてくれよ! 再度CDKの修正PRを(ry (続く) コンプラの番人 フッ軽デベロッパー (※)これはフィクションです Compliance as Code (Policy as Code) コンプライアンス要件をコード化して 開発サイクルに組み込む 作り上げたコードは組織の資産に
  19. 34 © 2025 Japan Digital Design, Inc. CDK Aspects CDKで定義された各種リソースを

    一括操作するための仕組み リソースの既存プロパティを 上書きもできるが乱用は危険。。 readのみに留めておきましょう 下記もAspectsを利用している - Tags.of - cdk-nag lib/aspects/policy.ts lib/aspects/vpc.ts Public Subnet 禁止! CDKで実現するなら。。 ルール定義を追加していけば まとめてチェック可能 (Visitor Design)
  20. 35 © 2025 Japan Digital Design, Inc. CDK Aspects CDKで定義された各種リソースを

    一括操作するための仕組み リソースの既存プロパティを 上書きもできるが乱用は危険。。 readのみに留めておきましょう 下記もAspectsを利用している - Tags.of - cdk-nag CDKで実現するなら。。 lib/aspects/vpc.ts 問題の部分 cdk synth
  21. 36 © 2025 Japan Digital Design, Inc. CloudFormation Guard DSLを書くことでCFnテンプレートの

    ポリシーチェックを実行できる cfn-guardコマンドを使えばローカル 環境で、チェック実行できる CFn hookと組み合わせれば、AWS環 境へのCFnスタックデプロイ・更新時 にチェック実行できる bucket-versioning/template.yml CDKで実現するなら。。 bucket-versioning/bucket-versioning.guard リソースの期待する状態を CFnテンプレートとして記載 (バケットのバージョニングOn) cfn-guard rulegen
  22. 37 © 2025 Japan Digital Design, Inc. lintで特定リソースの利用を ブロック 要件遵守であったり、メンテ性向上を

    目的とした独自リソース定義の 利用を強制させたいケース lintの静的解析で特定パターンが 出現していたらFailさせる CDKで実現するなら。。 lib/custom-resource/CustomNodejsFunction.ts runtimeやlogGroupといった特定のプロパティを プリセットしておいたリソースクラス
  23. 38 © 2025 Japan Digital Design, Inc. lintで特定リソースの利用を ブロック 要件遵守であったり、メンテ性向上を

    目的とした独自リソース定義の 利用を強制させたいケース lintの静的解析で特定パターンが 出現していたらFailさせる CDKで実現するなら。。 lib/constructs/lambda.ts 事前定義クラスを呼び出して リソース作成している OK NodejsFunctionクラスを 直呼び出してリソース作成している ブロックしたい
  24. 39 © 2025 Japan Digital Design, Inc. lintで特定リソースの利用を ブロック 要件遵守であったり、メンテ性向上を

    目的とした独自リソース定義の 利用を強制させたいケース lintの静的解析で特定パターンが 出現していたらFailさせる CDKで実現するなら。。 biome.json エラーにするimportパターンと エラー時のメッセージを定義 (※)biomeの例を出してますが、ESLintでも出来る CLIでlint実行 想定通りFail