Infrastructure as Code変遷 ~ やるようになったこと・やらなくなったこと
Infra Study Meetup #1
Apr 24th, 2020
Profile
【宣伝】Nature Remo買ってください!
- エンジニアも絶賛募集中です
- 同時接続10万台を超えるIoTサービスの裏側を一緒に開発しませんか!
【宣伝】github.com/natureglobal/realip
【宣伝】ghq handbookをよろしくおねがいします
本題
アジェンダ
- なぜInfractracture as Codeなのか
- 私とInfrastructure as Code
- 仮想マシンからクラウドで
- Nature社ではどうしているか
- まとめ
なぜInfractracture as Codeなのか
人間には信頼性がないことが知られています
-- データ指向アプリケーションデザイン
全てをコード化する
Define everything as code
-- Infrastructure as Code 2nd Edition
理想と現実
- コードは書いた瞬間に負債となる
- コードを書く万能感に多くの人がやられてしまった (IaC疲れ)
- 過度な抽象化やモジュール化がもたらす複雑な依存関係
- テストの難しさ
- 多くが反省して自重するように
どう付き合っていくか
- 負債になりづらくする工夫
- コードをなるべく書かない
- 複雑にしすぎない
- 如何に関心事にフォーカスするか
私とInfrastructure as Code
当初のIaC
- 2011年頃
- Server Configuration Tools中心
- 仮想マシンをインフラチームに「お願い」して用意してもらって、それに対してChefを書いて当てる
- 今から思うとまだまだ未熟なフロー
- それでもChefは感動モノだった
- その後 Packer等を利用したゴールデンイメージパターンも
Chefの感動
- コードでサーバーのセットアップができる
- サーバー触るの得意じゃない人からすると僥倖
- アプリケーション畑なのでコードを書くのは比較的得意
今からすると困っていたこと
- アプリケーションの配置設定などは手作業になりがち
- Rubyでかっこよく書きすぎる
- 冪等性幻想
仮想マシンからクラウドへ
Server Configuration Tool(Provisioningツール)こそがIaCか?
- 当時の個人的な大きな誤解
- クラウドは仮想マシンをホストするサービス「ではなかった」
書籍「Infrastructure as Code」の4象限
- Dynamic Infrastructure Platforms
- Infrastructure Orchestration Tools
- Server Configuration Tools ←Provisioningツールはこの領域のみ
- Infrastructure Services
ただし、2nd Editionではこの言及は消えている
クラウドがもたらしたもの
- 多くのものを隠蔽してくれる
- サーバーすら隠蔽する
- 各種クラウドコンポーネント化
- 関心事を減らせるメリット
- あらゆるリソースをAPIで扱える
- 自動化
- "Define everything as Code" の実現
コンテナがもたらしたもの
- 隔離性(isolation)と可搬性(portability)
- ImmutableでありDisposableな特性(制約)を備えていた
- オーケストレーションレイヤー(k8s, ECS)の成熟により関心の分離が簡単に
Nature社ではどうしているか
現状の構成
方針
- ほぼECSでやる (勿論RDSやELB等、使えるクラウドコンポーネントもフル活用する)
- 常駐プロセスは全部コンテナで動かす
- 依存パッケージはそれぞれのコンテナ内で入れる
- → ホストマシンには自分では何も入れない
- バッチはECSのScheduled Taskで
Provisioningしなくなった
- Packer, ChefやAnsibleとの決別
- 「達人はコードを書かない」(とか言いつつ嬉々としてコードを書く)
- Amazon Linux2 ECS-optimized AMIの最新を使うのみ
- 「Provisioningを自分でしなくなった」のは大きな体験だった
- 複雑なProvisioningフェーズが不要になった
- 立てれば勝手にECSクラスタにジョイン
- 停止もカジュアルに可能
- → 仮想サーバー自体のライフサイクルも短くできる
ECS Task Definitions as Code
- コンテナの配置にecspressoを利用することでTask Definitionsのコード管理が容易に
- Dockerfile及びECS Task Definitionsをリポジトリ管理
アプリケーション以外のコンポーネントも全てコンテナとして配置
- Nginx (内部proxy)
- katsubushi (採番デーモン)
- datadog-agent (監視エージェント)
- 独自監視コンテナ
- これらも ecspressoでサクッと立てられる のは体験が良い
監視のコード化は「やるようになった」こと
アプリケーションの計測を始めれば、もう病みつきになります
-- 入門監視
- 監視はアプリケーション開発者の責務の一つとなった
- 吊るしのミドルウェアに対する吊るしの監視設定だけでは不十分
- 自分のコンポーネントに対する監視を自分で作る
health endpoint patternとOpen Metrics
Datadog agentによる監視対象のディスカバリ
- Task DefinitionにdockerLabelsを定義
- datadog agentがディスカバリしてメトリクスの収集を自動でやってくれる
- メトリクスを吐いておけば勝手に見つけて収集してくれる のは良い体験
Open Metricsの場合
アプリケーションサーバーの場合。
"dockerLabels": {
"com.datadoghq.ad.instances": "[{\"prometheus_url\":
\"http://%%host%%:%%port%%/status/metrics\",
\"namespace\":\"api\",\"metrics\":[\"*\"]}]",
"com.datadoghq.ad.check_names": "[\"openmetrics\"]",
"com.datadoghq.ad.init_configs": "[{}]",
"name": "api"
},
katsubushiの場合
katsubushiはmemcachedプロトコルをしゃべる採番デーモンで監視もmemcachedプロトコルでできるスグレモノ。
"dockerLabels": {
"com.datadoghq.ad.check_names": "[\"mcache\"]",
"com.datadoghq.ad.init_configs": "[{}]",
"com.datadoghq.ad.instances": "[{\"url\": \"%%host%%\",\"port\": \"11212\"}]"
},
元々はSTATはtext protocolにしか対応していなかったが、datadog agentがbinaryプロトコルで取りに来るので、pull requestを送って対応してもらった。
https://github.com/kayac/go-katsubushi/pull/40
Nginxの場合
Dockerfileのラベルに直接指定(特に理由はない)
LABEL "com.datadoghq.ad.check_names"='["nginx"]'
LABEL "com.datadoghq.ad.instances"='[{"nginx_status_url":"http://%%host%%:%%port%%/nginx_status"}]'
LABEL "com.datadoghq.ad.init_configs"='[{}]'
まとめ
Infrastructure as Codeを実現する上での個人的ポイント
- コントローラブルなレイヤでコントロールする
- 管理レイヤーを増やしすぎない
- →Nature社ではECS上で頑張り、コンテナオーケストレーションレイヤーより下の基盤周りは関心事の外に置いた
今後の展望
- リソースの管理もよりちゃんとコード化する
- Fargate/サーバーレスに寄せる?
- メトリクス以外の監視の強化
結論
- Define everything as code の実現で大事なこと
- 当初ホットだったサーバープロビジョニングは「やらなくなった」
- コンテナオーケストレーションレイヤー上に多くを任せるように
- ECSのタスク定義のコード管理を「やるようになった」
- 監視設定及びそのコード化を自分たちで「やるようになった」
- アプリケーション側から簡単に監視設定ができるのは体験が良い
以上