Slide 1

Slide 1 text

CDKを用いたモダンな ECSクラスタの構築と運用 AWS Cloud Development Kit -CDK- Meetup id:cohalz

Slide 2

Slide 2 text

自己紹介 ・id:cohalz / @cohalz ・株式会社はてな 2018年新卒入社 ・システムプラットフォーム部 SRE

Slide 3

Slide 3 text

よくCDKのコントリビュートしてます

Slide 4

Slide 4 text

話すこと 1. どうしてCDKを採用したか 2. ECSのライブラリを作る 3. CDKを使ったデプロイ手法 4. 開発時にやったこと

Slide 5

Slide 5 text

1. どうしてCDKを採用したか

Slide 6

Slide 6 text

社内のコンテナ事情について

Slide 7

Slide 7 text

社内のコンテナ事情について ・クラウド環境は主にAWS ・アプリケーションのコンテナ化を進めている ・既に一部のチームでECSの運用実績がある => ECSを採用していく予定

Slide 8

Slide 8 text

どうやって知見を横展開するか?

Slide 9

Slide 9 text

どうやって知見を横展開するか? ・サービスそれぞれで要求される特性が違う  ・サービスごとにECSクラスタを分けることになりそう ・今までCFnで管理をしていたけど,どう展開する?

Slide 10

Slide 10 text

CloudFormationを横展開するのは大変 ・CFnテンプレートを配って都度書き換えていく? ・特にECSは関連コンポーネントが多くて大変

Slide 11

Slide 11 text

CloudFormationに代わるもの ・横展開しやすいもの  ・IaCできるもの ・学習コストは下げたい

Slide 12

Slide 12 text

ということでCDKを採用

Slide 13

Slide 13 text

CDKの採用 ・独自の言語で書く必要がない ・パッケージ化して配布できる ・CFnテンプレートを出力可能  ・もし撤退したくなってもやりやすい

Slide 14

Slide 14 text

CDKの強力なCLIツール ・IAM・SG周りの変更で警告を出せる  ・ECSはコンポーネントが多くなるので特に役立つ

Slide 15

Slide 15 text

2. ECSのライブラリを作る

Slide 16

Slide 16 text

ECSのライブラリを作る ・公式のライブラリはあったが機能が足りない ・拡張してより使いやすいライブラリを作ることに

Slide 17

Slide 17 text

ライブラリに組み込んだ機能 ・ecs.configを使いやすく書き換え ・ホスト名わかりやすくする ・ローリングアップデート対応 ・SSMエージェントの導入 ・スポットインスタンス対応 などなど

Slide 18

Slide 18 text

その他の機能

Slide 19

Slide 19 text

ECS運用の課題 ・インスタンスにファイルをデプロイしたいことがある  ・SSHキーや監視のエージェントなど ・定期的にパッケージのアップデートもしたい

Slide 20

Slide 20 text

デプロイしたいタイミングって? ・クラスタを作ったとき ・ファイルを変更したとき ・オートスケーリングしたとき

Slide 21

Slide 21 text

解決案 ・ユーザデータ? ・cfn-initとcfn-signal? ・ChefやAnsibleなどのツール経由?

Slide 22

Slide 22 text

(再掲)デプロイしたいタイミングって? ・クラスタを作ったとき ・ファイルを変更したとき ・オートスケーリングしたとき

Slide 23

Slide 23 text

(再掲)デプロイしたいタイミングって? ・クラスタを作ったとき ・ファイルを変更したとき ・オートスケーリングしたとき => これらのツールでは対応が難しかった

Slide 24

Slide 24 text

これもCDKで解決

Slide 25

Slide 25 text

これもCDKで解決 ・CDKでデプロイできるものを作った ・ディレクトリとデプロイ先(タグ)を指定するだけで使える

Slide 26

Slide 26 text

裏側の構成 ・CDKからこういう構成が作られる

Slide 27

Slide 27 text

CDKでファイルをS3にアップロード BucketDeploymentを使うとデプロイ時にアップロードできる

Slide 28

Slide 28 text

S3のPUTイベントをCloudWatch Eventsに流す ・CloudTrail経由でイベントを取得

Slide 29

Slide 29 text

イベント時にs3 syncする ・Systems Manager経由で各インスタンスからs3 sync

Slide 30

Slide 30 text

嬉しいところ ・SSMの関連付けはインスタンス起動時にも実行してくれる ・対象をタグで決めるのでインスタンスを意識しなくて済む ・利用者は別にこの構成を知らなくても使える

Slide 31

Slide 31 text

シェルスクリプトを実行 ・s3 sync後に自動でシェルスクリプトを実行できる  ・パッケージアップデート  ・監視エージェントの追加

Slide 32

Slide 32 text

OSSで公開してます https://github.com/cohalz/cirrocumulus

Slide 33

Slide 33 text

3. CDKを使ったデプロイ手法

Slide 34

Slide 34 text

GitOpsの手法をECS+CDKで構築

Slide 35

Slide 35 text

GitOps by ECS+CDK

Slide 36

Slide 36 text

GitOps by ECS+CDKのポイント ・アプリケーションとCDKのリポジトリを分ける ・CDKコマンドはCodeBuildから実行  ・手元からは実行しない

Slide 37

Slide 37 text

CodeBuildがAppイメージをECRにpush

Slide 38

Slide 38 text

AppとCDKのリポジトリを分ける

Slide 39

Slide 39 text

masterの変更をトリガーにCDKリポジトリにPR

Slide 40

Slide 40 text

PR内容 ・最新のイメージを使うような変更をbotが作る

Slide 41

Slide 41 text

PRとともにstaging環境が自動更新

Slide 42

Slide 42 text

PRがマージされたら自動で本番環境が更新

Slide 43

Slide 43 text

嬉しかったこと ・アプリケーションとインフラのコードを分離 ・インフラの構成がGitリポジトリをマスターに ・CDKはCFnベースなので失敗してもロールバック可能

Slide 44

Slide 44 text

これからの課題 ・cdk diffをどうやって確認するか? ・この仕組み自体はまだ手作り

Slide 45

Slide 45 text

4. 開発時にやったこと

Slide 46

Slide 46 text

開発時にやったこと ・テストにJestのスナップショットテストを使う ・アップデートやバグへの対応

Slide 47

Slide 47 text

Jestのスナップショットテストを使う ・生成されるCFnが以前と変わっていないかをテスト ・テストの網羅性も高く,実装も簡単

Slide 48

Slide 48 text

ライブラリアップデート時 ・Renovateと組み合わせてテスト通れば自動マージ

Slide 49

Slide 49 text

アップデートやバグへの対応 ・Slackで #aws-cdk チャンネルを作って情報共有 ・複数チームで並行して試していたので知見が貯まっていく

Slide 50

Slide 50 text

アップデートやバグへの対応 ・結構壊れるので積極的にバグ報告やPRをする

Slide 51

Slide 51 text

バージョンを固定して使うことも ・最終的にはCFnなので,実際そこまで困らない ・今はGAになったので全部上げていってるタイミング

Slide 52

Slide 52 text

まとめ ・CDKは仕組みをライブラリとして提供しやすい  ・CFnが慣れた言語で書ける以上のメリットがある ・IaCとそのデプロイツールとしても利用できて便利 ・まだまだ出たばかりなので知見共有は大事  ・社外事例待ってます!