Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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とそのデプロイツールとしても利用できて便利 ・まだまだ出たばかりなので知見共有は大事 ・社外事例待ってます!