エンジニア

2015.10.08

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名を入力します。
TryFirehose-1
Role TypeとしてAmazon Kinesis Firehoseが用意されているので、その行のSelectボタンを押します。
TryFirehose-2
PolicyとしてAmazonKinesisFirehoseS3DeliveryRoleを選択します。
TryFirehose-3
Create Roleボタンを押して完了です。
TryFirehose-4
また、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との連携も試してみたいと思います!

一覧に戻る