AWS as MBaaS 〜APIキーとかの話〜

3,955 views

Published on

Published in: Engineering

AWS as MBaaS 〜APIキーとかの話〜

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

×