はじめに
本構成の続編「ぼくのかんがえたさいきょうの DevOps 実現構成」を公開しました!
AWSのインフラを運用・監視する上で使いやすいと思ったサービスを組み合わせて構成図を作成しました。それぞれのサービスの簡単な説明と類似サービスの紹介、また構成の詳細について説明していきます。
(開発で使用するようなサービスも紹介しますが、あくまでも運用・監視だけの構成です。)
各個人・企業によって環境は違うと思いますし、使いやすいと思うサービスは人それぞれだと思うので、これが正解という訳ではありませんが、参考にしてただければ幸いです。
参考になった教材を紹介した記事も作成しました。是非読んでみてください!
全体図
こちらがAWSにおける"ぼくのかんがえたさいきょうの"運用・監視構成です。複雑で分かりづらいかと思うので、詳細に説明していきます。最後まで読めばこの図もすべて理解できるはずです。。
ちなみに四角で囲まれているのはOSS(オープンソースソフトウェア)です。OSSをいくつか使用することで、AWSによるベンダーロックインをなるべく最小限にし、CloudWatchやDatadog、New Relic等のSaaSを使用した監視よりも料金が抑えられ、より柔軟な監視が行えます。(その分学習コストはかかってしまいますが...。)
こちらは先ほどの構成図を簡略化しました。
この図で伝えたいのは以下の通りです。
- 監視はすべてGrafanaに一元化
- AWS Lambda等を使った運用の自動化
- AWS Amplifyを使った独自ツールの開発
- AWS CodePipelineを活用してTerraformやAnsibleでの構築
- AWS IAM Identity Center(旧AWS SSO)を使ってすべてのアカウント管理
これらをそれぞれ詳細に説明していきたいと思います。
Grafanaで監視の一元化
GrafanaというOSSを利用して、メトリクス、ログ、トレース、セキュリティ、コストの監視を行います。
Grafanaとは
Grafana
GrafanaとはGrafana Labsが公開しているデータ可視化のオープンソースソフトウェアです。
Grafanaは様々なデータソースを可視化できるので、このGrafanaを使用してすべての監視項目を集約して可視化します。それぞれのサービスについては後ほど説明します。
Grafana Cloud
先ほどの図の上4つのサービス(Grafana、Prometheus、Loki、Tempo)をGrafana Labsがマネージドサービスとして提供しているのがGrafana Cloudです。
内部的にはAWS、Azure、GCPのいずれかを使用して動かしており、登録の際に選択できます。(AWSはAdvancedプランでのみ選択可能。)
AWSのGrafanaとPrometheus
GrafanaとPrometheusはAWSでもマネージドサービスとして提供されているのでこちらもおすすめです。Grafanaに関しては、最新バージョンが使用できる、プラグインが利用できるという点から個人的にはGrafana Cloudの方が使いやすいです。
AWSマネージドのGrafanaはGrafana Labsとの共同開発なので、今後Grafana Cloudのように最新バージョンが利用出来たり、プラグインが利用出来たりするかもしれません。
メトリクス監視
メトリクス監視では以下のサービスを使用します。
Prometheus
Prometheusはメトリクスを収集するOSSでCloud Native Computing Foundation(CNCF)のプロジェクトです。LinuxやApache、MySQL等のメトリクスを取得する様々なExporterが用意されているので、目的に合ったメトリクスを収集することが出来ます。(Exporterは自分で作る事もできます。)
Prometheusの可視化には通常、Grafanaが利用されます。
ちなみにCNCFとはLinux Foundationのプロジェクトの1つで、クラウドネイティブなコンピューティングシステムを推進するための非営利団体の事です。
OpenTelemetry
OpenTelemetryはメトリクス、ログ、トレースの収集と転送を行うOSSで、こちらもCNCFのプロジェクトです。Prometheus Exporter単体だとGrafana CloudのPrometheusに送信できないので、こちらを利用して送信します。また、メトリクスのフィルタリングができるので、Grafana Cloudの利用料金も抑えられます。
メトリクス監視の構成
メトリクス監視の構成はこのようになりました。
PrometheusのExporterを利用してメトリクスを取得し、OpenTelemetry で Prometheusに送信。Grafanaで可視化します。
ECSではPrometheus Exporterを用意しなくてもOpenTelemetryをアプリケーションコンテナのサイドカーとして動かす事でアプリケーションコンテナのメトリクスを収集することが出来ます。
Amazon RDSやAWS Lambda等のマネージドサービスはAmazon CloudWatchでしかメトリクスを取得できません。
ただGrafanaだとAmazon CloudWatchのデータも可視化する事ができます。
またGrafana CloudにはAmazon CloudWatchのメトリクスをPrometheusの形式に変換して保存する方法もあります。(CloudWatch Exporterを使用すれば、Grafana CloudじゃなくてもPrometheusの形式に変換することが出来ます。)
ログ監視
ログ監視では以下のサービスを使用します。
Fluent Bit
Fluent BitはCNCFのプロジェクトであるFluentdの軽量版です。Fluentdはログの収集と分析、転送を行うOSSで、ユーザーが用意した様々なプラグインを使って機能を拡張できます。特別なプラグインを利用しない場合や大規模なシステムじゃない場合はFluent Bitの利用で問題ないかと思います。
Grafana Loki
Grafana LokiはGrafana LabsがPrometheusを参考にして開発した、ログ収集を行うOSSです。
Grafana Lokiの類似サービス
ログの収集、分析を行うツールとして有名なものには他にもElasticsearchというサービスがありますが、Grafanaとの相性がいいためGrafana Lokiを選択しました。
Fluent Bitの送信先を変更するだけで、すぐにElasticsearchでの監視に切り替えることも出来ます。
ログ監視の構成
Fluent Bitでログを取得して、Grafana Lokiに送信。Grafanaで可視化します。
ECSではFireLensというログドライバが用意されおり、こちらを利用することで簡単にFluent Bitを利用できます。メトリクス監視の時のOpenTelemetryと同様Fluent Bitもアプリケーションコンテナのサイドカーとして動かします。
メトリクスの時と同様、Amazon RDSやAWS Lambda等のマネージドサービスはAmazon CloudWatchにログが保存されますが、Grafanaで可視化できます。
またGrafana CloudだとAmazon CloudWatchのログをGrafana Lokiの形式にして保存する事も出来ます。
トレース監視
トレースとは
オブザーバビリティの3本柱の一つで、メトリクスが「何が起きているか」、ログが「なぜ問題が起きたか」を判別できるのに対し、トレースはアプリケーションが処理するリクエストに関するデータを収集することで、「どこで問題が発生したか」を判別できます。
トレース監視では以下のサービスを使用します。
Grafana Tempo
Grafana TempoはGrafana Labsが開発したトレース監視のOSSです。
Grafana Tempoの類似サービス
AWSにもAWS X-Rayというトレース監視サービスがあり、Grafanaにて参照することもできますが、Grafanaとの相性がいいためGrafana Tempoを選択しました。
また、CNCFのプロジェクトにトレース監視のOSSであるJaegerがあり、こちらもGrafanaにて参照できますが、サーバーを用意する必要があるため、Grafana Cloudにてマネージドで利用できるTempoを選択しました。
OpenTelemetryの送信先を変更するだけで、すぐにAWS X-RayやJaegerでの監視に切り替えることも出来ます。
トレース監視の構成
AWS OpenTelemetry SDKを導入しているアプリケーションからOpenTelemetryでトレースデータを取得し、Grafana Tempoに送信。Grafanaで可視化します。
ECSでも同様です。OpenTelemetryをアプリケーションコンテナのサイドカーとして動かすことでOpenTelemetry SDKを導入しているアプリケーションからトレースデータを取得します。
セキュリティ監視
セキュリティ監視では以下のサービスを使用します。
AWS Security Lake
AWS Security LakeはAWS Security HubやAWS CloudTrail等の様々なセキュリティログをOpen Cybersecurity Schema Framework (OCSF)というオープンソーススキーマの形式で保存し、集約・管理できるサービスで、AWS以外のサービスにも対応しています。
AWS Trusted Advisor
AWS Trusted Advisorはセキュリティだけでなく、コスト最適化、耐障害性、パフォーマンス、サービスの制限といったAWSのベストプラクティスに基づく5つのカテゴリにわたるチェックと推奨事項を提供するサービス。
セキュリティに関してはAWS Security Hubの結果を、コスト最適化に関してはAWS Compute Optimizerというサービスの結果を集約する事が出来ます。
OpenSearch
OpenSearchはリアルタイムのアプリケーションモニタリング、ログ分析、ウェブサイト検索などの幅広いユースケースに利用できるオープンソースの全文検索エンジン。ElasticsearchをもとにAWSが開発しました。
AWSのマネージドサービスとしてAmazon OpenSearch Serviceというサービスが用意されており、こちらにてOpenSearch Dashboardという可視化ツールも利用できるため、Grafanaを使用しなくても監視できますが、監視は全部Grafanaに統一させたいということで、今回はGrafanaにて可視化を行います。
SIEM on OpenSearch Service
SIEM on OpenSearch Serviceは先ほど紹介したAmazon OpenSearch Serviceを使用してAWSでのセキュリティインシデントを調査するためのソリューションで、Amazon S3やAWS Lambda、Amazon OpenSearch Service等のリソースがAWS CloudFormationで自動的に構築されます。
AWS Security LakeやTrusted Advisor等のログを取り込み可視化出来ます。
Falco
Falcoはサーバーに導入することで、予期しない動作、侵入、データの盗難をリアルタイムで検知するCNCFのプロジェクト。
Falcosidekickというツールを使用することで、検知したデータをAWS Security Lakeに送信できます。
Falcosidekickの送信先にはAWS Security Lakeだけでなく、Amazon S3やAWS SNS、Prometheus、Slack等も利用できます。
セキュリティ監視の構成
すべてSIEM on OpenSearch Serviceに取り込まれ、Grafanaで可視化しています。
コスト監視
コスト監視では以下のサービスを使用します。
AWS Cost and Usage Report
AWS Cost and Usage Reportはその名の通り、AWSのコストと使用状況のレポートです。Amazon S3に保存されます。
Amazon Athena
Amazon AthenaはSQLを使用してAmazon S3内のデータを直接分析できるAWSのサービス。
こちらを利用して、AWS Cost and Usage Reportのデータをクエリします。
AWS Glue
AWS Glueはデータの抽出、変換、ロードを行うAWSのサービス。Amazon AthenaでAmazon S3のクエリを行う際は、AWS GlueのCrawlerによってData Catalogが作成され、Amazon AthenaはそのData Catalogに対してクエリを行っています。
コスト監視の構成
AWS Cost and Usage Reportの結果をAmazon S3に保存。そのデータをAWS GlueとAmazon Athenaを使ってクエリし、Grafanaで可視化します。
その他監視
Synthetic monitoring
Grafana Cloudの一部として提供される合成監視のプラグイン。内部的にはPrometheusのエクスポーターであるBlackbox Exporterを利用しており、対象サーバーの死活状態に関するメトリクスとログを生成します。
保存先にはGrafana CloudのPrometheusとLokiが使用されます。
Grafana Faro
Grafana Labsが開発中のリアルユーザーモニタリングを行うOSS。リアルユーザーモニタリングとはユーザーが表示しているWebサイトやアプリケーションのパフォーマンスを監視することで、今まではバックエンドの監視でしたが、こちらはフロントエンドの監視が行えます。
ログとトレースが生成され、保存先にはGrafana CloudのLokiとTempoが使用されます。
※現在はプライベートベータ版です。
アラートの管理
AWSのアラートとGrafanaのアラートはGrafana OnCallというOSSを使って管理します。Grafana Cloudにて無料で利用できます。
Grafana OnCall
様々な監視ツールからのアラートを統合的に管理できるOSS。Grafanaのアラートだけでなく、AWSやZabbix等のアラートにも対応しており、アラートの通知先にはメールだけでなくSlackやTeams等のチャットツールや電話でのオンコールが利用できます。
Grafana OnCallの類似サービス
その他類似サービスにPagerDutyやOpsgenieというサービスがありますが、こちらは別途料金がかかるSaaSです。
Grafana OnCallは無料で利用でき、またアラートがGrafana内で完結するのでこちらを選択しました。
運用の自動化
運用自動化ができるAWSのサービス
AWSにおける運用を自動化できるサービスを紹介します。特にAWS LambdaとAWS Systems Managerは奥が深く、様々な使い方が出来ます。
AWS Lambda
AWS Lambdaはサーバレスでコードが実行できるAWSのサービス。AWS SDKを使用することで、AWSのサービスをプログラムから操作することが出来るようになります。
例えば、下の図のような流れでAWS Systems ManagerのRunCommandを呼び出し、Amazon EC2内でコマンドを実行することも出来るので、GrafanaのアラートをもとにEC2インスタンスにコマンド実行なんてことも出来ます。
AWS Systems Manager
AWS Systems ManagerはAWSのインフラ管理に役立つ機能がたくさんあるAWSのサービス。サーバー内にエージェントを導入することで、サーバーも管理できます。Amazon EC2だけでなくオンプレのサーバーでも使えます。
機能の詳細に関しては下記記事が分かりやすいです。
Amazon EventBridge
Amazon EventBridgeはAWSでの様々なイベントをトリガーにして、AWS LambdaやAWS Systems Manager、Amazon SNS等を呼び出す事が出来るAWSのサービス。
イベントだけでなくスケジュールをトリガーにして呼び出すことも出来ます。
Amazon EC2 Auto Scaling
Amazon EC2 Auto ScalingはAmazon EC2を自動でスケーリングする事が出来るAWSのサービス。スケールした際の通知はAmazon SNSに送信することが出来ます。
名前が似ていてややこしいですが、複数サービスにまたがる複数のリソースのスケーリングを管理する際はAWS Auto Scalingを利用してくださいとの事。
AWS Backup
AWS BackupはAmazon EC2やAmazon S3、Amazon RDS等のデータバックアップを一元化および自動化するAWSのサービス。バックアップの結果はAmazon SNSに送信することが出来ます。
Amazon DevOps Guru
Amazon DevOps Guruは機械学習を使用してAWSにおける異常な動作パターンを検出するAWSのサービス。検出結果はAmazon SNSに送信することが出来ます。
AWS Amplifyを使って独自ツールの開発
用意されているサービスだけですべての運用はカバーできず、社内向けの独自ツールを作成することもあるかと思います。
ツールの開発方法には様々な方法があるかと思いますが、AWS Amplify使ってサーバレスアプリケーションを開発するのがおすすめです。
AWS Amplifyとは
AWS Amplify
AWS AmplifyはモバイルアプリやWebアプリの開発を迅速かつ簡単に行うためのプラットフォームで、アプリ開発に必要なフロントエンドとバックエンドの機能を提供し、簡単に統合することができます。
内部ではAmazon S3やAmazon DynamoDB、AWS AppSync、Amazon Cognito等のサービスが使用されます。
Amazon DynamoDB
Amazon DynamoDBはAWSによるNoSQLのフルマネージドサービスです。
AWS AppSync
AWS AppSyncは、GraphQLというREST APIの課題を解決する為Facebookによって開発されたAPI向けのクエリ言語を利用できるAWSのサービスです。
AWS AmplifyのAPIはREST APIかGraphQLが選択でき、REST APIではAmazon API Gateway、GraphQLではこのAWS AppSyncを使用します。
Amazon Cognitoを使ってログイン
AWS Amplifyのログイン認証にAmazon Cognitoを使用することで、後述するAWS IAM Identety Centerのユーザーでのログインが行えるようになります。
Amazon Cognito
Amazon Cognitoはウェブおよびモバイルアプリの認証、承認、およびユーザー管理機能を提供するAWSのサービス。
AWS CodePipelineを活用したTerraformとAnsibleでの構築
リソースの構築に関してはTerraformやAnsible、PackerやServerless Frameworkを使用し、AWS CodePipelineを活用してCI/CDします。
AWS CodePipelineでCI/CD運用
TerraformやAnsibleでの構築でCI/CDをするために、以下の三つのAWSサービスを使用します。
AWS CodeComit
AWS CodeComitはGitでバージョン管理が行える、AWSによるフルマネージドサービス。
AWS CodePipelineではAWS CodeCommitだけでなくGitHubとBitbucketの利用も可能です。
AWS CodeBuild
AWS CodeBuildはAWSによるフルマネージドな継続的インテグレーションサービス
AWS CodePipeline
AWS CodePipelineはAWSによるCI/CDのフルマネージドサービス。
AWS CodePipelineを使ってAWS CodeComitからAWS CodeBuildの流れを自動化することで、TerraformやAnsibleのCI/CDを行います。
Terraformとは
インフラの構築にはTerraformを使用します。
Terraform
TerraformはHashiCorpが提供する、インフラの構成をコードとして管理できるOSSで様々なサービスに利用可能です。
AWSだけでなく、Grafanaにも対応しています。
Terraformの類似サービス
AWSのIaCサービスといえばAWS CloudFormationがありますが、AWS以外のリソースも構築したいので、今回はTerraformを選択しました。
TerraformのCI/CD構成
Trivy
Trivyはコンテナイメージの脆弱性を診断するAqua Securityのツール。tfsecというTerraformのセキュリティスキャンのツールが統合されたことにより、TrivyでTerraformのセキュリティスキャンが出来ます。
Terraformを動かすAWS CodeBuildにてこちらを使用します。
Packerとは
EC2のAMIの作成にはPackerを使用します。
Packer
PackerはTerraformと同じくHashiCorpが提供する、異なる仮想化/クラウドプラットフォーム上で動作するマシンイメージを自動化して作成するためのOSSです。
AWSだけでなくAzureやGCPに対応しており、Dockerイメージのビルドにも対応しています。
PackerのCI/CD構成
Packerの構成は以下の様になります。
AWS CodePipelineでPackerを実行するファイルをAmazon S3にデプロイし、そのファイルを使用してAWS Systems ManagerのAutomationでPackerを実行して、一時的なEC2インスタンスを作成。そしてそのインスタンスを基にAMIを作成ます。
Ansibleとは
サーバーの構成管理にはAnsibleを使用します。
Ansible
AnsibleはRed Hatが提供する、サーバーをコードで管理できるOSSの構成管理ツールです。
Amazon EC2のインスタンス内でのインストールや設定ファイルの管理に使用します。
Ansibleの類似サービス
Ansibleのような構成管理ツールは他にもChefやPuppetというサービスがあり、どちらもAWS OpsWorksというAWSのマネージドサービスが用意されています。
ただ、ChefやPuppetはAnsibleに比べて学習コストが高く、エージェントをサーバーに導入する必要があるので、今回は気軽に利用できるAnsibleを選択しました。
AnsibleのCI/CD構成
Ansibleの構成は以下の様になります。
AWS CodePipelineでAnsibleを実行するファイル(Playbook)をAmazon S3にデプロイし、そのPlaybookを使用してAWS Systems ManagerのRun CommandでAnsibleを実行します。
※Ansibleは本来、AnsibleをインストールしてPlaybookを実行するサーバーであるコントロールノードと管理対象のサーバーであるターゲットノード(Ansbileのインストールの必要はない)に分かれており、SSHを利用して接続するのでSSHのポートを解放する必要があります。
AWS Systems Managerを使用する場合はターゲットノードにAnsibleをインストールしてローカルで実行するため、コントロールノードの必要がなく、またAWS Systems Managerで実行するのでSSHのポートを解放する必要もありません。
Serverless Frameworkとは
AWS Lambdaの構築・デプロイに関してはServerless Frameworkを使用します。
Serverless Framework
Serverless Frameworkサーバーレスなアプリケーションを簡単に開発、デプロイするためのフレームワーク。AzureやGCP等AWS以外でも使用できます。
Serverless FrameworkのCI/CD構成
Serverless Frameworkの構成は以下の様になります。
AWS IAM Identity Centerでアカウント管理
ここまで様々なサービスが登場しましたが、すべてAWS IAM Identity Centerでアカウント管理を行います。
AWS IAM Identity Centerとは
AWS IAM Identity Center
AWS IAM Identity Centerは一つのアカウントで複数のAWSアカウントやAWS以外のサービスにログインできるSSO(シングルサインオン)を実現するAWSのサービス。無料で使用できます。
複数のAWSアカウントにログインできるだけでなく、Grafanaにログインしたり、Amazon Cognitoを利用してAWS Amplifyで作成したツールにもログイン出来ます。
AWS IAM Identity Centerの類似サービス
AWS IAM Identity CenterのようなSSOを実現するサービスは多く存在しますが、AWS IAM Identity CenterはAWSのログイン認証として使いやすく、料金も無料ということで今回はこちらを選択しました。
最後に
今回紹介した構成でAWS Well architectedフレームワークの5本の柱である運用上の優秀性、セキュリティ、信頼性、パフォーマンス効率、コスト最適化に沿った構成が実現できているのではないかと思っています。(6つ目の持続可能性については省いてます。)
こちらは今後もどんどん改良を重ねていく予定です。また、今後は個々のサービスを掘り下げた記事も書いていこうと思ってます。