AWS CLIで Web サイトを構築、管理、運用する(2日目)

[1日目](https://qiita.com/hirosys/private/c8e92c253d8acc8f0a96)では、AWS CLIを使って、Amazon S3 の静的 Web ホスティング機能を設定、構築しました。

Web サイトということなので、どのくらいアクセスがあるのかなどをロギングしたくなりますよね？

ということで、今回は、 ログ設定をいれます。

# 2日目の要約
アクセスログを有効化するよ！

# AWS CLI の準備
このあたりをみて、好きなバージョンとお使いのOSにあった環境設定をしてくださいね。
なんなら、 AWS CloudShell で実行するのも楽でよいと思います。
この記事シリーズは、AWS CloudShell で実行し、実行例を載せています。

バージョン１
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html

バージョン２
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

# 概要
Amazon Simple Storage Service(Amazon S3)のアクセスロギング機能を AWS CLI で設定、構築する

# さあ、やってみよう！
## ログ格納用の S3 バケットを作成する
1日目と同様に作ります。

わかりやすく、1日目のバケット名に「-logs」とつけます。

```sh
BUCKETNAME=<BUCKETNAME>
aws s3api create-bucket --bucket ${BUCKETNAME}-logs \
--region ap-northeast-1 \
--create-bucket-configuration LocationConstraint=ap-northeast-1
```
## アクセスロギング機能のアクセス権限を付与する
格納先に対して読み書きが行えるように、アクセスロギング機能に対して、アクセス権限を付与します。
s3api put-bucket-acl コマンドを使用します。

```sh
# 同じシェルをそのまま使える場合は環境変数を使う
aws s3api put-bucket-acl --bucket ${BUCKETNAME}-logs  --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery

# 閉じてしまったなどで使えない場合は、バケット名を自分で指定してください。
#aws s3api put-bucket-acl --bucket <BUCKETNAME>-logs  --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
```

## アクセスロギング機能を有効化する
格納先の作成とアクセス権限の付与ができたので、実際にアクセスロギング機能を有効化します。
使用するコマンドは、 s3api put-bucket-logging コマンドです。

```sh
# 同じシェルをそのまま使える場合は環境変数を使う
aws s3api put-bucket-logging --bucket ${BUCKETNAME} \
--bucket-logging-status LoggingEnabled='{TargetBucket="${BUCKETNAME}-logs", TargetPrefix="/"}'

# 閉じてしまったなどで使えない場合は、バケット名を自分で指定してください。
#aws s3api put-bucket-logging --bucket <BUCKETNAME> \
#--bucket-logging-status LoggingEnabled='{TargetBucket="<BUCKETNAME>-logs", TargetPrefix="/"}'
```

このコマンドは正常終了した場合、特に何も出力されません。
s3api get-bucket-logging コマンドで設定されているか確認します。

```sh
# 同じシェルをそのまま使える場合は環境変数を使う
aws s3api get-bucket-logging --bucket ${BUCKETNAME}

# 閉じてしまったなどで使えない場合は、バケット名を自分で指定してください。
#aws s3api get-bucket-logging --bucket <BUCKETNAME> 
```

以下の様に出力されます。

```json
{
    "LoggingEnabled": {
        "TargetBucket": "<BUCKETNAME>-logs",
        "TargetPrefix": "/"
    }
}
```

ただし、実際にログが配信されるまでに時間がかかります

>バケットのログ記録ステータスの変更がログファイルの配信に反映されるまでには時間がかかります。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ServerLogs.html#BucketLoggingStatusChanges

## ログを確認する
ログ設定を行ってから数時間経過後に S3 上でホスティングしている Web サイトへアクセスしてみます。
その後、 s3 ls コマンドを使ってログファイルの存在確認と s3 cp コマンドによる ログファイルの取得を行い、内容を確認します。

```sh
# 同じシェルをそのまま使える場合は環境変数を使う
aws s3 ls s3://${BUCKETNAME}-logs/ --recursive

# 閉じてしまったなどで使えない場合は、バケット名を自分で指定してください。
#aws s3 ls s3://$<BUCKETNAME>-logs/ --recursive
```

ログが正常に配信されていると以下の様に出力されます。

```sh
2021-11-29 05:12:48       4551 /2021-11-29-05-12-47-1F874BD281BCA551
2021-11-29 05:13:14        671 /2021-11-29-05-13-13-B30D92FD34EE693B
2021-11-29 05:13:20        680 /2021-11-29-05-13-19-4FD246B03ECBB15E
2021-11-29 05:15:22       2054 /2021-11-29-05-15-21-F3FB67F11280DBA7
2021-11-29 05:15:37       2070 /2021-11-29-05-15-36-35E13AD08B82A5E1
2021-11-29 05:17:10        670 /2021-11-29-05-17-09-A10B6030DACECF2F
2021-11-29 05:18:38       3749 /2021-11-29-05-18-37-48C2ACBC4FFB4E44
2021-11-29 05:18:59        446 /2021-11-29-05-18-57-3A6B2EF748058ED3
2021-11-29 05:19:24        715 /2021-11-29-05-19-23-169A2DD111112197
2021-11-29 05:20:45       1149 /2021-11-29-05-20-44-424EEDAA35B73FC3
2021-11-29 05:21:08        688 /2021-11-29-05-21-07-28B7033F0E050A2A
2021-11-29 05:21:34        682 /2021-11-29-05-21-33-72B9CBF90A63BFC2
```

次に、ログファイルの中身を確認します。

```sh
# 同じシェルをそのまま使える場合は環境変数を使う
# 取得したいログファイル(オブジェクト名)は、先ほど s3 ls コマンドで列挙されたものを選択、指定します。
aws s3 cp s3://${BUCKETNAME}-logs/<OBJECTNAME> ./

# 閉じてしまったなどで使えない場合は、バケット名を自分で指定してください。
#aws s3 ls s3://$<BUCKETNAME>-logs/<OBJECTNAME> ./
```

※注意：オブジェクト名の頭に"/"がついている場合はそれも併せて指定します。
※例：s3://hogefugapiyo/**/**2021-12-02-00-01-02-******

ダウンロードできたログファイルはテキストファイルなので、catやテキストエディタで表示させることができます。

```sh
cat <OBJECTNAME/ログファイル名> 
<バケット所有者> <BUCKETNAME> [29/Nov/2021:04:10:56 +0000] アクセス元IP.v4.ADD.RESS - <リクエストID> WEBSITE.GET.OBJECT index.html "GET / HTTP/1.1" 304 - - 134 21 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" - <ホストID> - - - <BUCKETNAME>.s3-website-ap-northeast-1.amazonaws.com - -

※省略
```

ログファイルのフォーマットは以下にまとめられています。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/LogFormat.html


# まとめ
これで S3 で配信している Web サイトへのアクセスログが記録できるようになりました。
しかし、まだまだ問題や課題がありますよね。引き続き3日目以降も見ていきます。

* 今回使ったコマンド
 * s3api create-bucket
 * s3api put-bucket-acl
 * s3api put-bucket-logging
 * s3api get-bucket-logging
 * s3 ls
 * s3 cp