Amazon Cognitoストリームを試してみた
はじめに
AWSチームのすずきです。
Amazon Cognitoではユーザー認証機能だけでなく、ユーザデータの保管が可能な同期ストアが提供されます。
先日リリースされたAmazon Cognitoストリームを利用する事で、Cognito同期ストアの更新情報をKinesisに流し込む事が可能になりました。
今回、Amazon Cognitoストリームを有効化し、Kinesisに登録されたレコードを確認する事ができましたので、紹介させていただきます。
Cognito設定
Cognito Identity Poolの作成
2015年現在、Cognito利用可能なUS-EAST(N.Virsinia)リージョンでIdentity Poolの作成を行います。
今回はテストの為「Unauth」、認証プロバイダとの連携しないCognito利用を可能とします。
IAMロールは新規作成します
Identity Poolの設定変更画面を開きます。
Kinesisストリームの作成と、Kinesis更新用のIAM設定を行います。
Kinesisのストリーム名とシャード数を指定します。
Kinesis更新用のIAM設定を行います。
「Allow」により、作成したKinesisストリームへのPUT権限が付与されます。
ストリームを有効化し、反映します。
IAM、Kinesisの確認
Identity Poolの作成により追加された、IAMロール、Kinesisストリームを確認します。
Cognito IdentityIdの取得
- AWS CLIを利用し、Cognito IdentityIdの取得を取得します。
- cognito権限はEC2ロールで付与済とします。
$ AWS_DEFAULT_REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//g'` $ export AWS_DEFAULT_REGION $ aws cognito-identity list-identity-pools --max-results 10 { "IdentityPools": [ { "IdentityPoolId": "us-east-1:aec7eb3d-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "IdentityPoolName": "test0306" } ] } $ aws cognito-identity get-id --account-id 784693731708 --identity-pool-id us-east-1:aec7eb3d-xxxx-xxxx-xxxx-xxxxxxxxxxxx { "IdentityId": "us-east-1:27189d5e-yyyy-yyyy-yyyy-yyyyyyyyyyyyy" }
Cognito 同期ストア操作
テスト用のDatasetを作成します。
Datasetにレコードを追加します。
レコードの更新を行います。
レコードの削除を行います。
レコードの更新、削除後は同期操作が必要です。
レコード、JSON形式で登録する事も可能です。
Kinesis操作
Kinesis 接続確認
- AWS CLIを利用して、KinesisのAPIが実行可能な事を確認します。
- KinesisのAPI権限はEC2ロールで付与済とします。
$ AWS_DEFAULT_REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//g'` $ export AWS_DEFAULT_REGION $ aws kinesis list-streams { "StreamNames": [ "stream0306" ] }
iterator取得
- get-shard-iteratorを実行します。
- 設置直後のKinesisストリームが利用されるものとし、shard-iterator-typeは「TRIM_HORIZON」で取得します。
$ KINESIS_STREAM="stream0306" $ KINESIS_SHARDID="shardId-000000000000" $ KINESIS_SHARD_ITERATOR=`aws kinesis get-shard-iterator \ --stream-name "${KINESIS_STREAM}" \ --shard-id "${KINESIS_SHARDID}" \ --shard-iterator-type TRIM_HORIZON \ | jq -r '.ShardIterator'`
records取得
- get-recordsを実行します。
- base64でエンコードされたData、デコードします。
- 取得したshard-iteratorは5分で失効するため、get-recordsの結果は一旦変数に反映します。
$ aws kinesis get-records --shard-iterator "${KINESIS_SHARD_ITERATOR}" { "Records": [ { "PartitionKey": "us-east-1:27189d5e-1336-yyyy-yyyy-yyyy-yyyyy-dataset-0306", "Data": "eyJpZGVudGl0eVBvb2xJZCI6InVzLWVhc3QtMTphZWM3ZWIzZC0zZjIwLTRjMTItYWU1Yi0zM(略)", "SequenceNumber": "49548534993188852874494037325111851874242518733736116226" }, { (略) } ], "NextShardIterator": "AAAAAAAAAAGXIBPbDr7yF04Vntv31w+jfSEUazApD2FZ5LD29IuWr+(略)" } $ TMP=`aws kinesis get-records --shard-iterator "${KINESIS_SHARD_ITERATOR}"| jq -r .Records[].Data | base64 -d`
Cognito Streamの登録情報確認
新規レコード追加
echo $TMP | jq '.| select (.syncCount == 1)' { "identityPoolId": "us-east-1:aec7eb3d-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "identityId": "us-east-1:27189d5e-yyyy-yyyy-yyyy-yyyyyyyyyyyyy", "datasetName": "dataset-0306", "operation": "replace", "payloadType": "Inline", "kinesisSyncRecords": [ { "key": "test-key", "value": "test-val", "syncCount": 1, "lastModifiedDate": 1425620485520, "deviceLastModifiedDate": 1425620485520, "op": "replace" } ], "kinesisSyncRecordsURL": null, "lastModifiedDate": 1425620485520, "syncCount": 1 }
レコードの更新
$ echo $TMP | jq '.| select (.syncCount == 2)' { "identityPoolId": "us-east-1:aec7eb3d-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "identityId": "us-east-1:27189d5e-yyyy-yyyy-yyyy-yyyyyyyyyyyyy", "datasetName": "dataset-0306", "operation": "replace", "payloadType": "Inline", "kinesisSyncRecords": [ { "key": "test-key", "value": "update-val", "syncCount": 2, "lastModifiedDate": 1425620711004, "deviceLastModifiedDate": 1425620711004, "op": "replace" } ], "kinesisSyncRecordsURL": null, "lastModifiedDate": 1425620711004, "syncCount": 2 }
レコードの削除
$ echo $TMP | jq '.| select (.syncCount == 3)' { "identityPoolId": "us-east-1:aec7eb3d-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "identityId": "us-east-1:27189d5e-yyyy-yyyy-yyyy-yyyyyyyyyyyyy", "datasetName": "dataset-0306", "operation": "replace", "payloadType": "Inline", "kinesisSyncRecords": [ { "key": "test-key", "value": null, "syncCount": 3, "lastModifiedDate": 1425620866041, "deviceLastModifiedDate": 1425620866041, "op": "remove" } ], "kinesisSyncRecordsURL": null, "lastModifiedDate": 1425620866041, "syncCount": 3 }
JSONレコード操作
$ echo $TMP | jq '.| select (.syncCount == 7)' { "identityPoolId": "us-east-1:aec7eb3d-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "identityId": "us-east-1:27189d5e-yyyy-yyyy-yyyy-yyyyyyyyyyyyy", "datasetName": "dataset-0306", "operation": "replace", "payloadType": "Inline", "kinesisSyncRecords": [ { "key": "test2", "value": "{\"Menu\":[{\"MenyCode\":1,\"MenuName\":\"まぐろ\",\"MenuPrice\":200},{\"MenyCode\":2,\"MenuName\":\"中トロ\",\"MenuPrice\":300},{\"MenyCode\":3,\"MenuName\":\"サーモン\",\"MenuPrice\":100}]}", "syncCount": 7, "lastModifiedDate": 1425623513912, "deviceLastModifiedDate": 1425623513912, "op": "replace" } ], "kinesisSyncRecordsURL": null, "lastModifiedDate": 1425623513912, "syncCount": 7 } $ echo $TMP | jq '.| select (.syncCount == 7)' | jq -r .kinesisSyncRecords[].value | jq . { "Menu": [ { "MenyCode": 1, "MenuName": "まぐろ", "MenuPrice": 200 }, { "MenyCode": 2, "MenuName": "中トロ", "MenuPrice": 300 }, { "MenyCode": 3, "MenuName": "サーモン", "MenuPrice": 100 } ] }
片付け
検証後、不要となった設定は放置せず、撤去をお勧めします。
- Cognito:Identity Pool
- Kinesis:ストリーム
- IAM:Congito関連ロール
まとめ
Cognitoストリーム、KinesisAppの開発により応用が効くと考えられます。
2015年3月時点のCognitoが利用可能なリージョンはVirsiniaとIrelandに限られますが、東京含めた今後の展開に期待です。