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

ECS on Fargate構築の課題と解決策 / Challenges and Solutions for Building ECS on Fargate

ECS on Fargate構築の課題と解決策 / Challenges and Solutions for Building ECS on Fargate

第30回JAWS-UG札幌勉強会の発表資料。

Kazunori Inaba

July 03, 2023
Tweet

More Decks by Kazunori Inaba

Other Decks in Technology

Transcript

  1. 2023/6/30 Kazunori Inaba 稲葉 一紀 (Kazunori Inaba) • サーバーインフラ専門のフリーランスエンジニア@札幌 •

    AWS認定は Solutions Architect Association (SAA) 1冠 • 屋号: 稲葉サーバーデザイン (2013-) https://inaba-serverdesign.jp/ 2 自己紹介
  2. はじめに 2023/6/30 Kazunori Inaba • 医療・介護・福祉系SNSのサーバー構築(移行)。 • 担当者: アプリ開発担当(アプリ開発とアプリコンテナ作成)と稲葉 (AWS構築)の2人。

    • 2人とも、はじめてのECS構築。 • コンテナ実行環境を用意するだけなので簡単だと思っていた。 → 機能名にとまどったり、構築作業中に課題やリクエストが出てき たりで意外と大変だった! • ECS on Fargate構築時の課題と解決策についてお話します。 ※スライドは後日Speaker Deckにアップします。 https://speakerdeck.com/kazunoriinaba/ ※ブログ書きました。 https://inaba-serverdesign.jp/blog/20230607/aws-ecs-fargate.html 4
  3. 構築時の課題いろいろ 2023/6/30 Kazunori Inaba 1. ECS構成要素の理解 2. アプリケーション環境変数の渡し方 3. タスクロールとタスク実行ロール

    4. 稼働中のコンテナでデバッグ 5. ログ振り分け 6. 外部アクセス時のアクセス元IPアドレス固定 6
  4. 課題1. ECS構成要素の理解(1) 2023/6/30 Kazunori Inaba いざ、ECSを構築しようとすると出てくる構成要素の用語 • クラスター • サービス

    • タスク • タスク定義 • コンテナ ↑抽象的なネーミングで、最初はわかりにくいような。。 7
  5. 課題1. ECS構成要素の理解(2) 2023/6/30 Kazunori Inaba • 「サービス」が中心と考えると理解しやすい • ECSとは、 •

    クラスター(=複数EC2インスタンスの集合またはFargate)の上で、 • Dockerコンテナを使って、 • サービスを動作させる もの (参考記事より引用、一部変更) • Amazon EC2 Container Service(ECS)の概念整理 - Qiita https://qiita.com/NewGyu/items/9597ed2eda763bd504d7 8
  6. 課題1. ECS構成要素の理解(3) 2023/6/30 Kazunori Inaba (参考) • Amazon EC2 Container

    Service(ECS) の デ ー タ モ デ ル に つ い て 整 理 し た - DevelopersIO https://dev.classmethod.jp/articles/amazon-ecs-datamodel/ • どの構成要素が、どの属性をもっているかについては、AWSCLIや Terraformのドキュメントを読むと、理解しやすいのでは。 9
  7. 課題2. アプリケーション環境変数の渡し方 2023/6/30 Kazunori Inaba • 3つの方法 A. タスク定義で指定 B.

    Secrets Manager または Systems Managerパラメータストアを使 用 C. S3バケットに保存した環境変数ファイルを参照 • 今回は、アプリケーションが扱いやすい C. を選択。 • 環境変数ファイル専用のS3バケットを用意して、「タスク実行ロー ル」に専用S3バケット参照権限を追加。 10
  8. 課題3. タスクロールとタスク実行ロール(2) 2023/6/30 Kazunori Inaba • タスクロール • コンテナ化されたアプリケーションが、 AWSリソースにアクセスするために

    必要な権限を管理する。 • 今回ロールに付与した権限(ポリシー) - フロントエンド、画像配信用S3バケットの読み書き - ジョブ管理用SQSキューの読み書き - ECS Exec実行に必要な権限(ログ出力含む) - FireLens Fluent BitコンテナからCloudWach Logsへのログ出力 12
  9. 課題3. タスクロールとタスク実行ロール(3) 2023/6/30 Kazunori Inaba • タスク実行ロール • (アプリケーションコンテナの外側で) ECSコンテナエージェントが、コンテナを

    起動・実行するときに、AWSリソースに アクセスするために必要な権限を管理する。 • 今回ロールに付与した権限(ポリシー) - S3バケットの環境変数ファイル取得 - AmazonECSTaskExecutionRolePolicy(AWSがデフォルトで用意した、タ スク実行に必要な最小限のポリシー。ECRからのコンテナイメージダウンロ ードやCloudWatch Logsへのログ出力など) 13
  10. 課題4. 稼働中のコンテナでデバッグ 2023/6/30 Kazunori Inaba • Fargateではホストサーバーにログインできないので無理では? → ECS Execで可能!

    • docker execのように、実行中のコンテナに対して、AWS CLIでコマンドを実 行できる機能。 • ECS Exec機能はデフォルトでは無効。AWS CLIで有効化する。 (なぜかマネジメントコンソールで設定できない。。) • ECS「タスクロール」に、ECS Exec実行に必要な権限を付与。 • ECS Execコマンド → AWS Cloud Shell等で実行。 14 $ aws ecs execute-command ¥ --cluster <クラスター名> ¥ --task <タスクID> ¥ --container <コンテナ名> ¥ --interactive ¥ --command “<コマンド>”
  11. 課題5. ログ振り分け(1) 2023/6/30 Kazunori Inaba • デ フ ォ ル

    ト で は 、 コ ン テ ナ の 標 準 出 力 と 標 準 エ ラ ー 出 力 が 、 CloudWatch Logsの1つのロググループに出力される。 • 一度のログ出力が複数行に分かれる。 • ヘルスチェックなど、重要でないものも含め大量のログレコードがある。 → そのままでは調査しにくい。 • FireLens (Fluent Bit)を利用して、CloudWatch Logsの複数のログ グループに振り分け。 • 「アプリ」 「ワーカー」 「ヘルスチェック」「SQSポーリング」といった処 理ごとにロググループを分け、保存期間を個別に設定。 15
  12. 課題5. ログ振り分け(2) 2023/6/30 Kazunori Inaba • FireLens • アプリケーションコンテナと同じ タスク内にログ収集用コンテナを

    設置(「サイドカー」)。 • ログ収集用コンテナ: Fluent Bit or Fluentdを選択 • Fluent BitまたはFluentdの設定で、ログ振り分けルールを記載。 • Kinesis Firehose経由でS3へのログ振り分けも可能。 • AWSマネジメントコンソールでは、FireLensの設定は旧UIで。 • (ECS「タスク実行ロール」ではなく)ECS「タスクロール」にCloudWatch Logsへの書き込み権限を付与する。 16
  13. 課題5. ログ振り分け(3) 2023/6/30 Kazunori Inaba • ログ複数行問題 • アプリケーション側で一度のログをJSON形式の1レコードにまとめる。 (参考)

    • Rails on ECSな構成でFluent Bitを利用して快適なロギングを実現する https://zenn.dev/machamp/articles/50ed6bc383539c • Fluent BitのMuitilineフィルターでも対応可? 17
  14. 課題6. 外部アクセス時のアクセス元IPアドレス固定(2) 2023/6/30 Kazunori Inaba • NATゲートウェイ利用時の注意点 • 外部インターネットへの通信のほか、VPC外のAWSサービスへの通信もNATゲ ートウェイの処理量課金の対象となる。

    - ECRからのコンテナイメージダウンロード - CloudWatch Logsへのログ出力 - S3への静的コンテンツアップロード、ダウンロード - SQSキューへのアクセス • In/Outの処理量合計に対する課金 $0.062/GB 19
  15. 課題6. 外部アクセス時のアクセス元IPアドレス固定(3) 2023/6/30 Kazunori Inaba • AWSサービスへの通信をVPCエンドポイント経由とすれば、NATゲー トウェイ課金がなくなる。 • でも、VPCエンドポイントも起動時間・処理量の課金がある。

    • 今回は、S3との通信のみVPCエンドポイント(ゲートウェイ型、無料)を利用。 • NATゲートウェイのIn/Out処理量を CloudWatchダッシュボードで監視。 • ECS Scheduled Taskを使用する、コンテナの増減が 多いなど、イメージダウンロード機会が多い場合は、 ECR用のVPCエンドポイントの利用を。 (参考) ・ECS/Fargate VPCエンドポイントとNAT ゲートウェイの損益分岐点をざっくり計算してみた - スクショはつらいよ https://chariosan.com/2022/03/29/ecs_fargate_vpc_endpoint_cost_bep/ 20
  16. ECSを採用してよかったこと(1) 2023/6/30 Kazunori Inaba 【アプリ開発担当者の声】 • PC開発環境にDockerを初導入。 • コンテナをDBサーバー、バックエンド(API)、フロントエンドに分割して開発 (本番環境ではそれぞれ、RDS,

    ECS, S3に相当)。 • デプロイ作業はバックエンドのみをECSにデプロイできるので簡単。 • デプロイ、ロールバックが楽になった。 • 旧: Capistranoを利用し、Gitに一旦デプロイしてマージ。 • 現: コンテナをビルドしてECRにアップロードし、Webコンソールでデプロイ までできる。ロールバックはサービスのリビジョン変更で簡単。 • デプロイ時に不具合があっても、自動的にロールバックされるので安心 (サーキットブレーカー機能)。 21
  17. ECSを採用してよかったこと(2) 2023/6/30 Kazunori Inaba 【アプリ開発担当者の声】 • 環境変数を1ファイルにまとめて切り分けられる。 • コンテナのビルドと環境変数の設定変更を別々に行える。 •

    ログ出力を振り分け、コンソールで検索できるので、エラーの原因究明 が早くなった。 ↑「ECSがよかった」というよりは「これを機にコンテナ化、ログ精査 に取り組んだ」ことによるメリットが大きい。 運用のメリットはこれから実感できる? 22
  18. まとめ 2023/6/30 Kazunori Inaba • ECS on Fargate構築時の課題と解決策、ECSを採用してよかったこと についてお話しました。 •

    アプリケーションのコンテナ化とECS構築、最初は大変かもしれない けど、一度やってみれば慣れるはず。 • インターネット上の情報も多い。 一度トライしてみては? 23