Slide 1

Slide 1 text

CDK を使った PagerDuty 連携インフラのテンプレート化 2025/2/21 渋谷翔悟 JAWS-UG CDK 支部#19 クラスメソッドコラボ回

Slide 2

Slide 2 text

自己紹介 所属 クラスメソッド株式会社 産業支援グループ リテールアプリ共創部 名前 渋谷翔悟( しぶや しょうご) 入社日 2021/4/1 趣味

Slide 3

Slide 3 text

ゲーム(APEX) ピアノ 目次 1. 背景 2. 課題 3. 解決策 4. 実装 5. まとめ 3

Slide 4

Slide 4 text

背景 4

Slide 5

Slide 5 text

背景 自分たちの部署は運用保守を担当しています。 エラーアラートの対応 不具合調査・対応 問い合わせ対応 ライブラリアップデート 追加開発 5

Slide 6

Slide 6 text

背景 アラート対応のためPagerDuty を導入しようとしていま した。 6

Slide 7

Slide 7 text

背景 - PagerDuty とは PagerDuty とは、インシデント管理ができるSaaS です。 インシデントは、対応が必要な課題 ( 障害やエラーアラート) 7

Slide 8

Slide 8 text

背景 - PagerDuty とは アラートの原因の例 → PagerDuty に通知されてインシデント作成される DB に不整合がある 二重にある 依存している外部サービスで障害が発生 エラーレスポンスが返ってくる 8

Slide 9

Slide 9 text

背景 - PagerDuty とは PagerDuty で出来ること インシデントを一元管理 サービス名、発生日時、エラー内容 担当者に通知 スマホアプリ、SMS 通知 自動音声通話 インシデントのフィルター 同じ通知を飛ばさない 9

Slide 10

Slide 10 text

課題 10

Slide 11

Slide 11 text

PagerDuty の導入 保守している環境にPagerDuty を導入する → アラートをPagerDuty に連携しないといけない 11

Slide 12

Slide 12 text

PagerDuty の導入 既存のアラート構成にPagerDuty 通知用のLambda を追加する Lambda からPagerDuty API を呼び出してアラートを連携 AWS ログ メトリクス フィルター SNS トピック SNS トピック PagerDuty API サーバーサイド CloudWatch Logs CloudWatch Alarm Amazon SNS AWS Lambda (PagerDuty 通知用) AWS Chatbot PagerDuty Slack サーバーサイドでエラーが発生 → CW Logs にエラーログを吐く → メトリクスフィルターに引っかかる → CW Alarms によりAmazon SNS が発火 → Lambda 関数が起動して、PagerDuty のAPI を呼び出す → PagerDuty でインシデント作成 12

Slide 13

Slide 13 text

PagerDuty の導入 保守しているプロジェクトは複数ある いずれも、 このLambda 追加作業を、保守しているプロジェクトの数だけ繰り返さないといけない CDK でインフラ管理している アラート通知には関しては同じインフラ構成 PagerDuty API AWS Lambda (PagerDuty 通知用) PagerDuty 13

Slide 14

Slide 14 text

PagerDuty の導入 Lambda 追加作業 → 各プロジェクトごとに手動でCDK のソースコードを編集 ソースコードを見るためgithub の権限がいる 既存のコードを読む 保守するプロジェクトが増えるたびに、手動での追加作業が発生 同じ内容のコードの追加作業を繰り返して飽きてくる PagerDuty API AWS Lambda (PagerDuty 通知用) PagerDuty 14

Slide 15

Slide 15 text

PagerDuty の導入 同じコードを追加するだけなら もっと効率的なやり方がありそう 15

Slide 16

Slide 16 text

解決策 16

Slide 17

Slide 17 text

解決策 CloudFormation テンプレート + クイック作成リンクで効率化できそう! CFN テンプレートを一つ作って、それを使い回す! クイック作成リンクでCFN テンプレートの管理を楽に出来る! 17

Slide 18

Slide 18 text

解決策 - クイック作成リンクとは クイック作成リンクとは、 CloudFormation のスタック作成ページに飛ぶことができるリンク 予めS3 に配置したCFN テンプレートを元にスタック作成ができる 1 https://eu-central-1.console.aws.amazon.com/cloudformation/home? 2 region=[ リージョン]#/stacks/create/review 3 ?templateURL=[CFN テンプレートのS3 のオブジェクトURL] 4 &stackName=[ スタック名] 5 &param_[ パラメータ名]=[ パラメータ値] 18

Slide 19

Slide 19 text

解決策 - クイック作成リンクとは 通常と比較して、 マネジメントコンソールを開いてスタック作成まで画面遷移 テンプレートの選択( ローカルからアップロード or S3 オブジェクトURL 入力) などを省略できる 19

Slide 20

Slide 20 text

実装 クイック作成リンクから、PagerDuty 通知用Lambda をデプロイできるようにする 手順 1. Lambda を追加するためのCDK プロジェクトを作成 2. CFN テンプレートを生成 3. S3 にテンプレートを配置 4. クイック作成リンクを作る 20

Slide 21

Slide 21 text

実装 1. Lambda を追加するためのCDK プロジェクトを作成 CDK プロジェクトを新規に作成 コードの内容 Lambda 作成 Lambda にCloudWatch からログ取得する権限を追加 SNS トピックにサブスクリプションを追加してLambda を呼び出す CFN テンプレートのパラメータを作成 Lambda のスクリプト 21

Slide 22

Slide 22 text

実装 いつもと違った点 今回は、既存のアラート構成がある環境にLambda を追加する 既存のリソースを参照する場合は、ARN を使って参照 → CFN テンプレートのパラメータとしてARN を受け取る // CFN テンプレートのパラメータを定義 const errorTopicArn = new cdk.CfnParameter(...); // ARN から既存のSNS トピックを参照 const errorTopic = cdk.aws_sns.Topic.fromTopicArn(...); // 既存のSNS トピックからLambda が起動するように errorTopic.addSubscription(...); 22

Slide 23

Slide 23 text

実装 2. CFN テンプレートを生成 /cdk.out が生成される 3. S3 にテンプレートを配置 cdk.out/project-name.template.json をS3 に配置 lambda のスクリプトもビルドしてS3 に配置 1 cdk synth 23

Slide 24

Slide 24 text

完成 4. クイック作成リンクを作る 無事にクイック作成リンクが完成! 1 https://ap-northeast-1.console.aws.amazon.com/cloudformation/home 2 ?region=ap-northeast-1#/stacks/create/review 3 ?templateURL=https://quick-create-cfn-template.s3.ap-northeast-1.amazonaws.com/PagerdutyLambdaCdkStack.template.json 4 &stackName=PagerdutyLambdaCdkStack 24

Slide 25

Slide 25 text

完成 実際に複数のプロジェクトでPagerDuty を導入できた PagerDuty の導入がかなり効率化できた! ソースコードの編集が不要! スタックも別で作成されるため既存環境に影響を与えにくい! 新規に保守するプロジェクトでも、導入が楽! 自分以外の人でも導入作業がしやすい! 25

Slide 26

Slide 26 text

まとめ CFN テンプレート + クイック作成リンクで手動作業を減らして効率化できた。 AWS CDK をより活用するためには、 その裏で動く CloudFormation の機能を把握することも重要! 26

Slide 27

Slide 27 text

27