【新機能】S3 Inventoryを試してみた #reinvent

2016.12.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。S3の新コンソールUIに合わせてリリースされた4つの新機能のうちの1つ、S3 Inventoryを試してみたので、ご紹介します。訳(後述)あってご紹介が遅れました、すみません。

その他のリリースについてはこちらをご確認ください。

S3 Inventoryとは

S3 Inventoryは、S3に保管されたオブジェクトの一覧を定期的に出力してくれる機能です。レポーティング目的の為、定期的にバケット内のファイル一覧が必要な場合等、便利に使えそうです。

S3 Inventoryの利用手順

まず、S3コンソールは新しいバージョンをオプトインしておく必要があります。公開ドキュメントは下記になります。

Inventory出力対象のS3バケット設定

Inventory(ファイル一覧)を取得したいS3バケットを選択し、"Management"タブからInventoryを選択し、"+ Add new"をクリックします。

s3_inventory_001

任意のInventory名とファイル一覧の出力先となるS3バケット等を指定します。今回はどちらもprefixは指定しないで設定してみました。

s3_inventory_002

項目 説明 備考
Inventory name 任意のインベントリ名
Filters 対象オブジェクトのprefix
Destination bucket 一覧出力先バケット
Destination prefix 一覧格納先prefix
Frequency 出力頻度(Daily/Weekly)

※出力先となるS3バケットは事前に同一リージョン内に作成しておく必要がありました

以下は、Advanced settingsから指定可能な項目です。要件に合わせて設定しましょう。

項目 説明 備考
Object versions 対象バージョン(Current version only/Include all versions) ※Versioningが有効の場合のみ検討
Optional fileds included in inventoy report 追加したいフィールド(Size/Last modified date/Storage class/Etag/Replication status)

"Save"をクリックすると、下記のような画面が登場しました。なんと、最初のレポートが出力されるまでに48hかかります、とのこと。

s3_inventory_003

ところが、これだけでは待てど暮らせどInventory情報が出力されませんでした。

一覧出力先S3バケットの設定

AWS Management Consoleから操作すると良い感じに出力先設定もしてくれることを期待したのですが、甘かったようです。確かに通常ログ出力設定をする場合には必ず実施する出力先バケット側での権限設定を実施していませんでした。よくよく見ると、こんなメッセージが書いてあります。

s3_inventory_004

Ensure policies are created to save inventory reports to the destination bucket

バケットポリシーが必要と思いましたが、先にご紹介した公開ドキュメントでは特にその言及が見当たらず、画面上でエラー等も確認できなかった為、調査に時間を要してしまったのですが、下記ページにバケットポリシーのサンプルがあるのを見つけました。

こちらの情報を頼りに、出力先のS3バケットにバケットポリシーを設定します。

s3_inventory_005

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::output-s3-bucket-name-xxx/*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012",
"s3:x-amz-acl": "bucket-owner-full-control"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:s3:::inventory-s3-bucket-name-xxx"
}
}
}
]
}

出力結果の確認

日付フォルダの下とmanifestファイルとdataフォルダの下に実際の一覧が格納されるようです。

$ aws s3 ls s3://output-s3-bucketname-xxx/ --recursive
2016-12-05 04:56:27 33 inventory-s3-bucket-name-xxx/inventory-test/2016-12-04T19-56Z/manifest.checksum
2016-12-05 04:56:27 514 inventory-s3-bucket-name-xxx/inventory-test/2016-12-04T19-56Z/manifest.json
2016-12-05 04:56:02 0 inventory-s3-bucket-name-xxx/inventory-test/data/
2016-12-05 04:56:23 26312 inventory-s3-bucket-name-xxx/inventory-test/data/111ca497-c5a4-xxxx-8d4e-03df0a095435.csv.gz

manifest.jsonには出力されたデータのサマリが記録されていました。

aws s3 cp s3://output-s3-bucket-name-xxx/inventory-s3-bucket-name-xxx/inventory-test/2016-12-04T19-56Z/manifest.json -
{
"sourceBucket" : "inventory-s3-bucket-name-xxx",
"destinationBucket" : "arn:aws:s3:::output-s3-bucket-name-xxx",
"version" : "2016-11-30",
"fileFormat" : "CSV",
"fileSchema" : "Bucket, Key, VersionId, IsLatest, IsDeleteMarker, Size, LastModifiedDate, ETag, StorageClass, ReplicationStatus",
"files" : [ {
"key" : "inventory-s3-bucket-name-xxx/inventory-test/data/111ca497-c5a4-xxxx-8d4e-03df0a095435.csv.gz",
"size" : 26312,
"MD5checksum" : "9fa6xxxxfc73d72ede4d30ae8fa4ace6"
} ]
}

gzipで圧縮されたcsvファイルが実際のファイル一覧のようです。今回Inventory情報を取得したS3バケットは、cloudtrailログを格納しているバケットだったので、下記のようなファイル一覧が表示されました。

$ aws s3 cp s3://output-s3-bucket-name-xxx/inventory-s3-bucket-name-xxx/inventory-test/data/111ca497-c5a4-43c6-8d4e-03df0a095435.csv.gz - | gzip -dc | head
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0000Z_Oa7ImW6rXmwkbF4F.json.gz","","true","false","888","2016-11-20T00:02:20.000Z","478b0693c3c9e36c258e7eb65fd27770","STANDARD",""
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0005Z_9Zx3gwsxqlLcTtKs.json.gz","","true","false","886","2016-11-20T00:07:24.000Z","ef141d0575db89dbc44025d3ef6f8e06","STANDARD",""
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0010Z_aXJ0JnCGNA79A3nq.json.gz","","true","false","1465","2016-11-20T00:12:30.000Z","09beea8593e11d7a8dba84da424f6220","STANDARD",""
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0015Z_PK6w2WbGNedWJaLd.json.gz","","true","false","747","2016-11-20T00:17:16.000Z","a057a2928b5ed349f1d869bdeeaefba9","STANDARD",""
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0020Z_w2L9nmdSc8GHI8Rf.json.gz","","true","false","948","2016-11-20T00:22:22.000Z","c9e358a3ec5f16ac6a912e3cffdb583d","STANDARD",""
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0025Z_J8qfane2CVIqsHoQ.json.gz","","true","false","885","2016-11-20T00:27:15.000Z","2a2077117c5e56aad8c746351b85592d","STANDARD",""
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0030Z_TNKJhBsW6AuqYplc.json.gz","","true","false","1249","2016-11-20T00:32:23.000Z","e575af24e02d7450cb75cd977af78ecf","STANDARD",""
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0035Z_ykzeHr84Y0WgeS9q.json.gz","","true","false","888","2016-11-20T00:37:18.000Z","ae46c67d2b73243f461330e4fb52fa9d","STANDARD",""
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0040Z_t7C46xcNtLFhMNtg.json.gz","","true","false","883","2016-11-20T00:42:25.000Z","cc35159b1d0116debdfd71016e38993e","STANDARD",""
"inventory-s3-bucket-name-xxx","AWSLogs/123456789012/CloudTrail/us-west-2/2016/11/20/123456789012_CloudTrail_us-west-2_20161120T0045Z_QtHbf8scdt5uQQjJ.json.gz","","true","false","886","2016-11-20T00:47:30.000Z","86621b79e0fd24f4981e1e1243c19e2c","STANDARD",""

下記ドキュメントに出力された各項目が何を表すのか具体的に記載がありました。

まとめ

Inventory出力先となるS3バケットのポリシー設定がわからず、設定方法にやや手間取ってしまいましたが、一度わかれば非常にシンプルに設定できることがわかりました。ちなみに出力先のバケットは同一リージョンである必要はありますが、別バケットではなく、同一バケット内の別パス(prefix)とすることも可能です。こういった新機能も上手に活用しながら、AWSを使いこなして行きたいです。