AWS ELBでアクセスログを取得しよう!


鶏Soba 座銀 本店(大阪市肥後橋)

 

こんにちは!
株式会社ビヨンド大阪オフィスのラーメン王、とくはらです。
これが2回目の投稿です。
今回は、ELBでアクセスログを取得する方法について書こうと思います。
前回は、【Makefileで楽してdockerコマンドを使おう!】という記事も書いたので、
dockerをお使いの方は、ぜひ、見てくださいね

Makefileで楽してdockerコマンドを使おう!

 

 

ELBでアクセスログを取得するメリットとは?

この記事を見ている方の中には.....「え?サーバー内でアクセスログが取れるから不要やろ!」と....
そのように思った方もいらっしゃるのではないでしょうか?

確かにサーバーでアクセスログを取得することは可能であり、
ELBでアクセスログを取得するメリットはあまりないかも知れません....。
投稿者である僕も「サーバーでいけるし、メリットなんてないやろ...」とそう思っていました。

 

 

しかし、アクセスログを分析したい場合はどうでしょうか?
サーバが複数台に分散されている場合は、アクセスログはそれぞれのサーバーに保存されることになります。

そのため、アクセスログを分析しようとしても、別々のサーバーにアクセスログが存在するので、
アクセスログの統合をして分析することは、なかなか手間と労力がかかってしまいます。

例えば、CloudWatchLogsを利用してログの集約をすることができます。
その場合は、IAMで権限管理をしたり、対象サーバーにエージェントをインストールしたり、
awslogs.confで設定を編集しないといけません....。

また、fluentdと言われるオープンソースのデータログ収集ツールを利用して、
手軽にログを収集し、活用することもできます。
しかし、これもIAMでの権限管理からツールのインストールと設定をしないといけません。
さらに集約先にS3を指定したりとなにかと手間がかかってしまいます.....。

 

 

アクセスログを分析するために、CloudWatchLogsやfluentdを使って設定しなくても
サーバーの前段にあるELBのアクセスログを有効化することで、
簡単にアクセスログの集約ができちゃいます!!

全アクセスログがS3にすべて集約される形になるので、保存+分析を容易にすることができます
さらにAWS AthenaやRedshiftを利用することで、
Amazon S3 内のデータを標準 SQL を使用して簡単に分析できます!

また、ハングアップによるアクセスログの欠損が起こっても、
簡単に何が起こったのかをELBのアクセスログを調べて確認することもできます。

 

そして、ELBはAWSのフルマネージドサービスであるため、安心してお使い頂くことができます。
たとえ、不具合が起きてもAWSが責任を持って修復してくれます。
なので!!「有効化したのにアクセスログが取れない.......」ということは、
ほぼありませんのでご安心ください

 

これでELBでアクセスログを有効化するメリットもわかったはずです!
それでは、いよいよ設定手順を一緒に見ていきましょう!

 

 

設定手順

①EC2⇛ロードバランサーに移動

 

 

 

②アクションから【属性の編集】をクリック

 

 

 

③アクセスログの有効化を選択する

 

 

 

④S3 の場所にバケット名を指定する

 

 

⚠①S3 バケットには、小文字、数字、ピリオド (.) 、およびダッシュ (-) の組み合わせのみを使用できます。
上記以外で入力すると以下の画像のようにエラーが起こるので注意してください

 

 

 

⚠②入力したS3バケット名がすでに使用中の場合は、警告が表示されるので他の名前を入力してください

 

⑤【この場所の作成】 に✔を入れて、保存をクリックする

 

 

⑥S3に移動して【作成したS3バケット名】をクリック

 

 

 

 

⑦以下ディレクトリにアクセスログファイルがあることを確認できたら完了

*ログファイルは5分ごとに作成されます。

/作成したS3バケット名/AWSLogs/Elastic Load BalancingアカウントID番号/elasticloadbalancing/リージョン名/作成年後/作成月/作成日/

 

 

 

 

 

アクセスログ確認方法

①IAMに移動して【ユーザー作成】をクリック

 

 

② 必要事項を記入する

*アクセスの種類で【プログラムによるアクセス】にチェックを必ず入れてください

 

 

 

③【AmazonS3ReadOnlyAccess】のポリシーを選択

 

 

 

 

④入力に誤りがないか確認してユーザーを作成

 

 

 

⑤csvをダウンロードする

*念の為、アクセスキーとシークレットアクセスキーをメモしておく

 

 

⑥AWS CLIをインストール

*AWS CLIのインストールに関しては、AWS公式ドキュメントを参照してください

⚠ここでは、Centos7を使用しております。
Amazon Linux2の場合は、すでにインストールされているため、インストールは不要です。

 

⑥-①Pythonがバージョン 2.7以降であることを確認する
*Pythonがない場合は、別途インストールしてください。
*Centos7では、2.7.5がデフォルトでインストールされています。

python --version
Python 2.7.5

 

 

⑥-②バンドルされたインストーラをインストール
*sudoを使用するアクセス許可がない場合は、AWS公式ドキュメントを参照してください

curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
sudo yum install -y unzip
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
aws --version

 

 

⑦AWS CLIの設定

*AWS CLIの設定に関しては、AWS公式ドキュメントを参照してください。

aws configure

AWS Access Key ID [None]: 作成したIAMのアクセスキーを入力
AWS Secret Access Key [None]:作成したIAMのシークレットキーを入力
Default region name [None]:リージョンを入力
Default output format [None]:出力したいファイル形式を入力

 

 

⑧アクセスログを出力する

*AWS CLI S3コマンドに関しては、AWS公式ドキュメントを参照してください。

 
*AWS CLI S3コマンドでS3バケットのファイルを一覧表示
aws s3 ls s3://tokuhara-test-alb-access-log/AWSLogs/485076298277/elasticloadbalancing/ap-northeast-1/2021/01/18/
2021-01-18 08:05:12 884 485076298277_elasticloadbalancing_ap-northeast-1_app.tokuhara-test-alb.20a1e21abd53f9e7_20210118T0805Z_54.65.29.6_53o3j7p0.log.gz



*ローカルにコピーする
aws s3 cp s3://tokuhara-test-alb-access-log/AWSLogs/485076298277/elasticloadbalancing/ap-northeast-1/2021/01/18/485076298277_elasticloadbalancing_ap-northeast-1_app.tokuhara-test-alb.20a1e21abd53f9e7_20210118T2355Z_52.68.106.116_5qgag1lu.log.gz ./



*ローカルにコピーをできているか確認する
ls -l ./
-rw-r--r--. 1 root root 295 Jan 18 23:55 485076298277_elasticloadbalancing_ap-northeast-1_app.tokuhara-test-alb.20a1e21abd53f9e7_20210118T2355Z_52.68.106.116_5qgag1lu.log.gz



*圧縮ファイルを解凍する
gunzip 485076298277_elasticloadbalancing_ap-northeast-1_app.tokuhara-test-alb.20a1e21abd53f9e7_20210118T2355Z_52.68.106.116_5qgag1lu.log.gz



*アクセスログを表示
less 485076298277_elasticloadbalancing_ap-northeast-1_app.tokuhara-test-alb.20a1e21abd53f9e7_20210118T2355Z_52.68.106.116_5qgag1lu.log

http 2021-01-21T00:10:51.821814Z app/tokuhara-test-alb/20a1e21abd53f9e7 63.143.XX.XX:45662 - -1 -1 -1 503 - 110 337 "GET http://example.com:80/ HTTP/1.1" "Go-http-client/1.1" - - arn:aws:elasticloadbalancing:ap-northeast-1:485076298277:targetgroup/tokuahra-test-tg-ec2/ee1e50320f3398ec "Root=1-6008c68b-4198b51b343e8f127df30e01" "-" "-" 0 2021-01-21T00:10:51.821000Z "forward" "-" "-" "-" "-" "-" "-"                                                                                                                                                                                                                                                                                                      

 

 

 

出力結果とフォーマット

ELBアクセスログの設定!!お疲れ様でした٩(ˊᗜˋ*)و
でも、アクセスログが出力されるように設定しても見方がわからないと原因調査もできません....。

 

なので!『AWS公式ドキュメント』を参考にしつつ、
ELBで取得したアクセスログのサンプルに対して、
各項目に対応する値と説明がわかりやすいようにまとめて以下のフォーマットを用意しました。
一度どんな項目があるのか見てみてくださいね!

 

http 2021-01-21T00:10:51.821814Z app/tokuhara-test-alb/20a1e21abd53f9e7 63.143.XX.XX:45662 - -1 -1 -1 503 - 110 337 "GET http://example.com:80/ HTTP/1.1" "Go-http-client/1.1" - - arn:aws:elasticloadbalancing:ap-northeast-1:485076298277:targetgroup/tokuahra-test-tg-ec2/ee1e50320f3398ec "Root=1-6008c68b-4198b51b343e8f127df30e01" "-" "-" 0 2021-01-21T00:10:51.821000Z "forward" "-" "-" "-" "-" "-" "-"

 

フィールド 説明 サンプル値
type リクエストまたは接続のタイプ http
time ロードバランサーがクライアントからリクエストを受け取った時刻(UTC) 2021-01-21T00:10:51.821814Z
elb ELBの名前 app/tokuhara-test-alb/20a1e21abd53f9e7
client:port リクエストを送信したクライアントの IP アドレスとポート 63.143.XX.XX:45662
target:port このリクエストを処理したターゲットの IP アドレスとポート -
request_processing_time ELBがリクエストを受け取った時点からターゲットにリクエストを送信するまでの合計経過時間 -1
target_processing_time ELBがターゲットにリクエストを送信した時点からターゲットが応答ヘッダーの送信を開始した時点までの合計経過時間 -1
response_processing_time ELBがターゲットから応答ヘッダーを受け取った時点からクライアントへの応答の送信を開始した時点までの合計経過時間 -1
elb_status_code ロードバランサーからの応答のステータスコード 503
target_status_code ターゲットから応答のステータスコード -
received_bytes クライアントから受け取ったリクエストのサイズ 110
sent_bytes クライアントに返される応答のサイズ 337
"request" クライアントからのリクエストで行は二重引用符で囲まれている "GET http://example.com:80/ HTTP/1.1"
"user_agent" リクエスト元のクライアントを特定するUser-Agent 文字列 "Go-http-client/1.1"
ssl_cipher SSL暗号であり、HTTPSでない場合は - と設定されます -
ssl_protocol SSLプロトコルであり、HTTPSでない場合は - と設定されます -
target_group_arn ターゲットグループの Amazon リソースネーム arn:aws:elasticloadbalancing:ap-northeast-1:485076298277:targetgroup/tokuahra-test-tg-ec2/ee1e50320f3398ec
"trace_id" X-Amzn-Trace-Id ヘッダーのコンテンツ (二重引用符で囲まれます)。 "Root=1-6008c68b-4198b51b343e8f127df30e01"
"domain_name" TLS ハンドシェイク中にクライアントから提供される SNI ドメイン (二重引用符で囲まれます)HTTPSでない場合は - と設定されます "-"
"chosen_cert_arn" クライアントに提示される証明書の ARN (二重引用符で囲まれます)。HTTPSでない場合は - と設定されます "-"
matched_rule_priority リクエストに一致したルールの優先度の値 0
request_creation_time ELBがクライアントからリクエストを受け取った時刻 2021-01-21T00:10:51.821000Z
"actions_executed" リクエストの処理時に実行されるアクション (二重引用符で囲まれます) "forward"
"redirect_url" HTTP レスポンスのロケーションヘッダーのリダイレクトターゲットの URL (二重引用文字で囲む) "-"
"error_reason" エラー理由コード (二重引用符で囲まれます) "-"
"target:port_list" このリクエストを処理したターゲットの IP アドレスとポートのスペース区切りのリスト (二重引用符で囲まれます) "-"
"target_status_code_list" ターゲットの応答からのステータスコードのスペース区切りのリスト (二重引用符で囲まれます) "-"
"classification" desync 緩和の分類 (二重引用符で囲まれます) "-"
"classification_reason" 分類理由コード (二重引用符で囲まれます)。 "-"

 

 

 

料金

料金についてですが、ELBの料金は発生致します。
ELBに関する『AWS公式ドキュメント』によれば、
AWS 東京リージョンのApplication Load Balancersの利用料金については、次の通りです。

 

次にアクセスログを取得した後はS3に保存しているため、S3の料金が発生致します。
S3に関する『AWS公式ドキュメント』では、
AWS 東京リージョンの場合、S3の料金設定は以下のようになっております。

 

 

非常にわかりにくいですが、最初の 50 TBまでは、月に1GB当たり0.023USDの料金が発生致します。

例えば、1ヵ月に蓄積されるログファイルが10GBであった場合は、初月に約24.28円が発生し、
2ヵ月目に20GBが蓄積されるため、約48.56円が、
3ヵ月目に30GBが蓄積されたため、約72.54円の料金が発生致します。
そして、容量が450TB超えた月から1GB当たり0.022USDの料金が発生致します。

このように料金の計算を見ると非常に安価にアクセスログが取得できることがわかるのではないでしょうか?

 

 

 

まとめ

いかがでしたでしょうか?
とても簡単にアクセスログを集約できたのではないでしょうか?

アクセスログを集約するために、ELBのアクセスログを有効化することで、時間と労力を削減でき、
不具合でログ取得ができないこともほぼないため、安定して利用できます!
何かサーバーに異常が合ってログの欠陥が起こっても簡単に調べられることもできます!!

なので!!ぜひ、ELBのアクセスログを有効化して、
安全に、便利にサーバーを運用できるようにしておきましょう

最後に、この記事を見ている方の中で「S3に興味が湧いてきた!!」という方は、
ビヨンドのペルシャ猫さんが以下の記事を書いてるので、合わせてチェックしてみてくださいね!!

【AWS初心者向け】ざっくりわかる!Amazon S3とは?

 

記事を読んで頂き、ありがとうございました!

 


この記事をかいた人

About the author

徳原 秀光

新卒で内定をもらっていたが辞退してビヨンドに中途入社した人。
大阪のシステムソリューション部に所属しています。
実はラーメンが大好きで
大阪では60店舗以上潜入調査済み(。-∀-) ニヒ
ビヨンドのラーメン王とグルメ王を目指し奮闘中!!
↓Twitterもやっているのでフォローしてね(´∇`)