IaC Generatorからのcdk migrate&importで手動作成リソースをIaC化するモブプロを定例化した話

3.4K Views

May 22, 24

スライド概要

JAWS-UG CDK支部 #14 IaC Generator祭り の発表資料です。
https://jawsug-cdk.connpass.com/event/317935/

profile-image

経済ニュースアプリのSREの仕事をしています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

IaC Generatorからのcdk migrate&importで 手動作成リソースをIaC化するモブプロを定例化した話 株式会社ユーザベース 安藤裕紀 JAWS-UG CDK支部 #14 2024/5/22

2.

00 自己紹介 安藤裕紀 / あんどぅ 株式会社ユーザベース NewsPicks事業 SRE Unit Leader SREチームのマネージャー 兼 テックリード 特技:AWSコスト削減や障害対応を愚直に100本ノックすること CDK Conference 2023の発表: 『3年間運用したCDKの失敗から学ぶCDK開発のプラクティス』 https://www.docswell.com/s/integrated1453/5GXL7N-AWS-C DK-Conference-Japan-2023 ©Uzabase, Inc. All Rights Reserved.

3.

00 ソーシャル経済メディア NewsPicksについて ©Uzabase, Inc. All Rights Reserved.

4.

01 Infrastructure as Codeの民主化をしたい ©Uzabase, Inc. All Rights Reserved.

5.

01 NewsPicksの開発組織では全面的にCDKを採用 AWSに関するテックブログをたくさん出していますが、ほぼすべてCDKで実装 https://tech.uzabase.com/archive/category/AWS ©Uzabase, Inc. All Rights Reserved.

6.

01 SREチーム以外からもCDKのPRが毎日のように飛んできます SREチームのSlackチャンネルに日々送られるCDKのPRレビュー依頼 ©Uzabase, Inc. All Rights Reserved.

7.

01 とはいえ、IaC化されていないリソースも多数存在 ● NewsPicksは2013年9月にサービス開始。当初からAWSを利用 ● CDKは2019年7月にGA。サービスの歴史としては後半から導入 https://aws.amazon.com/jp/blogs/aws/aws-cloud-development-kit-cdk-typescript-and-python-are-now-generally-available/ ● サービス開始当初から存在するストレージやネットワークのリソースは 当然のように手動作成😇 ○ コンテンツのデータを格納するDynamoDBテーブルやS3バケット ○ 昔からあるVPCやサブネット、Security Groupなど ©Uzabase, Inc. All Rights Reserved.

8.

01 IaC化されていないとPRを作れない ● 開発チーム「このネットワーク設定の変更のPRを出したいと思ったんですが、CDKの コードってありますか?」 ● SREチーム「手動作成なので、dev環境で変更手順を検証して、本番のマネコンで変 更権限を持った人とのペア作業でリリース実施していただけますか?」 ○ CDKによる変更は、PRがマージされることを条件に開発チームのメンバーが 本番適用できるが、マネコンやCLIによる本番環境の変更はIAMの権限で制限している → 手動作成リソースは、開発者がセルフサービスで インフラの変更を行うことを阻害していた ©Uzabase, Inc. All Rights Reserved.

9.

02 IaC Generatorからのcdk migrate&importで 手動作成リソースをIaC化するモブプロを定例化 ©Uzabase, Inc. All Rights Reserved.

10.

01 毎月の当番制で「cdk import day」というイベントを開催 ● 手動作成リソースは膨大にあって、すべてをCDK管理に変更することは非現実的 ● 継続的に手動作成リソースをIaC化していく習慣をつけることで、IaC化の要望の多い リソースを徐々にCDK管理にしていくことにした ● IaC化の優先度の高いリソースをリストアップしておき、 当番制で交代しながら1時間でcdk importまでやりきる ○ 会の最初で以下のような目標を決める 「今日はXxxというCloudFront Distributionを importして既存スタックで管理できるようにするぞ!!」 ○ 終わらなかったら当番が宿題で持ち帰る ©Uzabase, Inc. All Rights Reserved.

11.

02 IaC Generatorの機能では、cdk migrateでスタックを作成 IaC Generatorに記載されているのはスタックとして取り込むところまで → CloudFormationスタックが増殖していってしまうのは具合が悪い 1リソース単位で既存スタックに取り込んで行きたい ©Uzabase, Inc. All Rights Reserved.

12.

01 cdk import dayの流れ 1. (事前準備)IaC Generatorのスキャンを開始しておく 2. 取り込み対象のリソース・スタックを決める 3. IaC Generatorでリソースを作成して、テンプレートを作成 4. 作成したテンプレートからcdk migrate でスタックのコードを作成 5. スタックのコードをConstructに書き換える 6. 既存のCDKのスタックにConstructを移植(本番環境のみデプロイされるようにする) 7. cdk importで既存のCDKのスタックにimport 8. CloudFormationでドリフト検出 9. PRをマージして完了 ©Uzabase, Inc. All Rights Reserved.

13.

01 cdk import dayの流れ 1. (事前準備)IaC Generatorのスキャンを開始しておく 2. 取り込み対象のリソース・スタックを決める 3. IaC Generatorでリソースを作成して、テンプレートを作成 4. 作成したテンプレートからcdk migrate でスタックのコードを作成 5. スタックのコードをConstructに書き換える 6. 既存のCDKのスタックにConstructを移植(本番環境のみデプロイされるようにする) 7. cdk importで既存のCDKのスタックにimport 8. CloudFormationでドリフト検出 9. PRをマージして完了 ©Uzabase, Inc. All Rights Reserved. →ここだけ紹介

14.

01 環境別の値がハードコードなテンプレートになるが、それを許容 ● 本番環境のリソースをIaC Generatorでテンプレート化した場合、参照している他リ ソースのARN等は固定値になってしまい、環境別のデプロイに対応しない ● 例えばCloudFront Distributionをテンプレート化すると、ACM証明書のARNが 本番に存在するACM証明書の固定値になったりする。 →CDKでdev,production別に同じコードで管理するのは諦めて本番だけ管理する ©Uzabase, Inc. All Rights Reserved.

15.
[beta]
01 Construct化したコードを作成するかどうかを設定で管理
● Construct化してcdk importをする環境を、パラメータで管理
● 本番はデプロイする、開発はデプロイしない、をスタックで管理
本番環境のconfig.ts
{

既存スタックのコード
if (props.config.shouldCreateCloudFrontDistribution) {

shouldCreateCloudFrontDistribution: true,
}

new XxxCloudfront(this, "XxxCloudfront", {});
}

dev環境のconfig.ts は false

→IaC Generatorでテンプレート化したコードをなるべく修正せずに本番環境だけ管理
頑張らずに1リソースだけ、本番だけ、1時間で取り込むことを目指す
©Uzabase, Inc. All Rights Reserved.

16.

01 cdk import dayの流れ 1. (事前準備)IaC Generatorのスキャンを開始しておく 2. 取り込み対象のリソース・スタックを決める 3. IaC Generatorでリソースを作成して、テンプレートを作成 4. 作成したテンプレートからcdk migrate でスタックのコードを作成 5. スタックのコードをConstructに書き換える 6. 既存のCDKのスタックにConstructを移植(本番環境のみデプロイされるようにする) 7. cdk importで既存のCDKのスタックにimport 8. CloudFormationでドリフト検出 9. PRをマージして完了 ©Uzabase, Inc. All Rights Reserved.

17.

03 まとめ ©Uzabase, Inc. All Rights Reserved.

18.

04 まとめ ● cdk importを習慣化したことで、手動作成リソースがなくなっていく気持ちよさ ○ よく開発チームからCDKで管理したい要望を受けるリソースも、無理なく 「来月のcdk import dayでIaC化しましょう」と予定を立てることができる ○ 1時間で終わらなくても、みんなでやって終わらないと悔しいので、 PRをマージするまでやりきろうという気持ちになる ○ とりあえず本番だけ管理するimportをやるが、結局devのリソースも管理できよ うにするコード修正までやりたくなる(devは本番影響ないので気楽にできる) ● CDKのコードのリファクタリングの必要性に気づいてコードを改善する機運 ○ スタックのコードが肥大化しがちなので、シンプルに保ちたい気持ちになる ○ モブプロで話しているので、コードを改善していきたいという機運が高まる ©Uzabase, Inc. All Rights Reserved.

19.

ご清聴ありがとうございました! ©Uzabase, Inc. All Rights Reserved.