Amazon Kinesis FirehoseのS3連携をAWSCLIから使ってみた
こんにちは、今井です。
ありがたいことに、今年もre:Inventに参加しています。
今日のキーノートでたくさんの新サービスが発表されました。
その中で、Amazon Kinesis FirehoseのS3連携を、公式を参考にしてAWS CLIを使って試してみました。
手順
まずは、AWS CLIを最新化します。
$ 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を使ってみます。
$ export AWS_DEFAULT_REGION=us-west-2
$ export AWS_DEFAULT_PROFILE=your_profile
ストリームを作成するコマンドのヘルプは以下のとおり
$ aws firehose create-delivery-stream help
ストリームを作成するのに必要なパラメータを表示してみます。
S3とRedshiftの設定がありますので、Redshiftのほうは削除します。
$ 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バケットが必要なので作成します。
$ 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/を指定しています。
{
"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"
}
}
}
それでは、ストリームを作成してみましょう。
$ 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分程度待ちました。
$ 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"
}
}
]
}
}
レコードを追加してみましょう。
$ aws firehose put-record --delivery-stream-name TryFirehose --record Data="some data\n"
{
"RecordId": "Rlaf6vWHOM6MDTwwYjkxhYk31RuRSgt8wNNoevUBcBebzqEjEYf/oOP/8j7YBdm9ueWEE2mWllJyqpa9al7+eFWP+miACJjiHXE0WGTUS3Fkx6ITNza2uflqIKqbV2mqCWmxcya72sCTGyFFfI0yWfO4qcXW0f2BdAqYYYf+L5xwBethYTVrRbGzovFmIAvA47wQ4i2GVSCWNdUeB6TjoU4iqsWcCqqO"
}
S3に保存されたか確認します。
$ 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
中身を見てみます。
$ 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%
日本語も入れてみます。
$ aws firehose put-record --delivery-stream-name TryFirehose --record Data="とらい\nふぁいあほーす\n"
{
"RecordId": "+cZOTC7PY0PmqgSN8n+bSdBBLkLriYKKTEVxSLqc96TAmpzbb9M3u4zncomXLh0ujsbDkrl1zSetvCO9sEdo285q9XFlcyQYfdV5szLJYOp0i3MrY9gg2258YNfgxF0rwetV3+OrKRlc+hF0cpohnqTRQtxjiRgGOHbqFPR6jcChmpQV7oY7cTyqViCvMTkHEh7kDJotWAEa1FFJf32ivEOJQTd6vjDE"
}
日本語も問題なく入力できました。
$ 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%
利用料はデータを入れた分に対してかかるようですが、忘れずにストリームの削除をしておきます。
$ aws firehose delete-delivery-stream --delivery-stream-name TryFirehose
最後に
後日Redshiftとの連携も試してみたいと思います!