プロキシ (Squid) 経由で EC2 のログを CloudWatch Logs へログを出力させる

記事タイトルとURLをコピーする

こんにちは、やまぐちです。

概要

Proxy (Squid) 経由で EC2 のログを CloudWatch Logs へログを出力させるまでを書きます。
出力させるログは、/var/log/messages です。
Proxy 経由で SSM を利用できるようにする記事は以下ですので、ご参考までに(前半はほぼ同じ内容です) blog.serverworks.co.jp

構成図は以下のような形です。
パブリックサブネットに NAT Gateway を配置する代わりに EC2 (Squid) を設置する形です。
今回は、検証用ですので Squid の認証設定などは行いません。

流れ

  1. EC2 インスタンスの作成

  2. パブリックサブネットの EC2 インスタンスに Squid をインストール・設定

  3. CloudWatch Agent の設定ファイルを編集

  4. ロググループを確認

やってみる

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

インストール手順は以下のドキュメントに記載があります。
具体的な紹介について、今回は行いません。

docs.aws.amazon.com

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/messageslogs-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

やまぐち まさる (記事一覧)

CS部・CS2課

AWS の構築・運用をやってます

3度の飯より野球が好き

2023 Japan AWS All Certifications Engineers