Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

cohalz
July 18, 2019

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

AWS Cloud Development Kit -CDK- Meetup
https://awsclouddevelopmentkitcdkmeetu.splashthat.com
の発表資料です
資料で言及したライブラリはこちら https://github.com/cohalz/cirrocumulus

cohalz

July 18, 2019
Tweet

More Decks by cohalz

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. ということでCDKを採用

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. その他の機能

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. これもCDKで解決

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34. GitOpsの手法をECS+CDKで構築

    View Slide

  35. GitOps by ECS+CDK

    View Slide

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

    View Slide

  37. CodeBuildがAppイメージをECRにpush

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  45. 4. 開発時にやったこと

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide