Load to Professional...

AWSエンジニアの日常。地に足をつける。

【勉強会メモ】AKIBA.AWS ONLINE #03 -IaC を語りたい 編- に参加しました

こんにちは、IaC経験は下記で、ほぼ初心者のAshisanです。

  • Ansible(運用で少々)
  • AWS CloudFormation(構築で少々)

今日は、クラスメソッド株式会社のオンライン勉強会「AKIBAAWS ONLINE」に参加しました。

dev.classmethod.jp

このイベントは3回目で過去3回とも全て参加していますが、特にアウトプットしていなかったのですが、特に今回は勉強中のIaCがテーマということで特別楽しみでした!

そんなこんなで今回からレポートを書こう!と思い立ち、早速記事(ほぼメモですが)にしました。


レポート

1. IaCで全てが上手くいくと思うなよ!失敗事例のご紹介

Speaker:mokoさん

初めに
  • いきなりまとめ
    • 「IaCは手段であり、目標である」
    • 「何も考えないでIaCにすると後悔する」
    • 「リソースを素手で触らない強い意志」
IaCとは?
  • IaC= Infrastracture As Code
対象範囲
  • AWS環境のコード化のみ触れる ※OSミドルについては対象外
IaCツールの比較
  • Terraform
  • CloudFormation
    • いいところ:yml、jsonで書ける(簡単)
    • 悪いところ:単純な繰り返しも書きづらい
  • CDK
    • 慣れた言語からCFnを実行できる
  • その他
    • AWS SAM
    • Severless Flamework
あるある失敗
  • メンバがIaC未経験の場合
    • IaCは明示的にパラメータを入れなきゃいけない
      • さくっとコンソールから作ることばっかやってるとできない
      • CDKならいい感じに作れるが、暗黙で作られるリソースの把握が大事
    • 学習コストの発生は時間が解決してくれる(1ヶ月もやればそのうち慣れる)
  • IaCが目的
    • IaCでやらなくてもいいのに、頑張ってIaCにしちゃう
      • 構成管理不要なのに、無駄に頑張っちゃう
      • 結果マネコンでやったほうが運用しやすかったりする
    • とはいえIaCにするメリットはたくさんあるので、目標に設定するのはあり
  • 手動オペレーションしちゃう
    • 一番あるある
    • IaCで管理しているリソースをまねこんから変更しちゃった(まずい)
      • 環境を見て差分うめはできるので、なんとかできる
    • IaCでリソース管理してるけど、デプロイが手動
      • 一番良くない!
    • とある事故(あるある失敗例):手動オペレーションで破綻
      • スタック(ファイル)分割ができる
      • スタック間のパラメータ連携はOutputs(まねこんの出力)をみてやってる
        • 画像参照、参照されていない順にデプロイする必要がある
        • ダウンタイム無しで真ん中のインスタンスを入れ替えたい
          • どうすんの??
          • 手動オペレーションを含んだややこしい手順
        • なぜこうなったか→依存関係がごちゃごちゃ
        • CFnのスタックはライフサイクルごとに管理しろ
        • EC2とALBは同じスタックでもいいが、規模が大きいとコード量がやばい
        • Nested Stackも最近できるようになったが、、、
          • 子スタックの更新差分まで見れるのは最近になってやっと
      • 規模が大きい場合はTerraformを推奨
        • 深澤さんのセッションで詳しくは解説
IaCのメリット、デメリット
  • メリット

    • 手動オペによる人的ミスの最小化
      • コードレビューできる
      • デプロイも自動化
      • プルリクでエビデンス残せる
    • 管理されていないリソースができない
      • 謎のリソース、野良インスタンスができない
        • これ誰が作ったの???がなくなる
    • コピペでサクサク作れる
      • 他PJでも横展開が簡単
    • これら全て、正しくIaCを使った場合のみ享受できる
  • デメリット

    • コードに起こすのしんどい
    • 設計きちんと考えなきゃいけない
    • IaCでの運用投げ出しがち
mokoさん流IaCベストプラクティス
  • IaCとの付き合い方を決める
    • 構築だけIaC
    • IaC使って運用する
  • IaCもCI/CDする
    • Gitを正しく使う
      • レビューきちんとやろう
    • CI/CD環境を整える
      • Linterいれたり
      • Mergeしたら自動デプロイさせたり
      • 手動デプロイは甘え!!!オペミスの根本原因
    • Terraform Cloudってのもあるよ
  • AWS環境は素手で触らない(超重要)
    • AWS環境は素手で触らない(超超重要)
      • 触っちゃうと苦労が水の泡に
      • 差分をコードに起こすとかも不毛なのでやめよう
    • マネコンのIAMはReadOnlyにする
      • 本当に必要なときだけAdmin権限を取得するようにする、物理的にさわれないようにする
  • スケーリングさせる(少し関係ない話)
    • AWSの強みは好きなタイミングで、早く調達できるところ
    • せっかくクラウド使うならスケーリングできるようにアプリを改修しよう
  • アプリのデプロイとIaCは別で考える
    • アプリはアプリのCi/CDパイプラインで完結させる
      • デプロイのためにIaCを触るのはしんどいから分離しよう
    • インフラとアプリの境界線はしっかり引く
    • アプリとセットで作れるツールの場合はセットで考えよう
      • CDK/Copilit/SAM
まとめ
  • IaCはメリットがでかいからみんなつかおう
  • ある程度注意すればOKだよ
  • せっかくAWS使いならいい環境にしよう
    • スケーリング、CI/CD

2.Former2でコード生成してGUIポチポチ卒業の第一歩を(仮)

Speaker:inomasoさん

想定視聴者
  • 手作業環境構築につかれた人
  • IaCに興味があるけど、、な人
  • 構築済みなAWS環境を持ってる人
ゴール
  • GUIポチポチ卒業
IaCとは
  • インフラをコードで記述すること
  • 最初はシステム管理の自動化だけが焦点、いまはプラットフォームまで拡大
formar2ってなに?
  • ブラウザベースのサービス
  • AWSの認証情報をつかって
  • セットアップ方法
    • IAMアクセスキー、シークレットキー入力がある!?
      • 大丈夫なん?
    • 絶対外部に送信しないから大丈夫だよ、だそう
    • とはいえ、抵抗がある人へ
      • ローカルのDockerでFormar2コンテナを起動できるよ
既存リソースのコード化
  • EC2の場合
    • ボタンポチポチでTerraformのコードが自動でできる
    • CFnでも出力可能
自動生成コードの注意点
  • 再利用のときは注意してね
  • リソースID指定
    • リソースIDがそのまま出るので、新規作成時に使いまわしするとエラーになる
    • 「リソースの種類.任意のリソース名.id」で指定すればOK
  • IAMポリシー
    • IAMポリシーがテキストで出力される
    • 共通のポリシーを使い回すときは管理が煩雑に
      • 解決策:JSONでポリシードキュメントを書こう
まとめ
  • Formar2は銀の弾丸じゃないよ
  • まず小規模環境から、IaCを始めるきっかけに
  • 検証環境をとりあえずコード化するのは便利

3. TerraformとCloudFormationどちらを採用すべき?

Speaker:深澤俊さん

  • Terraform vs CFn
前提
  • 納品物に指定ある?
  • メンバでメンテできますか など
CloudFornationとは
  • AWS
  • json、ymlで書ける
  • AWS上で実行できる
Terraformとは
  • Hashicorp製
  • HCLで書ける
  • ローカルPC上で実行
    • キーの管理を考えないといけない
    • EC2上でやる or スイッチロールでセキュアな認証ができる
違い
  • 異なるリージョン、アカウントへのデプロイ
    • CFn:StackSetsを使う
    • Terra:異なるProviderを使う
    • AWS内でのIaCならCFnはデプロイしやすい
    • 異なるIaaSへのデプロイ
      • Terraformしかできない
  • 差分検出
    • IaC管理してるが、つい手作業で修正しちゃうことはよくある →どう検出する?
    • CFn:ドリフト検出
      • AWSサービスでできるので楽
    • Terra:Planコマンドを使って差分比較
      • 作り込みが必要
  • ロジック
  • 排他制御
    • 同時実行時の上書き
    • 複数人運用のときに大切
    • CFn:ステータスが変わるのでわかる
    • Terra:排他制御できる
      • Stackをどこにおくか
      • DynamoDB Lockを使えば排他制御可能
  • バージョン管理
    • うまく管理する必要あり
      • 環境差異をなくす、最新への追従
      • CFn:管理しなくていい
      • Terra:Terraform自体とProviderのバージョン管理する必要あり
        • 言語のバージョン管理に似ている
  • 開発ツール
    • シンタックスエラーは検知したい
    • IDEに入れたい
    • CFn:
      • Linter
      • 正しい形式化
      • バグはないか
      • 他実装方法の提案
      • IDEに入る
        • VSCordなど
    • Terra;
      • コマンドに自動補正
      • 自動構文修正
      • Linter
      • セキュリティチェックツール
      • IDEにはいる
        • VSCordなど
まとめ
  • CFn
    • 複雑な処理はむずい
    • AWSと親和性が高い
  • Terra

全体まとめ

  • IaCにもいろいろあるが時と場合によって使い分けよう
  • IaCを使うには制約を受け入れる覚悟が必要
  • 大変だがIaCはとてもいいもの
  • 結論:みんな、IaCを使おう!