FastlyのログをS3に保存する

Fastly CDN を利用するにあたり、ログは重要な機能です。どのURLでキャッシュミスが多いか、個々のリクエストのレスポンスタイムはどうなっているかなどを確認するにはログが非常に役立ちます。Fastly をご利用の際には是非設定してみてください。Fasty では各種ログに対応していますが、ここでは Amazon S3 へログを保存する方法を紹介します。
ログの設定には Amazon S3 の設定と Fastly Log の設定を行う必要があります。

# Amazon S3 の設定
はじめにログを出力する Amazon S3 側の設定を行います。設定の順序としては
1. バケットの作成
2. IAM でのユーザ作成
3. ポリシーの作成と適用
になります。

## バケットの作成
S3 にバケットを作成します。
AWS マネージメントコンソールから S3 を選択し、「バケットを作成」よりバケットを作成します。バケットの名前は `fastly-s3log` としておきます。

![Create-bucket-1.png](https://qiita-image-store.s3.amazonaws.com/0/149542/cb851965-b098-46a6-49c8-24a170ae0a03.png)

## ユーザ作成
S3 バケットへは読み書きが可能な権限が必要となります。そのためのユーザの作成とアクセス ID とシークレットアクセスキーの生成を行います。
AWS マネージメントコンソールから Identity and Access Management を選択し、「ユーザー」よりユーザー作成画面に入ります。「新規ユーザーの作成」よりユーザーの作成を行います。ユーザーの名前は `fastly-log` としておきます。

![iam-newuser.png](https://qiita-image-store.s3.amazonaws.com/0/149542/7581cadb-804b-d88c-87ff-bf7555e7e99b.png)

ユーザーの作成を行うと、アクセスキーID とシークレットアクセスキーが表示されます。これらの情報は後ほど Fastly のログ設定に利用します。

![iam-newuser-key-mask.png](https://qiita-image-store.s3.amazonaws.com/0/149542/2478515f-2c70-b026-7fa3-48e68be12e25.png)

## ポリシーの作成と適用
作成した S3 バケットへのアクセスを作成したユーザに許可するためのポリシーの作成とユーザへの適用を行います。

AWS マネージメントコンソールから Identity and Access Management を選択し、「ポリシー」よりポリシー作成画面に入ります。「ポリシーの作成」よりポリシーの作成を行います。

![CreatePlicy-1.png](https://qiita-image-store.s3.amazonaws.com/0/149542/d1d52f76-dbaa-212e-8937-a260686fa422.png)


「AWS 管理ポリシーをコピー」を選択します。今回は特定の S3 バケットへのアクセスを許容するために、 AmazonS3FullAccess をベースの設定として選択します。ここでは fastly-s3log のみへのフルアクセスを許容するため、 以下のように変更します。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::*" ### 全バケットのList表示のみ許容する
        },
        {
            "Action": "s3:*",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::fastly-s3log",
                "arn:aws:s3:::fastly-s3log/*" ### fastly-s3logへのフルアクセスを許容する
            ]
        }
    ]
}
```

ここでは `AmazonS3FullAccess-fastly-s3log` として保存します。

続いて、作成したポリシーを選択し、「アタッチされたエンティティ」から「アタッチ」をクリックし、 `fastly-log` を選択しアタッチを行います。

以上の作業で S3 のバケット作成とバケットへのアクセスに必要なユーザの作成が完了しました。

# Fastly S3 Log の設定
引き続き Fastly S3 Log の設定を行います。

## 設定画面の起動
[Fastly Control Panel](https://manage.fastly.com/) にログイン後、メニューの「CONFIGURE」を選択し、ログを設定するサービスを選択、「CONFIGURATION」（または「EDIT CONFIGURATION」）より設定画面を開きます。

<img width="1038" alt="Screen_Shot_0029-02-25_at_14_19_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/149542/b1304ec1-bcd4-878c-c80b-5ae9af672d21.png">


## Log の設定
設定画面のメニューから「LOGGING」を開きます。今回は S3 の設定なので、Amazon Web Services のロゴを選択します。

![logging-fastly1-arrow.png](https://qiita-image-store.s3.amazonaws.com/0/149542/a5982c8a-a834-85bc-b30d-9c443dc7c3d9.png)


設定画面で各項目の設定を行います。

![logging-fastly-config-mask.png](https://qiita-image-store.s3.amazonaws.com/0/149542/caf9cafb-be11-cfdf-f6de-e79c69dc0450.png)

* Description: ログの名前を設定します。 Fastly S3 Log としています
* Log Format: ログに出力する項目を設定します。フォーマットは [Custom log formats](https://docs.fastly.com/guides/streaming-logs/custom-log-formats) を参照してください。 デフォルトは `%h %l %u %t %r %>s` ですが fastly_info.state はキャッシュの状態を確認に役立つ情報なので、ここでは追加しておきます。
* Bucket Name: S3 で設定したバケット名を設定します。ここでは `fastly-s3log` となります
* Access Key / Secret Key: IAM でユーザ作成時に取得した Access Key と Secret Key を設定します
* Period: ファイルのローテーション間隔です。 3600 秒（１時間）としています。
* Path: バケット内にフォルダがある場合には設定します。末尾に"/"をつけるのを忘れないでください。
* Domain: [AWS Regions and Endpoints S3](http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) において Endpoint 名を確認します。例えば、Tokyo であれば s3-ap-northeast-1.amazonaws.com となります。ここでは s3-us-west-2.amazonaws.com としています。
* Gzip Level: 圧縮する場合にはこの数値を設定します。非圧縮がデフォルトで 0 となっています
* Redundancy Level: S3 の冗長化レベルを設定します。デオフォルトは Standard で Reduced を選択することもできます

以上の項目を入力し、「CREATE」をクリックします。
設定を有効化するために「ACTIVATE」します。

# ログ出力の確認
設定が完了したら、実際にコンテンツにアクセスしてログが出力するかを確認しましょう。
ブラウザもしくは curl コマンドにて該当コンテンツに何度かアクセスします。正常にログが出力されている場合には S3 バケット内に日時とランダムな文字列の組み合わせのファイルが複数作成され、下記のようなログが出力されているはずです。

```
<134>2016-11-21T09:10:44Z cache-nrt6128 FastlyS3Log[5324]: 123.456.78.9 "-" "-" Mon, 21 Nov 2016 09:10:44 GMT GET / 200 MISS-CLUSTER
```

Fastly ログの S3 への出力は仕組み上、複数のファイルに分かれるようになっているため、複数のファイルを組み合わせて分析する必要があります。
また、正常にログが出力されていればブラウザにて

https://api.fastly.com/service/{SERVICE_ID}/logging_status

で出力された結果が `"BrokenNow":false` となっているはずです。正常にログ出力できない場合には下記のような出力となります。この場合は S3 でのポリシー設定が正しくされていない可能性があるため、IAM Policy Simulator や aws コマンドなどを利用して取得したキー（ユーザ）でアクセスできるかを確認してください。ログが正常に出力されない場合の原因としては、ポリシー設定がうまく適用できていないケースが最も多いです。

```
{"XXXX/Fastly S3 Log":{"BrokenSince":"2016-11-21T09:11:52.260839075Z","LastErrorTime":"2016-11-21T09:11:56.979456241Z","LastError":"unwanted http status 403: \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>ABCDEF123456</RequestId><HostId>abcdef+123456</HostId></Error>\"","BrokenNow":true}}
```

以上でログの設定が完了です。ログは今回設定した以外にも様々な項目を取得することができます。設定可能な項目については [Custom Log Format](https://docs.fastly.com/guides/streaming-logs/custom-log-formats) を参照してみてください。