こんにちは、今井です。
ありがたいことに、今年もre:Inventに参加しています。
今日のキーノートでたくさんの新サービスが発表されました。
その中で、Amazon Kinesis FirehoseのS3連携を、公式を参考にしてAWS CLIを使って試してみました。
手順
まずは、AWS CLIを最新化します。
1 2 3 4 |
$ sudo pip install awscli --upgrade $ aws --version aws-cli/1.8.11 |
AWS CLIのリージョンとプロファイルを指定します。
現状、us-east-1、us-west-2、eu-west-1のみ対応していますので、us-west-2を使ってみます。
1 2 3 |
$ export AWS_DEFAULT_REGION=us-west-2 $ export AWS_DEFAULT_PROFILE=your_profile |
ストリームを作成するコマンドのヘルプは以下のとおり
1 2 |
$ aws firehose create-delivery-stream help |
ストリームを作成するのに必要なパラメータを表示してみます。
S3とRedshiftの設定がありますので、Redshiftのほうは削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$ aws firehose create-delivery-stream --generate-cli-skeleton { "DeliveryStreamName": "", "S3DestinationConfiguration": { "RoleARN": "", "BucketARN": "", "Prefix": "", "BufferingHints": { "SizeInMBs": 0, "IntervalInSeconds": 0 }, "CompressionFormat": "", "EncryptionConfiguration": { "NoEncryptionConfig": "", "KMSEncryptionConfig": { "AWSKMSKeyARN": "" } } }, "RedshiftDestinationConfiguration": { "RoleARN": "", "ClusterJDBCURL": "", "CopyCommand": { "DataTableName": "", "DataTableColumns": "", "CopyOptions": "" }, "Username": "", "Password": "", "S3Configuration": { "RoleARN": "", "BucketARN": "", "Prefix": "", "BufferingHints": { "SizeInMBs": 0, "IntervalInSeconds": 0 }, "CompressionFormat": "", "EncryptionConfiguration": { "NoEncryptionConfig": "", "KMSEncryptionConfig": { "AWSKMSKeyARN": "" } } } } } |
IAM Roleが必要なようなので、こちらはマネジメントコンソールから作成します。
IAMのRoleの画面からCreate New Roleボタンを押して、Role名を入力します。
Role TypeとしてAmazon Kinesis Firehoseが用意されているので、その行のSelectボタンを押します。
PolicyとしてAmazonKinesisFirehoseS3DeliveryRoleを選択します。
Create Roleボタンを押して完了です。
また、S3バケットが必要なので作成します。
1 2 3 |
$ aws s3 mb s3://imai-us-west-2 make_bucket: s3://imai-us-west-2/ |
最終的なパラメータは以下のとおりです。create_delivery_stream.jsonという名前で保存します。
バケット名はARN表記なので、バケット名の前にarn:aws:s3:::をつけます。
S3オブジェクトのプリフィックスとして、Firehose/を指定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "DeliveryStreamName": "TryFirehose", "S3DestinationConfiguration": { "RoleARN": "arn:aws:iam::XXXXXXXXXXXX:role/TryFirehose", "BucketARN": "arn:aws:s3:::imai-us-west-2", "Prefix": "Firehose/", "BufferingHints": { "SizeInMBs": 1, "IntervalInSeconds": 60 }, "CompressionFormat": "GZIP", "EncryptionConfiguration": { "NoEncryptionConfig": "NoEncryption" } } } |
それでは、ストリームを作成してみましょう。
1 2 3 4 5 |
$ aws firehose create-delivery-stream --cli-input-json file://create_delivery_stream.json { "DeliveryStreamARN": "arn:aws:firehose:us-west-2:XXXXXXXXXXXX:deliverystream/TryFirehose" } |
作成されたストリームの情報を表示してみます。
DeliveryStreamStatusがACTIVEになるまで2、3分程度待ちました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ aws firehose describe-delivery-stream --delivery-stream-name TryFirehose { "DeliveryStreamDescription": { "HasMoreDestinations": false, "VersionId": "1", "CreateTimestamp": 1444292878.878, "DeliveryStreamARN": "arn:aws:firehose:us-west-2:XXXXXXXXXXXX:deliverystream/TryFirehose", "DeliveryStreamStatus": "CREATING", "DeliveryStreamName": "TryFirehose", "Destinations": [ { "DestinationId": "destinationId-000000000001", "S3DestinationDescription": { "RoleARN": "arn:aws:iam::XXXXXXXXXXXX:role/TryFirehose", "Prefix": "firehose", "BufferingHints": { "IntervalInSeconds": 60, "SizeInMBs": 1 }, "EncryptionConfiguration": { "NoEncryptionConfig": "NoEncryption" }, "CompressionFormat": "GZIP", "BucketARN": "arn:aws:s3:::imai-us-west-2" } } ] } } |
レコードを追加してみましょう。
1 2 3 4 5 |
$ aws firehose put-record --delivery-stream-name TryFirehose --record Data="some data\n" { "RecordId": "Rlaf6vWHOM6MDTwwYjkxhYk31RuRSgt8wNNoevUBcBebzqEjEYf/oOP/8j7YBdm9ueWEE2mWllJyqpa9al7+eFWP+miACJjiHXE0WGTUS3Fkx6ITNza2uflqIKqbV2mqCWmxcya72sCTGyFFfI0yWfO4qcXW0f2BdAqYYYf+L5xwBethYTVrRbGzovFmIAvA47wQ4i2GVSCWNdUeB6TjoU4iqsWcCqqO" } |
S3に保存されたか確認します。
1 2 3 4 5 |
$ aws s3 ls s3://imai-us-west-2/ PRE Firehose/ $ aws s3 ls s3://imai-us-west-2/Firehose/2015/10/08/08/ 2015-10-08 01:39:07 31 TryFirehose-1-2015-10-08-08-39-01-c932df0e-7ce1-4e81-9014-1baffa89d6fd.gz |
中身を見てみます。
1 2 3 |
$ aws s3 cp s3://imai-us-west-2/Firehose/2015/10/08/08/TryFirehose-1-2015-10-08-08-39-01-c932df0e-7ce1-4e81-9014-1baffa89d6fd.gz - | zcat some data\n% |
日本語も入れてみます。
1 2 3 4 5 |
$ aws firehose put-record --delivery-stream-name TryFirehose --record Data="とらい\nふぁいあほーす\n" { "RecordId": "+cZOTC7PY0PmqgSN8n+bSdBBLkLriYKKTEVxSLqc96TAmpzbb9M3u4zncomXLh0ujsbDkrl1zSetvCO9sEdo285q9XFlcyQYfdV5szLJYOp0i3MrY9gg2258YNfgxF0rwetV3+OrKRlc+hF0cpohnqTRQtxjiRgGOHbqFPR6jcChmpQV7oY7cTyqViCvMTkHEh7kDJotWAEa1FFJf32ivEOJQTd6vjDE" } |
日本語も問題なく入力できました。
1 2 3 4 5 6 |
$ aws s3 ls s3://imai-us-west-2/Firehose/2015/10/08/08/ 2015-10-08 01:39:07 31 TryFirehose-1-2015-10-08-08-39-01-c932df0e-7ce1-4e81-9014-1baffa89d6fd.gz 2015-10-08 01:43:47 54 TryFirehose-1-2015-10-08-08-43-41-1350d04b-6c02-4d1f-9c97-c27f9d4709a5.gz $ aws s3 cp s3://imai-us-west-2/Firehose/2015/10/08/08/TryFirehose-1-2015-10-08-08-43-41-1350d04b-6c02-4d1f-9c97-c27f9d4709a5.gz - | zcat とらい\nふぁいあほーす\n% |
利用料はデータを入れた分に対してかかるようですが、忘れずにストリームの削除をしておきます。
1 2 |
$ aws firehose delete-delivery-stream --delivery-stream-name TryFirehose |
最後に
後日Redshiftとの連携も試してみたいと思います!