AWS S3, Glacierの勉強メモ

普段使っているS3について、新UIになってから余り触っていないことも有り整理してみた。

## Bucketの作成

別のバケットから設定をコピーしてバケットを作成できる。

![S3_replica.png](https://qiita-image-store.s3.amazonaws.com/0/45959/3283a677-4986-9fb1-fa9e-5b4cd6a3e299.png)

作成時にVersioning, Logging, Tagsを有効可・指定できる。

![s3_settings.png](https://qiita-image-store.s3.amazonaws.com/0/45959/29e78f5d-332f-f1d6-0391-6b872354e4b4.png)

そのバケットに対して、Publicの読み取り権限を付けるか指定できる。(これはアクセス管理でいうとACLの機能)
また、このバケットが何か別のバケットのアクセスログを保存するバケットである場合、Amazon S3 Log Delivery groupに書き込み権限を付与する必要がある。
参考: [Enabling Logging Programmatically](http://docs.aws.amazon.com/AmazonS3/latest/dev/enable-logging-programming.html#grant-log-delivery-permissions-general)

![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/45959/8402197e-1d96-56a3-56b4-cfd151a86278.png)

以上を設定すればバケットが作られる。

## S3のアクセス管理

### IAMポリシー
IAMユーザーに対して割り当てるポリシーで制御。
下記のように3つのグループで分けて考えるとよいか。

```json
{
   "Statement":[
      // S3ホームディレクトリでバケット一覧を表示するために必要
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListAllMyBuckets"
         ],
         "Resource":"arn:aws:s3:::*"
      },
      // バケットに対する操作を許可
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource":"arn:aws:s3:::bucket"
      },
      // オブジェクトに対する操作を許可
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
         ],
         "Resource":"arn:aws:s3:::bucket/*"
      }
   ]
}
```

参考: http://qiita.com/ryo0301/items/791c0a666feeea0a704c

### ACL

AWSのアカウント単位での制御を行う。

<img width="1135" alt="S3_Mana.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/66743a72-305c-6471-528f-520a6b645046.png">

### バケットポリシー

バケット/オブジェクトのアクセス権をJSONで詳しく設定できる。
JSONの作成には[ポリシージェネレータ](http://awspolicygen.s3.amazonaws.com/policygen.html)が使える。
下記、IP制限を行う例。

```json
{
    "Version": "2008-10-17",
    "Id": "Policy1501670161423",
    "Statement": [
        // バケットの全リソースにs3:GetObjectを許可
        {
            "Sid": "Stmt1501670153328",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::sample-20170802/*"
        },
        // IP CIDRsがSourceIPのリストに一致しない場合、すべてのActionを禁止
        {
            "Sid": "Stmt1501670153329",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::sample-20170802/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "192.168.20.0/24"
                }
            }
        }
    ]
}
```


## S3のヘッダ

HTTP経由でエンドポイントURLからダウンロードするときのレスポンスヘッダを付けられる。

<img width="697" alt="S3_Management_Console_🔊.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/293c77e2-7053-6b25-c772-52dee88f9257.png">

選べるのは下記のヘッダとその値。
* Cache-Control
* Content-Disposition
* Content-Encoding
* Content-Length
* Content-Type
* Expect
* Expires
* x-amz-website-redirect-location
* x-amz-meta-[xxxx]  xxxxは任意

NOTE: アップロード時にしか付加できない。

## 暗号化

サーバーサイドの暗号化機能。
上記のUIから行える。こちらはオブジェクトのアップロード後でも可能。

## アクセスログ

Logging機能を有効化している場合、そのターゲットバケットのフォルダにアクセスログが溜まっていく。

ファイル名は下記のような名前だった。
undefined2017-07-27-04-37-35-04A8A33AD07D0DE1.txt

## Static ホスティング

バケットやオブジェクトを公開設定にして、エンドポイントでアクセスするのと何が違うのだろうと思ったら
indexドキュメントやerrorドキュメントを設定したり別のURLにリダイレクトさせる設定などが行えるよう。

## CORSの設定

バケットのオブジェクトに対してクロスドメインアクセスを許可させるためのCORSの設定もできる。

<img width="872" alt="S3_Management_Console_🔊.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/512b0d36-6833-29bd-6cdd-6b85ee48ede9.png">

##  S3からグレイシア、復元

保存してから特定の日数が過ぎたオブジェクトをGlacierやS3 IAに移行したり、削除できる。

タグやプレフィックスのキーでフィルタできる。

まず、バケットの設定のライフサイクルルールの追加を選択。

<img width="1040" alt="S3_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/d3af00a9-ec5e-7212-f96f-5d63114d0b31.png">

特定の日数が過ぎたオブジェクトをGlacierやS3 IAに移行。

<img width="695" alt="S3_Management_Co.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/c3ac4b4f-45c0-0554-5753-a0d47e284003.png">

こちらは削除。

<img width="696" alt="S3_Management_Conso.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/cb05795e-2849-6305-bc10-a3f10fb6f011.png">

## クロスリージョンレプリケーション
UIから設定可。
ターゲットに選んだバケットにレプリカを作る。
バケットとターゲットバケットでバージョニングを有効にしておく必要がある。

## S3イベント通知

UIから設定可。
ObjectのPutやDeleteなどのイベントに対して、SNS, SQS、Lambdaに通知できる。

## Vpcエンドポイント

VPC内のインスタンスからインターネットを介さないでS3にアクセスできる。
ログなどを保存するときにコストを抑えられる。

http://blog.serverworks.co.jp/tech/2015/08/31/vpc-endpoint/

## S3の一時(期限付き)URL

非公開のオブジェクトに対して、一時的に期限付きでアクセスできるURLを作成する機能。
Expireする時間を指定できる。下記なら10秒有効なURLを作る。

```python
from boto3.session import Session

profile = [profile]
session = Session(profile_name=profile)

bucket = [バケット名]
key = [キー名]

s3 = session.client('s3')
url = '{}/{}/{}'.format(s3.meta.endpoint_url, bucket, key)

pre_signed_url = s3.generate_presigned_url(
    ClientMethod='get_object',
    Params={
        'Bucket': bucket,
        'Key': key
    },
    ExpiresIn=10
)

print(url)
print(pre_signed_url)
```

結果。
上がオブジェクトのエンドポイントのURLで下が期限付きURL。
クエリパラメータがくっついている。

```console
https://s3-us-west-2.amazonaws.com/[バケット名]/[キー名]
https://s3-us-west-2.amazonaws.com/[バケット名]/[キー名]?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=10&X-Amz-Credential=AKIAJFX6FRGIVYVBOIRA%2F20170802%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Date=20170802T094450Z&X-Amz-Signature=8a66431c068617e2e020c20a44985e48279dc2b70f6129233cc0585caa9bb394
```

## コマンド

その他、コマンドなど。

```bash
$ aws --profile [profile] s3 ls

# 添字が順番になっているバケットを消す
$ for i in {1..12}; do echo "$i"; aws --profile [profile] s3 rb s3://sample-test-20170726-$i --force;  done
```