AWS Black Belt Techシリーズ Amazon Cognito / Amazon Mobile Analytics
AWS Black Belt Tech シリーズ 2015 - Amazon Cognito
-
Upload
amazon-web-services-japan -
Category
Technology
-
view
9.027 -
download
2
Transcript of AWS Black Belt Tech シリーズ 2015 - Amazon Cognito
Amazon CognitoMobile Identity Management and Data Synchronization
Amazon Data Service Japan K.K.
Solutions Architect
Keisuke Nishitani(@Keisuke69)
2015.09.28
自己紹介{
"Name" : "西谷圭介",
"Twitter" : "@Keisuke69",
"Profile" : {
"Role" : "Solution Architect",
"Customers": [
"Web Services",
"Start-up"
],
"Services" : [
"AWS Lambda",
"Amazon API Gateway",
"All Mobile Services"
]
}
}
Mobile開発における課題
モバイル開発における課題
デベロッパーが直面している課題
• 複数プラットフォームの断片的な利用• スケーラブルな同期処理の実装が困難• 高い運用管理コスト• ユーザエクスペリエンスの喪失• ユニークなユーザアイデンティティ管
理の難しさ• 限られた予算
Undifferentiated Heavy Lifting
モバイルアプリケーションアイデンティティの管理と認可
データ同期非同期通信
アクティブなデバイスの分析ユーザの行動分析
エンゲージメントの分析Push通知
イベントトリガーPlatformにとらわれない
モバイルバックエンドデータのバリデーションと変換
ファイル/メディア保管用ストレージ共有データベース
データの収集And More….
AWS Cloud Infrastructure
モバイル開発における課題
モバイルアプリケーションアイデンティティの管理と認可
データ同期非同期通信
アクティブなデバイスの分析ユーザの行動分析
エンゲージメントの分析Push通知
イベントトリガーPlatformにとらわれない
モバイルバックエンドデータのバリデーションと変換
ファイル/メディア保管用ストレージ共有データベース
データの収集And More….
AWS Cloud Infrastructure
モバイルに最適化されたコネクタ(Kinesis, S3, DynamoDB, SQS)
Amazon Cognito
Amazon Mobile Analytics
Amazon SNS Mobile Push
AWS Lambda
AWS Mobile Services
Amazon Cognito
Kinesis Connector DynamoDB Mapper S3 Transfer Mgr SQS Client SES Client
グローバルインフラ(リージョン、アベイラビリティゾーン、エッジロケーション)
コアとなるサービス群
モバイルに最適化されたコネクタ
モバイルに最適化されたサービス
お客様のモバイルアプリ、ゲーム、デバイス
AWS Mobile SDK, API Endpoints, Management Console
コンピュート ストレージ ネットワーク 分析 データベース
統合されたSDK
Amazon Mobile Analytics Amazon SNS
AWS Lambda
AWS Device FarmAmazon API Gateway
統合されたAWS Mobile SDK
• 全てのサービスに共通の認証機構
• オンライン・オフラインを自動でハンドリング
• クロスプラットフォームのサポート:Android, iOS, Fire OS, Unity, Xamarin
• Mobile OSへの最適化例: ローカルオフラインキャシュを利用するアーキテクチャ
• メモリフットプリントの削減
• 同梱するパッケージの選択も可
• 各プラットフォームのエンハンスに追従
iOS Android Fire OS Unity
Xamarin
ユーザ認証
アクセスの認可
データの同期
ユーザの行動分析
保持率の追跡
メディアの管理
メディアの配信
プッシュ通知の送信
共有データの保存
データのリアルタイム解析
Your Mobile App
モバイルアプリ開発の課題
Amazon Cognito(Identity Broker)
AWS Identity and Access Management
Amazon Cognito (Sync)
Amazon Mobile Analytics
Amazon Mobile Analytics
Amazon S3Transfer Manager
Amazon CloudFront(Device Detection)
Amazon DynamoDB(Object Mapper)
Amazon Kinesis(Recorder)
Amazon SNS Mobile Push
AWS Mobile SDK
User identity and sync withAmazon Cognito
Amazon Cognito
“Your app data is secure, available offline, and kept in sync between devices”
クロスデバイス・クロスプラットフォームなデータ同
期
デバイスとプラットフォームをまたがってユーザのデータ
を同期
モバイルデバイスから全AWSサービスへのセキュ
アなアクセス
セキュリティのベストプラクティスを実装
アイデンティティとアクセスの管理を簡潔に
IDプロバイダを越えたユニークなアイデンティティとして
ユーザを管理
独自認証
Amazon Cognito
“Your app data is secure, available offline, and kept in sync between devices”
クロスデバイス・クロスプラットフォームなデータ同
期
デバイスとプラットフォームをまたがってユーザのデータ
を同期
モバイルデバイスから全AWSサービスへのセキュ
アなアクセス
セキュリティのベストプラクティスを実装
アイデンティティとアクセスの管理を簡潔に
IDプロバイダを越えたユニークなアイデンティティとして
ユーザを管理
独自認証
ID プロバイダゲストアクセス独自認証システム
ユニーク ID
Joe Anna Bob
デバイスプラットフォーム
AWS サービス
複数の ID プロバイダをサポートID プロバイダと簡単に連携して認証Amazon, Facebook, Twitter, Google, OpenID Connect などに対応
ユニークなアイデンティティ認証済ユーザに対してユニークIDを割り当て、デバイスやプラットフォームをまたがって認識と管理
Amazon Cognito Identity
Mobile Analytics
S3 DynamoDB Kinesis
容易なセキュリティのベストプラクティス実装モバイルデバイスからAWSリソースへのセキュアなアクセスのためのやり取りをIAMと連携して簡略化
Amazon Cognitoの認証フロー
Amazon Cognito ID
(Temp Credentials)
Amazon
DynamoDB
End Users
Developer
App with
AWS Mobile
SDK
Access
to AWS
Services
Amazon Cognito
Identity Broker
User Name
Password
Amazon Cognito ID,
Temp Credentials
Amazon S3
Amazon Mobile
Analytics
Amazon Cognito
Sync Store
AWS
Management
Console
Token
Pool ID
Role ARNs
User Authentication
System
(Running on AWS or not)
Token
(参考)OpenID Connect
• 2014年2月に最終承認されたID連携に関する仕様
• 準拠しているIDプロバイダをCognitoでも利用可能例:Salesforce, Ping Identity, Google etc…
Developer Authenticated Identity
UsernameAnd Password
独自認証システム
パブリックIDプロバイダの併用CognitoのIDを元にパブリックなIDプロバイダと独自認証を併用して管理することも可能
認証基盤の実装が必要GetOpenIdTokenForDeveloperIdentity() を実装する既存の認証基盤を使う場合、改修が必要
独自認証システムの利用パブリックなIDプロバイダではなく独自のUsernameとPasswordを使って認証
Amazon Cognitoの認証フロー(Developer Authenticated Identities)
Amazon Cognito ID
(Temp Credentials)
Amazon
DynamoDB
End Users
Developer
App with
AWS Mobile
SDK
Access
to AWS
Services
Amazon Cognito
Identity Broker
Get OpenID Token
User Name
Password
Amazon Cognito ID,
Temp Credentials
Amazon S3
Amazon Mobile
Analytics
Amazon Cognito
Sync Store
AWS
Management
Console
OIDC Token
Pool ID
Role ARNs
独自認証システム
(AWS上で稼働していなくてもOK)OIDC Token
OIDC Token
未認証ユーザのゲストアクセス(Unauthenticated Identities)• IDプロバイダで認証をしていないユーザをゲス
トユーザとしてユニークIDの付与と管理– 未認証の場合、IDはデバイスと紐づくので同一デバイスから
のアクセスの場合に同一ユーザとして認識される– 未認証によるアクセスを許可しない設定も可能
• アプリやAWSリソースへのアクセスにアカウントの作成や認証が不要
– アクセス権限は未認証ユーザに対して割り当てたIAM Roleのポリシーに基づく
– センサーデバイス等のスクリーンや入力装置のないデバイスに対してもユニークIDの付与と管理が可能
• データはクラウド上に保存され後からログインした場合は自動でマージ
Visitor
Preferences
Cognito
Store
Guest
EC2 S3 DynamoDB Kinesis
(例)ゲストアクセスのユースケース
1. イベント会場でBLE(Bluetooth Low Energy)を利用したBeacon端末を配置2. ユーザ登録不要なイベント公式アプリを配布し、ゲストユーザとして認証情報を取得3. アプリはBeaconを拾って位置情報等を直接KinesisへPUT
• ゲストユーザはKinesisへのPUTだけを許可
4. Kinesisは受け取ったデータを元にリアルタイムに処理を実施(ヒートマップ作成等)
Amazon Kinesis
Cognito Identity Broker
Identity PoolRole ARN
Cognito IDTemporaly Credential
PUT
(参考)IAM Role用のアクセスポリシーの作成
{
"Effect":"Allow",
"Action":["s3:*"],
"Resource":"*"
}
{
"Effect": ”Deny",
"Action": ["dynamodb:*"],
"Resource": "*"
}
{
"Effect": "Allow",
"Action": [”cognito-sync:*"],
"Resource": "*"
}
Allow
Actions:
All S3, Sync store
Operations
Resource:
All resources within
these services
Deny
Actions:
All DDB Operations
Resource:
All resources
アクセスポリシーによる制限 (Policy Variables)
Allow
Actions:
All sync operations
Resource:
Only to that identity
{
"Effect": "Allow”,
"Action": ["s3:GetObject”,"s3:PutObject”],
"Resource": ["arn:aws:s3:::
myBucket/amazon/snakegame/
${cognito-identity.amazonaws.com:sub}"]
}
{
"Effect":"Allow",
"Action":"cognito-sync:*",
"Resource":["arn:aws:cognito-sync:us-east-1:
123456789012:identitypool/
${cognito-identity.amazonaws.com:aud}/identity/
${cognito-identity.amazonaws.com:sub}/*"]
}
Allow
Actions:
S3 Get/Put operations
Resource:
Only to a specific part
of bucket to that identity
Cognito Identityの基本的な流れ
1. マネージメントコンソール上でIdentity Poolを作成する
2. AWS SDK for Android/iOSをプロジェクトに追加する
3. Amazon Cognito credentials providerを初期化する
4. IDプロバイダの認証情報を渡す※未認証ユーザの場合は不要
5. Cognitoの認証情報を利用して、その他のAWSサービスのクライアントを初期化する
コード例(Android)
// Credential Providerの初期化
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(),
”ap-northeast-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX", // Identity Pool ID
Regions.AP_NORTHEAST_1 // Region
);
// Facebookユーザで認証する場合
Map logins = new HashMap();
logins.put("graph.facebook.com", Session.getActiveSession().getAccessToken());
credentialsProvider.setLogins(logins);
//AWSサービスへのアクセス
AmazonDynamoDB client = new AmazonDynamoDBClient(credentialsProvider);
//Congito IDの取得
String identityId = credentialsProvider.getIdentityId();
※上記例では省略していますが、事前にIDプロバイダを利用した認証処理の実装が必要です※実際にはLoaderやAsyncTask等を用いた非同期タスクとして実装すること
コード例(JavaScript)
// 以下ではFacebookユーザを認証済ユーザとして使用
AWS.config.region = ‘ap-northeast-1’; // リージョンの指定(必須)
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: ’ ap-northeast-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX’,
Logins: {
graph.facebook.com : facebookResponse.authResponse.accessToken
}
});
// Cognitoから付与されたIDの取得
AWS.config.credentials.get(function(err) {
if (!err) {
console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);
}
});
Amazon Cognito
“Your app data is secure, available offline, and kept in sync between devices”
クロスデバイス・クロスプラットフォームなデータ同
期
デバイスとプラットフォームをまたがってユーザのデータ
を同期
モバイルデバイスから全AWSサービスへのセキュ
アなアクセス
セキュリティのベストプラクティスを実装
アイデンティティとアクセスの管理を簡潔に
IDプロバイダを越えたユニークなアイデンティティとして
ユーザを管理
独自認証
モバイルSDKを使う際の認証情報の扱い
• AWSの各種サービスはあくまでバックエンド
• エンドユーザは必ずしもAWSユーザではない– アプリは開発者のアカウントで認証・認可を受ける必要がある
• アプリに開発者アカウントのアクセスキー等を埋め込んだら– アクセスキーが広範にばら撒かれることに– アクセスキーの不正利用を止めるためにキーを無効化したら
→ 全ユーザへのサービスが停止!!
• アクセスキーの定期的な更新で対処するにしても– 更新のたびにバージョンアップは非現実的– 更新前のアプリからはサービス利用不可に
セキュアなAWSアクセスを提供するには
• アプリに認証情報を埋め込むべきではない– アクセスキーが広範囲に配布されてしまう
– アクセスキーの更新はアプリのアップデートを伴うため非現実的
• エンドユーザ/端末ごとに異なる認証情報を提供すべき– ユーザごとに必要最小限の権限を与えるのは重要
– 不正利用発覚時に不正ユーザのみ権限を停止
• 認証情報は期限が来たら無効化されるべき– 不正ユーザの影響も期限付きに
Amazon Cognitoのセキュリティ
細やかなアクセス制御IAM との連携で AWS リソースへの細かなアクセス制御を実現
AWS Credentials の保護必要な権限だけを付与された一時的なクレデンシャルを取得できるので、アプリにクレデンシャルを埋め込まなくてよい
セキュリティのベストプラクティスを支援セキュリティトークンサービスと連携したり、トークンベンディングマシンを構築する必要はないセキュアに AWS サービスを利用
EC2 S3 DynamoDB Kinesis
S3
DynamoDB
Get Delete Put
Amazon Cognito
“Your app data is secure, available offline, and kept in sync between devices”
クロスデバイス・クロスプラットフォームなデータ同
期
デバイスとプラットフォームをまたがってユーザのデータ
を同期
モバイルデバイスから全AWSサービスへのセキュ
アなアクセス
セキュリティのベストプラクティスを実装
アイデンティティとアクセスの管理を簡潔に
IDプロバイダを越えたユニークなアイデンティティとして
ユーザを管理
独自認証
Amazon Cognito Sync クラウドへのデータ保存と同期
User Data
Storage and
Sync
Any Platform
iOS/Android/FireOS
アプリのデータ、設定、状態などを保存アプリやデバイスのデータをクラウドに保存でき、ログイン後にマージされる
クロスデバイス、クロスプラットフォームで同期ユーサデータや設定をデバイスをまたいで同期
k/v data
Identity pool
バックエンド不要スケーラブルで信頼性の高いデータ同期基盤を簡単に利用可能
SDKローカルデータストア
オフライン動作データはまずローカルのデータストレージに保存されるので、電波が不安定もしくは不通であってもシームレスに動作できる
インテリジェントな同期処理同期メソッドはローカルとクラウドのデータのバージョンを比較して、データをプッシュ/プル
柔軟なコンフリクトの解決同期メソッドは、変更を読み取り後、ローカルの変更をクラウドのデータストアへ書き込む。デフォルトでは、最後の書き込みを有効として保存する。開発者はコンフリクト処理を独自に上書きして実装することもできる。
Amazon Cognito Sync クラウドへのデータ保存と同期
Cognito Sync データモデル
Identity Pool: アプリユーザのPool。アプリ間で共有する場合もある
Identity: 個々のユーザ。IDプロバイダ間をまたいでユニーク。ゲストユーザも可
Dataset: ユーザごとのデータのグループ
Record: Key/Valueのユーザデータ
AWS Account
Dataset
IdentityIdentityIdentity
DatasetDataset
Identity
Pool
1:60
1:n
1:20
DatasetDataset
Record
1:1024
You
Your App
Your App Users
User Data
Container
User Data
Cognito Sync データモデル 例
User情報
Dataset
ゲームとユーティリティ、2種類アプリを
提供
Game情報
Dataset
Identitypool1
ユーティリティ
App
Game
App
AWS Account
Dataset
IdentityIdentityIdentity
DatasetDataset
Identity
Pool
1:60
1:n
1:20
DatasetDataset
Record
1:1024
You
Your App
Your App Users
User Data
Container
User Data
Dataset
• 各Identityは最大20個のDatasetを利用可能
• 各Datasetは1MBまでKey/Value形式のデータを保存可能– Key/Valueともに英数字の文字列– 保存可能なキーの数は1024個まで– 容量内であれば文字数の制限はなし– バイナリデータはbase64でエンコードして保管する
• 保管されるデータはすべて暗号化され、通信はHTTPSで暗号化されている
– ただし、ローカルキャッシュはユーザ側で暗号化を実装しなければ暗号化はされない
2種類のSyncronize
• synchronize– 接続が不安定な場合などのエラー時の処理は自分で実装する必要が
ある– コールされるとクラウド上の変更がpullされ、ローカルの変更は
pushされる
• synchronizeOnConnectivity– 実行時に接続可能であれば通常のsynchronizeメソッドと同様の振
る舞いをする– 接続できなかったときは接続状態を監視し可能になったら同期され
る– 複数回呼び出した場合は最後のオペレーションがキープされる
コード例(Android)
// Cognito Sync client の初期化
CognitoSyncManager syncClient = new CognitoSyncManager(
getApplicationContext(),
Regions.AP_NORTHEAST_1, // Region
credentialsProvider);
//Datasetをオープンし、レコードを追加
Dataset dataset = syncClient.openOrCreateDataset("myDataset");
dataset.put("myKey", "myValue");
//同期処理の実行
dataset.synchronize(new DefaultSyncCallback() {
@Override
public void onSuccess(Dataset dataset, List newRecords) {
//Your handler code here
}
});
コード例(JavaScript)
// Cognito Sync clientの初期化
AWS.config.credentials.get(function(){
var syncClient = new AWS.CognitoSyncManager();
syncClient.openOrCreateDataset('myDataset', function(err, dataset) {
dataset.put('myKey', 'myValue', function(err, record){
dataset.synchronize({
onSuccess: function(data, newRecords) {
// ハンドラを実装
}
});
});
});
});
モバイルアプリ(デバイス1)
Mobile SDK
Amazon CognitoSync Store
1. データ同期
モバイルアプリ(デバイス2)
Mobile SDK
Amazon SNSMobile Push
2. プッシュ通知
3. データ同期
Amazon SNS Mobile Push との連携
Amazon Cognito がデータストアが更新されたタイミングで、Amazon SNS Mobile Push と連携して、各デバイスにプッシュ通知を送信できる。
プッシュ通知を受け取ったアプリはデータストアの再同期を行うように実装するなど。
Amazon Cognito Push Sync
Amazon Kinesis との連携
Amazon Cognito のデータストアが更新されたタイミングで、Amazon Kinesis ストリームで更新や同期のデータを受け取ることができる。
モバイルアプリ
Mobile SDK
Amazon CognitoSync Store
1. データ同期
Amazon Kinesis
2. StreamContent
ストリームの内容
3. 例えば
Amazon Redshift
{
"identityPoolId" : "Pool Id”
"identityId" : "Identity Id ”
"dataSetName" : "Dataset Name”
"operation" : "(replace|remove)”
"kinesisSyncRecords" : [
{
"key" : "Key",
"value" : "Value",
"syncCount" : 1,
"lastModifiedDate" : 1424801824343,
"deviceLastModifiedDate" : 1424801824343,
"op": "(replace|remove)" }, ...
],
"lastModifiedDate": 1424801824343,
"kinesisSyncRecordsURL": "S3Url",
"payloadType" : "(S3Url|Inline)",
"syncCount" : 1
}
Amazon Cognito Stream
モバイルアプリ
Mobile SDK Amazon CognitoSync Store
1. データ同期AWS Lambda
2. Sync Trigger
Amazon Lambda との連携
3. 何か処理
Amazon Cognito Events
Key Value
住所 東京都□渋谷区□松濤□1丁目
Key Value
住所 東京都渋谷区松濤1丁目
元データ
修正済みデータ空白を削除
するプログラム
Lambda Function(Node.js)
Use cases
WebとMobileを跨ったユーザ識別
RSSリーダサービス
• ブラウザとモバイルアプリ間でシームレスにデータ連携
• サーバサイドのコードなし、この程度であればDynamoDBすら不要
App with AWS Mobile
SDK
JavaScriptSDK
S3
1. HTTP(S)アクセス
2. HTMLとJSをレスポンス
Cognito Identity
3. 認証・認可・ FBやGoogleのIDでログイン
Cognito Sync
4. データの同期・ MobileSDK、ブラウザ間でデータ同期
5. データのPush/Pull
ユーザ状態の遷移
当初はゲストユーザとして
ユーザ状態の遷移
その後、アカウント登録
• シームレスに遷移
ユーザ状態の遷移
複数のアカウントをリンク
• 一貫性のあるアイデンティティ管理が必要
結局、どう使えるのか?
アプリからAWSリソースにアクセスする際は何も考えず使っておけばいい
ありがちなデバイス間でのデータ共有で楽をしたいとき
料金
• 無料利用枠– 月あたり100万回の同期オペレーション
– 月あたり10GBのデータストア
– 最初の12ヶ月のみ
• それ以降– 10000回の同期オペレーションあたり$0.15
– 同期用データストア10GBを越えた分について1GBあたり$0.15
制約事項
アカウントあたりのIdentity Pool数 60
Identity PoolあたりのIdentity数 無制限
Identity Pool名の文字数 128bytes
ログインプロバイダ名の文字数 2048bytes
一回のList/Lookupコール時の結果数 60
Cognito Identity
Cognito SyncIdentityあたりのDataset数 20
DataSet辺りの最大レコード数 1024
1DataSetの最大サイズ 1MB
DataSet名の文字数 128bytes
Bulk Publish時の最小待ち時間 24時間
参考資料
• Twitter: @awsformobile
• ブログ– http://mobile.awsblog.com/
• ドキュメント– Amazon Cognito:
https://aws.amazon.com/documentation/cognito/
– Amazon Mobile Analytics: https://aws.amazon.com/documentation/mobileanalytics/
Q&A
Webinar資料の配置場所
• AWS クラウドサービス活用資料集– http://aws.amazon.com/jp/aws-jp-introduction/
ご参加ありがとうございました。