こんにちは、やまぐちです。
概要
Proxy (Squid) 経由で EC2 のログを CloudWatch Logs へログを出力させるまでを書きます。
出力させるログは、/var/log/messages
です。
Proxy 経由で SSM を利用できるようにする記事は以下ですので、ご参考までに(前半はほぼ同じ内容です)
blog.serverworks.co.jp
構成図は以下のような形です。
パブリックサブネットに NAT Gateway を配置する代わりに EC2 (Squid) を設置する形です。
今回は、検証用ですので Squid の認証設定などは行いません。
流れ
EC2 インスタンスの作成
パブリックサブネットの EC2 インスタンスに Squid をインストール・設定
CloudWatch Agent の設定ファイルを編集
ロググループを確認
やってみる
1. EC2 インスタンスの作成
プライベートサブネットとパブリックサブネットにそれぞれ EC2 を作成します。
今回は検証用ですので、インスタンスタイプは t3.micro
としました。
ちなみに OS は 以下のようにしました。
Squidインスタンス:Amazon Linux 2023
対象インスタンス:Amazon Linux 2
その他の設定値について
アタッチする IAMロール
Squid インスタンス:付与してもしなくてもよい
対象インスタンス:
CloudWatchAgentServerPolicy
がアタッチされた IAMロール
アタッチするセキュリティグループ
- Squid インスタンス:以下のインバウンドルールを含めたセキュリティグループ
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
SSH | TCP | 22 | ログイン元のIPアドレス |
カスタム TCP | TCP | 3128 | 対象インスタンスのIPアドレス or 対象インスタンスにアタッチされているセキュリティグループ |
- 対象インスタンス:以下のインバウンドルールを含めたセキュリティグループ
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
SSH | TCP | 22 | Squid インスタンスのIPアドレス or Squid インスタンスにアタッチされているセキュリティグループ (Squidインスタンスからポートフォワードする場合) |
2. パブリックサブネットの EC2 インスタンスに Squid をインストール・設定
パブリックサブネットに作成した Squid 用インスタンスにログインし、Squid をインストールします。(dnf ではなく yum でも OK)
$ sudo dnf install squid -y
インストールが完了したら Squid の設定ファイルの/etc/squid/squid.conf
を編集します。
$ sudo vim /etc/squid/squid.conf
http_access allow localhost
が記載されている箇所の上に、http_access allow localnet
を追記します。
http_access allow localnet http_access allow localhost
アクセスを追記したlocalnet
は/etc/squid/squid.conf
内の最初の方に書かれているプライベートIPアドレスのことを指します。
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN) acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN) acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN) acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN) acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN) acl localnet src fc00::/7 # RFC 4193 local private network range acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
設定を読み込ませます。
$ sudo systemctl restart squid
ここまで完了したら、Squid の設定は完了です。
本来であれば/etc/squid/squid.conf
内をいじってアクセス元やアクセス先の制限を行ったりしますが、今回は検証用なのでそこまでは行いません。
3. CloudWatch Agent の設定ファイルを編集
では次は、プライベートサブネットに作成したログを流したいインスタンスにログインします。 ログイン方法については詳しく言及しませんが、今回はパブリックサブネットの Squid サーバからポートフォワードでログインしました。
また、設定手順は以下のドキュメントを参考にしてます。 docs.aws.amazon.com
ログインが完了したら、CloudWatch Agent をインストールしステータスを確認します。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status
インストール手順は以下のドキュメントに記載があります。
具体的な紹介について、今回は行いません。
CloudWatch Agent の設定
CloudWatch Agent の設定を行うわけですが、今回はウィザードを利用せず必要なファイルを作成・編集する形で進めます。
また、CloudWatch Agent では Proxy を指定するファイルとログやメトリクスを出力させるために必要なファイルは別なのでそれぞれ設定を行います。
Proxy を指定するファイル:/opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
ログやメトリクスを出力させるために必要なファイル:任意の名前の json ファイル(Linux では amazon-cloudwatch-agent.json とすることが推奨)
Proxy を指定する設定
ではまず、common-config.toml
を指定して Proxy を指定します。
$ sudo vim /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
以下のように記載します。
## Configuration for shared credential. ## Default credential strategy will be used if it is absent here: ## Instance role is used for EC2 case by default. ## AmazonCloudWatchAgent profile is used for onPremise case by default. # [credentials] # shared_credential_profile = "{profile_name}" # shared_credential_file = "{file_name}" ## Configuration for proxy. ## System-wide environment-variable will be read if it is absent here. ## i.e. HTTP_PROXY/http_proxy; HTTPS_PROXY/https_proxy; NO_PROXY/no_proxy ## Note: system-wide environment-variable is not accessible when using ssm run-command. ## Absent in both here and environment-variable means no proxy will be used. [proxy] http_proxy = "http://Squid用インスタンスのプライベート IP DNS 名:3128" https_proxy = "http://Squid用インスタンスのプライベート IP DNS 名:3128" no_proxy = "169.254.169.254" # [ssl] # ca_bundle_path = "{ca_bundle_file_path}"
変更点としては、コメントアウトされていた[proxy]
の箇所に内容を書いてあげた形です。
[proxy] http_proxy = "http://Squid用インスタンスのプライベート IP DNS 名:3128" https_proxy = "http://Squid用インスタンスのプライベート IP DNS 名:3128" no_proxy = "169.254.169.254"
ログを出力させるための設定
今回は、/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
というファイルを作成しそこに設定を記載し、読み込ませます。
$ sudo vim /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
記載する内容は以下とします。
{ "agent": { "metrics_collection_interval": 10, "logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log" }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/messages", "log_group_name": "logs-test", "log_stream_name": "{instance_id}", "timezone": "Local" } ] } } } }
ざっくり書くと/var/log/messages
をlogs-test
というロググループのインスタンスID
のログストリームに出力させるという設定です。
json の書き方は以下のドキュメントをご参照ください。
docs.aws.amazon.com
設定を読み込ませる
ここまで完了したら、設定した内容を読み込ませて Agent を起動させます。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
ステータスを確認し、「status」が running
になっているのと「configstatus」が configured
になっていることを確認する
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status
4. ロググループを確認
ロググループを確認すると、以下の形でログが出力されていました。
ロググループ名:logs-test
ログストリーム名:インスタンスID
ログの内容:/var/log/messages
ログが連携されない時は
もし、うまくログが出力されない時は以下のログを確認して手がかりを探しましょう。
Squidインスタンス:/var/log/squid/access.log
対象インスタンス:/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
余談
読み込ました json ファイルについて
今回は/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
というファイルを作成し、Agent に読み込ましました。
読み込ましたファイルは、/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/
配下のfile_amazon-cloudwatch-agent.json
という形で保存されています。
※もちろんtest.json
というファイル名で読み込ましたならfile_test.json
という名前で保存されます。
カスタムメトリクスの出力について
今回はログを出力させましたが、もちろんメトリクスを出力させることも可能です
json 内でmetrics
セクションを追加すると出力されます。
最後に
インターネット経由で CloudWatch へログやメトリクスを出力させたくないという場合は、以下のエンドポイント経由で出力させることもできますのでご参考までに
むしろ、Proxy 経由よりもエンドポイント経由で接続させるパターンの方が多いのかなとは感じてます。
logs.region.amazonaws.com
monitoring.region.amazonaws.com