DockerコンテナのログをS3に蓄積して、Athenaでクエリーする手順を確認しました。 実現できることはわかっていましたが、 実際に手を動かすと色々躓いた ので結果を残します。
Dockerのログ
Dockerコンテナのログはdocker logs
コマンドで確認できます。
docker run -it --rm -p 80:80 -d nginx
docker logs `docker ps -l -q`
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/02/12 01:19:17 [notice] 1#1: using the "epoll" event method
2023/02/12 01:19:17 [notice] 1#1: nginx/1.23.3
2023/02/12 01:19:17 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2023/02/12 01:19:17 [notice] 1#1: OS: Linux 5.15.79.1-microsoft-standard-WSL2
2023/02/12 01:19:17 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/02/12 01:19:17 [notice] 1#1: start worker processes
2023/02/12 01:19:17 [notice] 1#1: start worker process 29
2023/02/12 01:19:17 [notice] 1#1: start worker process 30
2023/02/12 01:19:17 [notice] 1#1: start worker process 31
2023/02/12 01:19:17 [notice] 1#1: start worker process 32
2023/02/12 01:19:17 [notice] 1#1: start worker process 33
2023/02/12 01:19:17 [notice] 1#1: start worker process 34
172.17.0.1 - - [12/Feb/2023:01:19:23 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
docker ps -l -q
は最後に作成したコンテナのコンテナIDを取得しています。
-l, --latest Show the latest created container (includes all states)
-q, --quiet Only display container IDs
ログ出力のしくみはログドライバーで実装されていて、ログドライバーを変更することでログの出力先を変更できます。デフォルトではjson-file
というログドライバーが設定されています。
- ログドライバー一覧
公式ドキュメントより
Driver | Description |
---|---|
none | コンテナのログは利用できず、docker logs は何も出力を返しません。 |
local | ログは最小限のオーバーヘッドのために設計されたカスタムフォーマットで保存されます。 |
json-file | ログはJSONとしてフォーマットされます。Dockerのデフォルトのロギングドライバです。 |
syslog | ロギングメッセージを syslog 機能に書き込みます。ホストマシン上で syslog デーモンが動作している必要があります。 |
journald | ログメッセージを journald に書き込みます。ホストマシン上で journald デーモンが動作している必要があります。 |
gelf | Graylog や Logstash のような Graylog Extended Log Format (GELF) エンドポイントにログメッセージを書き込みます。 |
fluentd | ログメッセージを fluentd (フォワードインプット) に書き込みます。fluentd デーモンはホストマシン上で動作している必要があります。 |
awslogs | Amazon CloudWatch Logsにログメッセージを書き込む。 |
splunk | HTTP Event Collector を使用して、ログメッセージを splunk に書き込む。 |
etwlogs | Event Tracing for Windows (ETW) イベントとしてログメッセージを書き込む。Windowsプラットフォームでのみ利用可能です。 |
gcplogs | Google Cloud Platform (GCP) Logging にログメッセージを書き込む。 |
logentries | Rapid7 Logentries にログメッセージを書き込む。 |
今回はKinesis Data Firehose経由でS3に出力したいので、fluentd
ログドライバーを使用します。
Kinesis Data Firehose、S3の準備
マネジメントコンソールから作成しました。 特に難しくはないと思いますので説明は省略します。
AWS for Fluent Bitコンテナの起動
Dockerコンテナからのログを受けとるfluentdとしてAWS for Fluent Bit
を使用します。
ややこしいですが、
fluentd
: ログを収集するやつfluentbit
: Fluentdの軽量なやつAWS for Fluent Bit
: fluentbitのAWS版
と理解しています。
Docker Composeで起動します。
version: '3'
services:
aws-for-fluent-bit:
image: public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
volumes:
- ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
- ./.aws:/root/.aws
ports:
- 24224:24224
「fluentd デーモンはホストマシン上で動作している必要があります。」という条件のためポートを公開して起動します。 Volumeでマウントしているのは設定ファイルとAWSの認証情報です。S3へのログ出力にKinesis Data Firehoseを使用するため、以下のような設定ファイルを用意します。
[INPUT]
Name forward
Listen 0.0.0.0
Port 24224
[OUTPUT]
Name firehose
Match **
region ap-northeast-1
delivery_stream [Kinesis Data Firehoseのストリーム名]
fluentd
ログドライバーの使用
Nginxコンテナのログをfluentdに送信するように設定します。
version: '3'
services:
web:
image: public.ecr.aws/nginx/nginx:latest
ports:
- 8080:80
logging:
driver: fluentd
options:
fluentd-address: "localhost:24224"
fluentd-async-connect: "false"
tag: "nginx"
depends_on:
- aws-for-fluent-bit
aws-for-fluent-bit:
image: public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
volumes:
- ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
- ./.aws:/root/.aws
ports:
- 24224:24224
logging
の部分でログドライバーを指定しています。
Dokcerデーモンからみたログドライバーのアドレスなのでfluentdのアドレスはlocalhost
となります。
これでログがS3に蓄積されると思います。
ログの確認
S3に蓄積されたログはfluentdログドライバーのフォーマットとなっています。
{
"container_id": "4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2",
"container_name": "/nginx-fluentbit-s3-web-1",
"log": "172.24.0.1 - - [11/Feb/2023:09:45:55 +0000] \"GET /aaaa HTTP/1.1\" 404 555 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36\" \"-\"",
"source": "stdout"
}
ログのAthenaによる検索
ログをAthenaでクエリーします。
fluentd_json
テーブルの作成
まずはテーブルを作成します。
CREATE EXTERNAL TABLE `fluentd_json`(
`container_id` string,
`container_name` string,
`log` string,
`source` string)
PARTITIONED BY (
`datehour` string)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'case.insensitive'='TRUE',
'dots.in.keys'='FALSE',
'ignore.malformed.json'='FALSE',
'mapping'='TRUE')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://[バケット名]/'
TBLPROPERTIES (
'classification'='json',
'projection.datehour.format'='yyyy/MM/dd/HH',
'projection.datehour.interval'='1',
'projection.datehour.interval.unit'='HOURS',
'projection.datehour.range'='2023/01/01/00,NOW',
'projection.datehour.type'='date',
'projection.enabled'='true',
'storage.location.template'='s3://[バケット名]/${datehour}/',
'transient_lastDdlTime'='1676114385')
ログファイルがJSONフォーマットのため、ROW FORMAT SERDE
として'org.openx.data.jsonserde.JsonSerDe'`を指定しています。(参考ドキュメント)
また、Firehoseで出力した場合はパーティション分割されているので、PARTITIONED BY
とTBLPROPERTIES
で指定しています。(参考ドキュメント)
fluentd_json
テーブルの検索
SELECT * FROM fluentd_json limit 10;
- 検索結果
# | container_id | container_name | log | source | datehour |
---|---|---|---|---|---|
1 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 172.24.0.1 - - [11/Feb/2023:09:45:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" | stdout | 2023/02/11/09 |
2 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" | stdout | 2023/02/11/09 |
3 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" | stdout | 2023/02/11/09 |
4 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" | stdout | 2023/02/11/09 |
5 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" | stdout | 2023/02/11/09 |
6 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" | stdout | 2023/02/11/09 |
7 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" | stdout | 2023/02/11/09 |
8 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" | stdout | 2023/02/11/09 |
9 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 2023/02/11 09:45:55 [error] 31#31: *3 open() "/usr/share/nginx/html/aaaa" failed (2: No such file or directory), client: 172.24.0.1, server: localhost, request: "GET /aaaa HTTP/1.1", host: "localhost:8080" | stderr | 2023/02/11/09 |
10 | 4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2 | /nginx-fluentbit-s3-web-1 | 172.24.0.1 - - [11/Feb/2023:09:45:55 +0000] "GET /aaaa HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" | stdout | 2023/02/11/09 |
source
がstdout
のものとstderr
のものがあります。
Nginxコンテナの場合は、/var/log/nginx/access.log
がstdout
として、/var/log/nginx/error.log
がstderr
で出力されるように構成されています。(参考ドキュメント)
stdoutとstderrの使い分けについて、Nginxコンテナでは以下のような実装になっています。コンテナイメージの設計の際に参考にしましょう。
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
log
カラムを分割した新しいテーブルを作成
Nginxの生ログがlog
カラムにまとまっているため、レスポンスコードでフィルターをかけるなどが難しいです。
- fluentd_jsonテーブルから
log
カラムのみのテーブルを新規作成 log
をNginxのログフォーマットに従って分割したテーブルを作成
という手順を行います。
1. fluentd_jsonテーブルからlog
カラムのみのテーブルを新規作成
CREATE TABLE AS SELECT (CTAS) クエリ
を使って新しいテーブルを作成します。(参考ドキュメント)
CTASクエリではテーブル構造だけでなくデータをコピーします。(データをコピーしないオプションもあり)そのため出力先としてS3バケットを指定します。
CREATE TABLE log_ctas
WITH (
format = 'TEXTFILE',
external_location = 's3://[新しい出力先バケット]/'
)
AS
SELECT log FROM fluentd_json WHERE source = 'stdout' AND datehour > '2023/02/01/00'
WITH句の指定はこちらを参考にしました。目視で確認したかったのでTEXTFILE
形式にしました。
SELECT * FROM log_ctas limit 10;
# | log |
---|---|
1 | 172.24.0.1 - - [11/Feb/2023:09:45:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
2 | 172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
3 | 172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
4 | 172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
5 | 172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
6 | 172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
7 | 172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
8 | 172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
9 | 172.24.0.1 - - [11/Feb/2023:09:45:55 +0000] "GET /aaaa HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
10 | 172.24.0.1 - - [11/Feb/2023:09:47:14 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-" |
これでまずlog
カラムのみのテーブルが作成できました。
2. log
をNginxのログフォーマットに従って分割したテーブルを作成
log_ctas
テーブル作成の際にデータもコピーされています。コピーされたデータを対象に、Nginxのログフォーマットで分割したテーブルを作成します。
NginxのログフォーマットはNginxコンテナ内のnginx.conf
で定義されています。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
このフォーマットに従って分割したテーブルを作成します。Apacheのログを分割する方法を参考にします。
CREATE EXTERNAL TABLE nginx_logs(
remote_addr string,
remote_user string,
time_local string,
request string,
server_status string,
body_bytes_sent string,
http_referer string,
http_user_agent string,
http_x_forwarded_for string
)
ROW FORMAT SERDE
'com.amazonaws.glue.serde.GrokSerDe'
WITH SERDEPROPERTIES (
'input.format'='^%{IPV4:remote_addr} - %{USERNAME:remote_user} .%{GREEDYDATA:time_local}. %{QUOTEDSTRING:request} %{DATA:server_status} %{DATA: body_bytes_sent} %{QUOTEDSTRING: http_referer} %{QUOTEDSTRING: http_user_agent} %{QUOTEDSTRING: http_x_forwarded_for}$'
)
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://[新しい出力先バケット]/';
input.format
で分割方法を定義しています。Grok SerDeの定義済みパターンを巧みに使いこなす必要があります。
例えば、%{IPV4:remote_addr}
の部分はIPV4
の定義(?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])
にマッチする部分をremote_addr
という名前で抽出しています。抽出したremote_addr
をSELECT句で更に指定します。
SELECT * FROM nginx_logs where remote_addr is not null limit 10 ;
# | remote_addr | remote_user | time_local | request | server_status | body_bytes_sent | http_referer | http_user_agent | http_x_forwarded_for |
---|---|---|---|---|---|---|---|---|---|
1 | 172.24.0.1 | - | 11/Feb/2023:09:50:58 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
2 | 172.24.0.1 | - | 11/Feb/2023:09:51:08 +0000 | GET /a HTTP/1.1 | 404 | 555 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
3 | 172.24.0.1 | - | 11/Feb/2023:09:45:49 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
4 | 172.24.0.1 | - | 11/Feb/2023:09:45:50 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
5 | 172.24.0.1 | - | 11/Feb/2023:09:45:50 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
6 | 172.24.0.1 | - | 11/Feb/2023:09:45:50 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
7 | 172.24.0.1 | - | 11/Feb/2023:09:45:50 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
8 | 172.24.0.1 | - | 11/Feb/2023:09:45:51 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
9 | 172.24.0.1 | - | 11/Feb/2023:09:45:51 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
10 | 172.24.0.1 | - | 11/Feb/2023:09:45:51 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
これでログの分割ができました。検索しやすくなりましたね。
request
カラムがGET / HTTP/1.1
となっているのでここも分割したい場合は、関数を使って分割できます。(Athenaクエリエンジン3で検証。文字列関数、配列関数)
SELECT
split(request, ' ')[1] as method,
split(request, ' ')[2] as path,
split(request, ' ')[3] as http_version,
*
FROM nginx_logs where remote_addr is not null limit 10;
# | method | path | http_version | remote_addr | remote_user | time_local | request | server_status | body_bytes_sent | http_referer | http_user_agent | http_x_forwarded_for |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | GET | / | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:50:58 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
2 | GET | /a | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:51:08 +0000 | GET /a HTTP/1.1 | 404 | 555 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
3 | GET | / | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:45:49 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
4 | GET | / | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:45:50 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
5 | GET | / | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:45:50 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
6 | GET | / | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:45:50 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
7 | GET | / | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:45:50 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
8 | GET | / | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:45:51 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
9 | GET | / | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:45:51 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
10 | GET | / | HTTP/1.1 | 172.24.0.1 | - | 11/Feb/2023:09:45:51 +0000 | GET / HTTP/1.1 | 304 | 0 | - | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | - |
まとめ
長くなりましたが、手順はそれほど難しくありません。ログの検索もいつ行う必要があるかわかりませんので、手順の確認を行っておくと良いですね。