aws as mbaas 〜apiキーとかの話〜
TRANSCRIPT
Copylight © Classmethod, Inc.
AWS as MBaaS!!!~APIキーとかの話~
北海道iOS勉強会!クラスメソッド株式会社!
平井祐樹
Copylight © Classmethod, Inc.
自己紹介• 平井祐樹、28歳、B型!• 2012年2月入社(CM歴2年4ヶ月ぐらい)!• iOSアプリ開発歴:2年ぐらい!• Webアプリ開発(PHP、js)
2
Copylight © Classmethod, Inc.
アジェンダ• MBaaSとAWS!
• AWSをMBaaSとして実際に使ってみた話!• まとめ
3
Copylight © Classmethod, Inc.
MBaaSとAWS
4
Copylight © Classmethod, Inc.
MBaaSって?• Mobile Backend as a Serviceの略!• エムバース
5
Copylight © Classmethod, Inc.
MBaaSって?
6
MBaaSとは、スマートフォンアプリの開発に必要な汎用的機能をAPI、SDKで提供しサーバー側のコードを書くことなく、サーバー連携するスマートフォンアプリを効率よく開発できるようにするクラウドサービスです。!
(参考:NIFTY Cloud)
Copylight © Classmethod, Inc.
あっち側
MBaaSって?
7
モバイル
・データ集計/取得!・ユーザー管理!・通知
ストレージ
サーバー DB
Copylight © Classmethod, Inc.
MBaaSって?
あっち側のことを!よろしくやってくれるサービス
8
Copylight © Classmethod, Inc.
MBaaSの選択肢
9
Kii cloud NIFTY CloudParse.com
Copylight © Classmethod, Inc.
MBaaSに求めるもの• 認証/アクセス制御!• 共有データストア!• プッシュ通知!• などなど…
10
Copylight © Classmethod, Inc.
???
11
Copylight © Classmethod, Inc.
AWSが使えるんじゃね??
12
Copylight © Classmethod, Inc.
AWSが使えるんじゃね??• 認証/アクセス制御
13
Copylight © Classmethod, Inc.
AWSが使えるんじゃね??• 共有データストア
14
Copylight © Classmethod, Inc.
AWSが使えるんじゃね??• プッシュ通知
15
Copylight © Classmethod, Inc.
AWS SDK• Java/Ruby/PHP/.Netなど様々なプラットフォームごとにSDKが提供されている!
• 当然、iOS(Objective-C)用のSDKもある!• AWS SDKを使用するとAWSのサービスを直接利用できる
16
Copylight © Classmethod, Inc.
MBaaSの選択肢
17
Kii cloud NIFTY CloudParse.com
Copylight © Classmethod, Inc.
AWS を MBaaSとして!どこまで使えるのか?
18
Copylight © Classmethod, Inc.
絶賛検証中!
19
Copylight © Classmethod, Inc.
AWSをMBaaSとして!実際に使ってみた話
20
Copylight © Classmethod, Inc.
何からやってみよう?
21
Copylight © Classmethod, Inc.
とりあえず!iOSアプリからAWS SDKを使って!
S3にアクセスしてみる
22
Copylight © Classmethod, Inc.
Amazon S3• AWSの一つとして提供されているオンラインストレージサービス!
• ファイル(S3ではオブジェクトと呼ばれる)はバケットと呼ばれる入れ物にいれて管理する
23
Copylight © Classmethod, Inc.
S3に任意のバケットに保存されている!ファイル一覧を表示する!
iOSアプリを作って見よう。
24
Copylight © Classmethod, Inc.
どうやってやるの?!何が必要なの?
25
Copylight © Classmethod, Inc.
AWS SDKのサンプルを見ている
26
Copylight © Classmethod, Inc.
AWS SDKのサンプルIAMユーザーのアクセスキーIDとシークレットキーを用いて、S3にアクセスする。
27
Copylight © Classmethod, Inc.
ふぁ?IAM ユーザーって??
28
Copylight © Classmethod, Inc.
IAM• Identity and Access Management!• AWSの権限管理のサービス!• IAM ユーザー、IAM グループ、IAM ロールとかがある
29
Copylight © Classmethod, Inc.
IAM ユーザー• 一つのAWSアカウントの下に複数のユーザを作成することができる!
• そのユーザに特定のリソース、サービス、APIに関する権限を与えることができる!
• そのユーザーを使ってAWS管理画面にログインしたりAWSのリソースにアクセスできたりする
30
Copylight © Classmethod, Inc.
必要なもの• AWS SDK for iOS(v1.7.1)!• IAM ユーザーのアクセスキーIDとシークレットアクセスキー!
• S3のバケットとその中のファイル!• Xcode
31
Copylight © Classmethod, Inc.
S3に任意のバケットに保存されている!ファイル一覧を表示する!
iOSアプリを作って見よう。
32
Copylight © Classmethod, Inc.
やること1.IAMユーザーのアクセスキーIDとシークレットアクセスキーを取得する!2.S3にバケットとファイルを用意する!
3.iOSアプリを実装する
33
Copylight © Classmethod, Inc.
IAMユーザーのアクセスキー ID とシークレットアクセスキーを取得する
34
Copylight © Classmethod, Inc.
IAMユーザーのアクセスキー ID とシークレットアクセスキーを取得する
35
Copylight © Classmethod, Inc.
IAMユーザーのアクセスキー ID とシークレットアクセスキーを取得する
36
Copylight © Classmethod, Inc.
1. IAMユーザーのアクセスキー ID とシークレットアクセスキーを取得する
37
Copylight © Classmethod, Inc.
S3にバケットとファイルを用意する
38
Copylight © Classmethod, Inc.
iOSアプリを実装する
39
Copylight © Classmethod, Inc.
iOSアプリを実装する
40
// アクセスキーIDとシークレットアクセスキーを指定してS3クライアントインスタンスを生成する AmazonS3Client *s3Client = [[AmazonS3Client alloc] initWithAccessKey:@“[アクセスキーID]” withSecretKey:@“[シークレットアクセスキー]”]; // 指定しバケットのファイル一覧を取得する S3ListObjectsRequest *request = [[S3ListObjectsRequest alloc] initWithName:@"ios-s3-sample"]; S3ListObjectsResponse *response = [s3Client listObjects:request]; if (response.error) { NSLog(@"error: %@", response.error); } else { NSArray *objects = response.listObjectsResult.objectSummaries; for (NSString *objectSummary in objects) { NSLog(@"%@", objectSummary); } }
Copylight © Classmethod, Inc.
実行!
41
Copylight © Classmethod, Inc.
できた!
42
Copylight © Classmethod, Inc.
と思いきや
43
Copylight © Classmethod, Inc.
AWS SDKのREADMEを見てみると
44
Copylight © Classmethod, Inc.
iOSアプリを実装する// アクセスキーIDとシークレットアクセスキーを指定してS3クライアントインスタンスを生成する AmazonS3Client *s3Client = [[AmazonS3Client alloc] initWithAccessKey:@“[アクセスキーID]” withSecretKey:@“[シークレットアクセスキー]”]; // 指定しバケットのファイル一覧を取得する S3ListObjectsRequest *request = [[S3ListObjectsRequest alloc] initWithName:@"ios-s3-sample"]; S3ListObjectsResponse *response = [s3Client listObjects:request]; if (response.error) { NSLog(@"error: %@", response.error); } else { NSArray *objects = response.listObjectsResult.objectSummaries; for (NSString *objectSummary in) { NSLog(@"%@", objectSummary); } }
45
<- NG!!
Copylight © Classmethod, Inc.
サンプルではIAMユーザーのアクセスキーIDとシークレットアクセスキーを使ってるけど、実際にはやらないでね~
46
Copylight © Classmethod, Inc.
ふぁ?なんで??
47
Copylight © Classmethod, Inc.
で、そこについて調べてみました
48
Copylight © Classmethod, Inc.
S3やDynamoDBにアクセスしたい
49
APIキーが必要!!
Copylight © Classmethod, Inc.
APIキーとは?• 永続キー (long lived credentials)!
• 一時キー (short lived session credentials)!参考:IAMによるAWS権限管理運用ベストプラクティス (2) | Developers.IO
50
Copylight © Classmethod, Inc.
APIキーとは?IAMユーザーのアクセスキーIDとシークレットアクセスキーは永続キーの1つ
51
Copylight © Classmethod, Inc.
永続キーをモバイルアプリに埋め込むのは非常に危険!
52
Copylight © Classmethod, Inc.
WEBアプリの場合
53
サーバー
Copylight © Classmethod, Inc.
モバイルアプリの場合
キーが抜かれる 想定していない経路から!アクセスされてしまう!
Copylight © Classmethod, Inc.
永続キーを悪用されると・・・• 想定していない経路(別のアプリなど)からAWSリソースにアクセスされてしまう!
• 場合によっては元のサービスを妨害されてしまう
55
Copylight © Classmethod, Inc.
そもそも永続キーを使うと・・・• 永続キーを共通で使用すると、認証やらアクセス制限ができない
56
Copylight © Classmethod, Inc.
永続キーではなく!一時キーを使おう!
57
Copylight © Classmethod, Inc.
で、どうやって一時キーを使うの?
58
Copylight © Classmethod, Inc.
一時キー使う• Security Token Service (STS)!• IAMに従属するサブプロダクト的な位置付け!
• IAMロールに設定された権限を持った一時キーを入手することができる!
参考:IAMロール徹底理解 ~ AssumeRoleの正体 | Developers.IO
59
Copylight © Classmethod, Inc.
IAMロール• AWSの各種サービスにアクセスする際の権限を設定できる仕組み
60
Copylight © Classmethod, Inc.
STSを使えば、IAMロールの持つ権限を一時的に付与してもらうことが可能
61
Copylight © Classmethod, Inc.
一時キーを取得する手段• 自前のサーバーを用意して一時キーを発行してもらう!
• Facebook/Google/Amazon.comアカウントを使用する
62
<- サーバーサイドの技術も必要・・・
<- AWSだけでもいける!
Copylight © Classmethod, Inc.
ということで、実際にFacebook認証を使ってAWSの一時キーを取得してみる
63
Copylight © Classmethod, Inc.
よくあるサンプル
64
IAMユーザーのアクセスキーとシークレットキーを用いて、S3にアクセスする。
Copylight © Classmethod, Inc.
よくあるサンプル(改)• Facebook認証を使って取得したAWSの一時キーを用いて、S3に保存されている自分だけのファイル一覧を表示する。
65
Copylight © Classmethod, Inc.
よくあるサンプル(改)1.S3にバケットを用意する!
2.Facebookアプリケーションを作成する!
3.IAMロールを作成する!
4.iOSアプリを実装する
66
Copylight © Classmethod, Inc.
S3にバケットを用意する• このサンプルアプリで使用するS3のバケットを作成する!
• このバケット配下でFacebookアカウントごとにフォルダを分けて管理するようにする
67
Copylight © Classmethod, Inc.
Facebookアプリを作成する
68
Copylight © Classmethod, Inc.
Facebookアプリを作成する
69
Copylight © Classmethod, Inc.
Facebookアプリを作成する
70
Copylight © Classmethod, Inc.
Facebookアプリを作成する
71
Copylight © Classmethod, Inc.
Facebookアプリを作成する
72
Copylight © Classmethod, Inc.
Facebookアプリを作成する
73
Copylight © Classmethod, Inc.
ロールを作成する
74
Copylight © Classmethod, Inc.
ロールを作成する
75
Copylight © Classmethod, Inc.
ロールを作成する
76
Copylight © Classmethod, Inc.
ロールを作成する
77
Copylight © Classmethod, Inc.
ロールを作成する
78
Copylight © Classmethod, Inc. 79
{! "Version": "2012-10-17",! "Statement": [! {! "Effect": "Allow",! "Action": ["s3:ListBucket"],! "Resource": ["arn:aws:s3:::ios-s3-sample-bucket"],! "Condition": {! "StringLike": {! "s3:prefix": "${graph.facebook.com:id}/*"! }! }! },! {! "Effect":"Allow",! "Action":["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],! "Resource":[! "arn:aws:s3:::ios-s3-sample-bucket/${graph.facebook.com:id}",! "arn:aws:s3:::ios-s3-sample-bucket/${graph.facebook.com:id}/*"! ]! }! ]!}
Copylight © Classmethod, Inc.
ロールを作成する
80
Copylight © Classmethod, Inc.
iOSアプリを実装する
81
Copylight © Classmethod, Inc.
iOSアプリを実装する
82
Copylight © Classmethod, Inc. 83
// Facebook認証を実行する FBSession *session; [session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) { // Facebook認証で取得したトークンでAWSから一時キーを取得する NSString *role = @“arn:aws:iam::xxxxx:role/FacebookWIFS3FileStore”; NSString *accessToken = session.accessTokenData.accessToken; AmazonWIFCredentialsProvider *wif = [[AmazonWIFCredentialsProvider alloc] initWithRole:role andWebIdentityToken:accessToken fromProvider:@"graph.facebook.com"]; if (wif.subjectFromWIF) { // Facebookアカウントで取得した一時キーを指定してS3クライアントインスタンスを生成する AmazonS3Client *s3Client = [[AmazonS3Client alloc] initWithCredentialsProvider:self.wif]; // あとはファイルを閲覧したりアップロードしたり削除したり・・・ } }];
Copylight © Classmethod, Inc.
まとめ• 永続キーではなく一時キーを使え!• ことAWS as MBaaSではその手段は
Facebook/Google/Amazon.comアカウントを使用する方法しかなさそう
84