AWS Lambda のファンクションをモバイルアプリから呼び出せるようになりました!
AWS Lambda がアップデートされました
いままで Lambda は AWS Mobile SDK からは呼び出すことができませんでしたが、本日のアップデートにより AWS Mobile SDK から呼び出すことができるようになり、さらに同期呼び出しが可能になりました! 同期呼び出しというのは、Lambda ファンクションの処理結果を呼び出し元にレスポンスとして返すことができる機能のことです。いままでは非同期呼び出ししか対応しておらず、呼び出し元には「正常に呼び出せましたよ」という情報しか渡ってきませんでした。
つまりこれは何を指すかと言うと、Lambda をモバイルアプリの API サーバのように利用できるようになったということです。激アツです! 昨日の Lambda のアップデートに伴い、AWS Mobile SDK もアップデートされました。AWS SDK for iOS は 2.1.1 に、AWS SDK for Android は になりました。今回は iOS で試してみます。
Lambda ファンクションの作成
まずは適当に Lambda ファンクションを作成します。リクエストパラメータを受けて、適当なレスポンスを返します。
exports.handler = function(payload, context) { console.log("Received event"); context.succeed("Hello "+ payload.firstName + ". Your user ID is " + context.identity.cognitoIdentityId + " and your platform is " + context.clientContext.client.platform); };
Cognito Identity Pool の作成
Cognito Identity Pool の作成方法は割愛します。IAM Role に Lambda ファンクションが呼び出せる Action を忘れずに付与してください。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "mobileanalytics:PutEvents", "cognito-sync:*", "lambda:InvokeFunction" ], "Effect": "Allow", "Resource": [ "*" ] } ] }
AWS SDK for iOS のインストール
AWS SDK for iOS は、2.1.0 からサービス単位で Pod が分割されました。従来の AWSiOSSDKv2 を使うと今までどおり全部入りになりますが、特定のサービスだけ使いたい場合は以下のような感じでOKです。
pod "AWSCore" pod "AWSCognito" pod "AWSLambda"
Lambda ファンクションを呼び出してみる
それではいよいよ呼び出してみましょう。適当な View Controller で呼び出しました。処理結果をアラートで出します。
#import "ViewController.h" #import <AWSCore/AWSCore.h> #import <AWSCognito/AWSCognito.h> #import <AWSLambda/AWSLambda.h> @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Cognito の認証 AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-east-1:8e31ca1b-020f-4bfa-becc-2588d07c0fb0"]; AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider]; [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration; AWSLambdaInvoker *lambdaInvoker = [AWSLambdaInvoker defaultLambdaInvoker]; [[lambdaInvoker invokeFunction:@"hello" JSONObject:@{@"firstName" : @"Yuki Suwa", @"identity" : @"123456"}] continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:^id(BFTask *task) { if (task.error) { NSLog(@"Error: %@", task.error); } if (task.exception) { NSLog(@"Exception: %@", task.exception); } if (task.result) { NSLog(@"Result: %@", task.result); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Lambda" message:task.result delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil]; [alert show]; } return nil; }]; }
Lambda ファンクションの処理結果のレスポンスとして、メッセージが届きました!
iPod touch で試したんですが、プラットフォーム名は取得できませんでしたね。。
まとめ
モバイルアプリから Lambda を直接呼び出せるようになったことで、いよいよ 2-Tier が実用的になってきました!Lambda 関連のアップデートは他にもあるので、引き続き調査してブログ化していきたいと思います。