17.7K Views
March 20, 23
スライド概要
CI/CD Conference 2023で登壇した際の資料です。
Web Application Engineer @ AlphaDrive
最高の開発者体験を目指して AWS CDKによるCI/CDパイプラインを改善 し続けている話 AlphaDrive Web Application Engineer / 畠山 嵩広 2023.3.20@CI/CD Conference 2023 by CloudNative Days 1
00 自己紹介 畠山 嵩広 AlphaDrive Webアプリケーションエンジニア keyamin_ あと1こ... ©Alphadrive Co.,Ltd. All Rights Reserved. 2
アジェンダ 1. AlphaDriveについて 2. 私達のCI/CDパイプライン 3. 最高だったポイント 4. CDKをどの言語で書くか 5. まとめ ©Alphadrive Co.,Ltd. All Rights Reserved. 3
アジェンダ 1. AlphaDriveについて 2. 私達のCI/CDパイプライン 3. 最高だったポイント 4. CDKをどの言語で書くか 5. まとめ ©Alphadrive Co.,Ltd. All Rights Reserved. 4
01 AlphaDriveについて AlphaDriveは、 新規事業創出支援のプロフェッショナルカンパニーかつ、 エンジニア第一のテクノロジーカンパニーです。 and more… ©Alphadrive Co.,Ltd. All Rights Reserved. 5
サービス | Incubation Suite(インキュベーション スイート) 新規事業開発に特化したクラウド型総合支援ツール 3,500社以上の新規事業開発を支援してきたAlphaDriveの知見を余すことなく注ぎ込んだソリューション。 新規事業制度を運営する事務局メンバーをサポートする管理機能から、起案者向け学習コンテンツ提供、 起案ブラッシュアップ機能まで。新規事業開発に必要なサポートを1つのプラットフォームで実現します。 ポイント 対象課題 新規事業開発 / 事業開発人材育成対応 事務局業務の効率化を実現 起案者の課題を先回りしたサ ポート機能 対象部署 新規事業プログラム参加メンバーの 登録、研修 /イベントの告知、 事業アイデアの進捗管理、審査 フィードバックなど多岐にわたる事務 局業務に対応。 多忙な業務をサポートする機能を 1 つのツールに集約しました。 新規事業開発にあたって必要となる 事業フレーム、事業案の管理、アイ デアを仮説検証した履歴を自動アー カイブ、事業開発スキルの向上など 多様な機能を取り揃えており、新規 事業の推進・検討に専念することが できます。 事業開発・新規事業 / R&D・イノベーション インキュベーション / 次世代事業開発 経営企画・総合計画 / 人事・人財開発 事業を前進させる 支援オプション リクルートで社内事業開発プログラ ムを立ち上げた麻生要一ら専門家 によるメンタリングや顧客ヒアリング 支援など人的なサポートも組み合わ せることで、新規事業の進捗をバッ クアップします。 対象領域 事業創出 組織変革 ©Alphadrive Co.,Ltd. All Rights Reserved. 人材育成 導入企業 6
サービス | NewsPicks Enterprise 学びと対話の空間 NewsPicksを法人向けの人材及び組織開発ツールとしてカスタマイズすることで、 イノベーション人材を育て、組織の変革力を生み出す「人材と組織の成長プラットフォーム」です。 対象課題 VALUE 1 VALUE 2 VALUE 3 社員の インプット向上 社員の アウトプット向上 社員の コミュニケーション リレーション醸成 次世代型変革人材発掘 / 自律型人材育成 / サイロ化打破 / エンゲージメント向上 / ビジョン・理念浸透 対象部署 人事・人材育成 / 人財開発・組織開発 経営企画・総合計画 / 事業企画・経営管理 / 社内 VALUE 5 VALUE 4 社内変革に繋がる アクション イノベーション創出 イノベーション 人材開発・発掘 広報 / 組織風土改革 / 総務・福利厚生 / 労働組合 対象領域 導入企業 事業創出 組織変革 ©Alphadrive Co.,Ltd. All Rights Reserved. 人材育成 7
技術スタック紹介 ©Alphadrive Co.,Ltd. All Rights Reserved. 8
ス ー タベ フロ ー デ ト ン Incubation Suite TypeScript デザ イン 監視 バックエ ンド インフラ Aurora - Postgres Amazon CloudWatch TypeScript Amazon ECS / Fargate Express.js AWS CloudFormation AWS CDK 9
ス ー タベ フロ ー デ ト ン 開発中の新SaaS TypeScript デザ イン 監視 バックエ Chakra UI ンド インフラ Aurora - Postgres Storybook Amazon CloudWatch Go Gin OpenAPI Amazon ECS / Fargate AWS CloudFormation AWS CDK Gin-Gonic Framework Logo by Javier Provecho. The Gopher character is based on the Go mascot designed by Renée French. 10
01 AlphaDriveのポリシー 私達AlphaDriveは組織の初期段階ではSREチームを組成せず、 プロダクト開発者全員がSREのスキルを持つことをポリシーに 25名規模の組織で複数のSaaS開発を進めています。 - 赤澤 剛 (AlphaDrive CTO/NewsPicks Fellow) ©Alphadrive Co.,Ltd. All Rights Reserved. 11
全員がSRE…?🤔 ©Alphadrive Co.,Ltd. All Rights Reserved. 12
01 そもそもSREとは? SREとは、ソフトウェアエンジニアに運用チームの設計を依頼したときに できあがるものです。 - 『SRE サイトリライアビリティエンジニアリング』より ©Alphadrive Co.,Ltd. All Rights Reserved. 13
「プロダクト開発者全員がSRE」とは... ©Alphadrive Co.,Ltd. All Rights Reserved. 14
SREを職種ではなく方法論や文化として捉え、 運用まで開発者全員に浸透させること!🙋 ©Alphadrive Co.,Ltd. All Rights Reserved. 15
01 AlphaDriveが目指す「プロダクト開発者全員がSRE」 自分が書いたコードは、 デプロイや運用まで自分で面倒を見る それを実現できる仕組みを作る 🙅「運用担当者さん、アラート鳴ってるよ〜!」 そうは言っても、開発者全員にAWS(IAMポリシーの細かい書き 方...)やTerraform(HCLのややこしいDynamicBlock...)を完璧に 習得してもらうのは難しい ではなく、開発者自身でソフトウェアエンジニアリングの知見を活 かして開発者体験を向上させる! ただ開発者の負担が増えるだけでは、組織拡大の敷居も高くなる → 持続可能性が低い🙅 🙅「DevOpsエンジニアさん、パイプライン直して!」 ©Alphadrive Co.,Ltd. All Rights Reserved. 16
アジェンダ 1. AlphaDriveについて 2. 私達のCI/CDパイプライン 3. 最高だったポイント 4. CDKをどの言語で書くか 5. まとめ ©Alphadrive Co.,Ltd. All Rights Reserved. 17
小規模開発チームで、全員がSREとして 最高の開発者体験を実現するには…? ©Alphadrive Co.,Ltd. All Rights Reserved. 18
× AWS CDK ©Alphadrive Co.,Ltd. All Rights Reserved. × TypeScript StepFunctions 19
01 ということで先に、今回のまとめ ● インフラ専任がいないような小規模チームなら、 CDKを使いましょう! ○ ● チームにTypeScriptの知見があるなら、 CDK in TypeScriptを使いましょう! ○ ● そうでないチームでも、 CDKはおすすめです 💪 なくても、他の言語でも CDKできます👍 みんなStepFunctions使おうぜ!🔥 ©Alphadrive Co.,Ltd. All Rights Reserved. 20
つまり... ©Alphadrive Co.,Ltd. All Rights Reserved. 21
©Alphadrive Co.,Ltd. All Rights Reserved. 22
01 「プロダクト開発者全員がSRE」実現のためのIaCツール 開発中のSaaSでは、IaCを実現するツールとしてAWS CDKを採用しています AWS Cloud Development Kit (AWS CDK) ● 馴染みのあるプログラミング言語を使いつつ、IaCのメリットを享受できる ● L2 Constructなどによる抽象化で、直感的にインフラをコードで記述できる ● 内部でCloudFormationが使用されており、公式サービスならではの手厚いサポートや 豊富な機能提供を受けられる この2行でEventBridgeの通知先となるSNSトピックを記述できる🥰 ©Alphadrive Co.,Ltd. All Rights Reserved. 23
02 大まかなアプリケーション構成 ©Alphadrive Co.,Ltd. All Rights Reserved. 24
02 大まかなアプリケーション構成 現在dev、demo(*)、production環 境がそれぞれ別の AWSアカウントに 存在する (*)お客様が利用するデモプロジェクト用 ©Alphadrive Co.,Ltd. All Rights Reserved. 25
02 大まかなアプリケーション構成 フロントエンド (Next.js)、バックエン ド(Go)ともにAWS Fargate上で実 行されるWebアプリケーション ©Alphadrive Co.,Ltd. All Rights Reserved. 26
02 大まかなアプリケーション構成 getServerSidePropsでのデータ取得 や、クライアントサイドからの API Routesを経由したリクエストは ALB経 由でバックエンドサーバーに到達 ©Alphadrive Co.,Ltd. All Rights Reserved. 27
02 大まかなアプリケーション構成 ココ ©Alphadrive Co.,Ltd. All Rights Reserved. 28
02 CI/CDパイプライン ©Alphadrive Co.,Ltd. All Rights Reserved. 29
02 CI/CDパイプライン このワークフローが各環境の フロントエンド、バックエンド用 に存在する ©Alphadrive Co.,Ltd. All Rights Reserved. 30
02 CI/CDパイプライン Slackからデプロイ対象とブランチを指定し てトリガー ©Alphadrive Co.,Ltd. All Rights Reserved. 31
02 CI/CDパイプライン dev環境ではソースステージのブランチ を自由に選択したかったため、 CodePipelineではなくStepFunctions を採用 ©Alphadrive Co.,Ltd. All Rights Reserved. 32
02 CI/CDパイプライン 指定したブランチの最新のコミットで Dockerイメージをビルドし、 ECRにプッ シュ ©Alphadrive Co.,Ltd. All Rights Reserved. 33
02 CI/CDパイプライン ECSから現在使用中のタスク定義を取 得し、Dockerイメージ参照先を書き換 える ©Alphadrive Co.,Ltd. All Rights Reserved. 34
02 CI/CDパイプライン CodeDeployからECSにBlue/Greenデ プロイする ©Alphadrive Co.,Ltd. All Rights Reserved. 35
02 CI/CDパイプライン AfterAllowTestTraffic Hookで LambdaからCodeBuildを呼び出して E2Eテストを行う。 E2Eテストに成功したらデプロイを行 い、結果をSlackに通知する。 ©Alphadrive Co.,Ltd. All Rights Reserved. 36
アジェンダ 1. AlphaDriveについて 2. 私達のCI/CDパイプライン 3. 最高だったポイント 4. CDKをどの言語で書くか 5. まとめ ©Alphadrive Co.,Ltd. All Rights Reserved. 37
①圧倒的に少ないコードで書けて最高🎉 ©Alphadrive Co.,Ltd. All Rights Reserved. 38
この1行で... ©Alphadrive Co.,Ltd. All Rights Reserved. 39
これ全部できあがります🎉 ↓diff ©Alphadrive Co.,Ltd. All Rights Reserved. 40
Terraformとの比較 terraform-aws-modules/vpc(*1)を利用した場合 (*1)https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest ©Alphadrive Co.,Ltd. All Rights Reserved. 41
②Lambdaの開発体験が良くて最高🎉 ©Alphadrive Co.,Ltd. All Rights Reserved. 42
このようなディレクトリ構造の場合... ©Alphadrive Co.,Ltd. All Rights Reserved. 43
パスを渡すだけでLambdaをデプロイできる!🚀 ※これだけでデプロイした場合、destroyしてもCloudWatchのロググループが残るので注意 ©Alphadrive Co.,Ltd. All Rights Reserved. 44
03 Lambdaの開発体験が良くて最高🎉 aws-cdk-lib.aws-lambda-nodejs.NodejsFunction(*1)を使うと、エントリーポイントやlockファイルのpathなどを 渡すだけでTypeScriptで書いたLambdaコードをいい感じにアップロードしてくれるので楽 ● アルファ版ですが、PythonやGo版もあります ● Terraformだと、terraform_dataやnull_resourceを使うなどしてトランスパイル・ビルドを記述する 必要がある (*1)https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs.NodejsFunction.html ©Alphadrive Co.,Ltd. All Rights Reserved. 45
③CDKとStepFunctionsの相性が最高🎉 ©Alphadrive Co.,Ltd. All Rights Reserved. 46
StepFunctions、GUIでワークフロー作るのは簡単だけど IaCだとASL(*1)書くのが大変...🥲 (*1)Amazon States Language: https://docs.aws.amazon.com/step-functions/latest/dg/concepts-amazon-states-language.html ©Alphadrive Co.,Ltd. All Rights Reserved. 47
CDKならTypeScriptで書けます!👍 ©Alphadrive Co.,Ltd. All Rights Reserved. 48
作成されたStateMachine ©Alphadrive Co.,Ltd. All Rights Reserved. 49
アジェンダ 1. AlphaDriveについて 2. 私達のCI/CDパイプライン 3. 最高だったポイント 4. CDKをどの言語で書くか 5. まとめ ©Alphadrive Co.,Ltd. All Rights Reserved. 50
Q. CDKはどの言語で書けばいいの?🤔 ©Alphadrive Co.,Ltd. All Rights Reserved. 51
A. (チーム次第ですが)基本はTypeScriptにしとけ! ©Alphadrive Co.,Ltd. All Rights Reserved. 52
04 CDKはTypeScriptで書くのがおすすめという話 新規開発中のSaaSでは当初、CDKで使用する言語にGoを選択 ● バックエンドの開発言語に合わせるため ● 当時は社内のGoの知見が少なく、Goに慣れるための挑戦的な意味合いも ©Alphadrive Co.,Ltd. All Rights Reserved. 53
しかし、開発を進めていると CDK in Goでは辛い部分が...🥲 ©Alphadrive Co.,Ltd. All Rights Reserved. 54
04 辛かった点① - ポインタへの変換が面倒 Goには言語仕様上Optionalを表す型がないため、ゼロ値と未指定を区別するためにポインタへの変換が必要にな る。 Goに慣れていないメンバーからするとわかりにくい上、単純にコードの見通しが悪くなる... 左がTS、右がGoでバージョニング有効化したS3バケットを作成する例 ©Alphadrive Co.,Ltd. All Rights Reserved. 55
04 辛かった点② - Goらしくないコードがちらほら CDK in Goでは内部でjsii経由でTypeScriptの実装を呼んでいるため、各コンストラクタからエラーの値が返らず、 実行時エラーはそのままpanicする。 また、同じ理由で時間の書き方がGoのtimeパッケージでの書き方と異なり、アプリケーションコードを書く場合と若 干勝手が変わってしまっていた。 panicのメッセージを読めばエラーの内容はわかるため、開発に大きな支障があるわけではない ©Alphadrive Co.,Ltd. All Rights Reserved. 56
04 辛かった点③ - エスケープハッチに(実質)未対応 エスケープハッチ(*1)とは、抽象化により本来指定できないパラメータを指定できるようにすることでConstructを拡 張する方法のこと。 他の言語ではL2 Constructを抽象度の低いL1 Constructにキャストするなどで実現可能だが、CDK in Goではそ の方法が使えない。 一応jsii.Get(*2)関数で実現可能だが、非推奨。 本来指定できないanalyticsConfigurationsをエスケープハッチにより指定している (*1)https://docs.aws.amazon.com/cdk/v2/guide/cfn_layer.html (*2)https://pkg.go.dev/github.com/aws/jsii-runtime-go#Get ©Alphadrive Co.,Ltd. All Rights Reserved. 57
04 ではどうしたか CDK in TypeScriptに移行中(現在8割ほど移行完了) ● ほぼGoをTSに書き直すだけで移行できた🎉 ○ TS版を元にjsiiによって他言語版が展開されているためAPI構造がどの言語でも変わらず、書 き直しやすかった ● ドキュメントがTSの方が見やすく、サンプルコードもほとんどTS版なので体験は良くなった ● あくまでNot for usだっただけなので、CDKを書くメンバーのスキルセットなどと要相談 ©Alphadrive Co.,Ltd. All Rights Reserved. 58
アジェンダ 1. AlphaDriveについて 2. 私達のCI/CDパイプライン 3. 最高だったポイント 4. CDKをどの言語で書くか 5. まとめ ©Alphadrive Co.,Ltd. All Rights Reserved. 59
�� �� ©Alphadrive Co.,Ltd. All Rights Reserved. �� �� 60
ご清聴ありがとうございました🎉 ©Alphadrive Co.,Ltd. All Rights Reserved. 61