AWS Lambda のファンクションをモバイルアプリから呼び出せるようになりました!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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);
};

create-lambda-function

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 ファンクションの処理結果のレスポンスとして、メッセージが届きました!

lambda-invoke-response

iPod touch で試したんですが、プラットフォーム名は取得できませんでしたね。。

まとめ

モバイルアプリから Lambda を直接呼び出せるようになったことで、いよいよ 2-Tier が実用的になってきました!Lambda 関連のアップデートは他にもあるので、引き続き調査してブログ化していきたいと思います。

参考