チュートリアル: Mobile SDK for Android で AWS Lambda を使用する - AWS Lambda

チュートリアル: Mobile SDK for Android で AWS Lambda を使用する

このチュートリアルでは、Amazon Cognito を使用して認証情報を取得し Lambda 関数を呼び出す、シンプルな Android モバイルアプリケーションを作成します。

このモバイルアプリケーションは、Amazon Cognito アイデンティティプールから AWS 認証情報を取得し、その認証情報を使用して、リクエストデータを含むイベントで Lambda 関数を呼び出します。この関数は、リクエストを処理し、レスポンスをフロントエンドに返します。

前提条件

このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。初めての方は、コンソールで Lambda の関数の作成 の手順に従って最初の Lambda 関数を作成してください。

次のステップを完了するには、コマンドを実行するコマンドラインターミナルまたはシェルが必要です。コマンドと予想される出力は、別々のブロックにリストされます。

aws --version

次のような出力が表示されます。

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

コマンドが長い場合、コマンドを複数行に分割するためにエスケープ文字 (\) が使用されます。

Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。Windows 10 では、Linux 用の Windows サブシステムをインストールして、Windows 統合バージョンの Ubuntu および Bash を入手できます。

実行ロールを作成する

AWS リソースにアクセスするためのアクセス権限を関数に付与する実行ロールを作成します。

実行ロールを作成するには

  1. IAM コンソールの [roles page (ロールページ)] を開きます。

  2. [ロールの作成] を選択します。

  3. 次のプロパティでロールを作成します。

    • 信頼されたエンティティ - AWS Lambda

    • アクセス許可 - AWSLambdaBasicExecutionRole

    • ロール名lambda-android-role

AWSLambdaBasicExecutionRole ポリシーには、ログを CloudWatch Logs に書き込むために関数が必要とするアクセス許可があります。

関数を作成する

次の例では、データを使用して文字列レスポンスを生成しています。

注記

他の言語によるサンプルコードについては、「」を参照してくださいサンプル関数コード

例 index.js

exports.handler = function(event, context, callback) { console.log("Received event: ", event); var data = { "greetings": "Hello, " + event.firstName + " " + event.lastName + "." }; callback(null, data); }

関数を作成するには

  1. サンプルコードを index.js という名前のファイルにコピーします。

  2. デプロイパッケージを作成します。

    zip function.zip index.js
  3. create-function コマンドを使用して Lambda 関数を作成します。

    aws lambda create-function --function-name AndroidBackendLambdaFunction \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws:iam::123456789012:role/lambda-android-role

Lambda 関数をテストする

サンプルイベントデータを使用して手動で関数を呼び出します。

Lambda 関数をテストするには (AWS CLI)

  1. 以下のサンプルイベント JSON を input.txt ファイル に保存します。

    { "firstName": "first-name", "lastName": "last-name" }
  2. 以下の invoke コマンドを実行します。

    aws lambda invoke --function-name AndroidBackendLambdaFunction \ --payload file://file-path/input.txt outputfile.txt

    AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。これをデフォルト設定にするには、aws configure set cli-binary-format raw-in-base64-out を実行します。詳細については、AWS CLI でサポートされているグローバルコマンドラインオプションを参照してください。

Amazon Cognito アイデンティティプールを作成する

このセクションでは、Amazon Cognito アイデンティティプールを作成します。アイデンティティプールには 2 つの IAM ロールがあります。認証されていないユーザー用に IAM ロールを更新し、AndroidBackendLambdaFunction Lambda 関数を実行するアクセス許可を付与します。

IAM ロールの詳細については、IAM ユーザーガイドIAM ロールをご参照ください。Amazon Cognito サービスの詳細については、Amazon Cognito の製品情報ページを参照してください。

ID プールを作成するには

  1. Amazon Cognito コンソールを開きます。

  2. JavaFunctionAndroidEventHandlerPool という名前の新しい ID プールを作成します。ID プールを作成する手順に従う前に、次のことに注意してください。

    • 作成する ID プールでは、認証されていない ID へのアクセスを許可する必要があります。この例のモバイルアプリケーションでは、ユーザーがログインする必要はないためです。したがって、必ず [認証されていない ID に対してアクセスを有効にする] オプションを選択してください。

    • 認証されていない ID に関連付けられているアクセス許可ポリシーに、次のステートメントを追加します。

      { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-east-1:123456789012:function:AndroidBackendLambdaFunction" ] }

      作成されるポリシーは次のとおりです。

      { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "mobileanalytics:PutEvents", "cognito-sync:*" ], "Resource":[ "*" ] }, { "Effect":"Allow", "Action":[ "lambda:invokefunction" ], "Resource":[ "arn:aws:lambda:us-east-1:account-id:function:AndroidBackendLambdaFunction" ] } ] }

    アイデンティティプールを作成する方法は、Amazon Cognito コンソールにログインし、[New Identity Pool] (新しいアイデンティティプール) のウィザードに従います。

  3. アイデンティティプール ID を記録します。次のセクションで作成するモバイルアプリケーションで、この ID を指定します。アプリケーションは、一時的なセキュリティ認証情報をリクエストするため Amazon Cognito にリクエストを送る際に、この ID を使用します。

Android アプリケーションの作成

イベントを生成し、パラメータとしてイベントデータを渡すことで Lambda 関数を呼び出すシンプルな Android モバイルアプリケーションを作成します。

次の手順は、Android Studio を使用して確認されました。

  1. 次の設定を使用して、AndroidEventGenerator という新しい Android プロジェクトを作成します。

    • [Phone and Tablet] プラットフォームを選択します。

    • [Blank Activity] を選択します。

  2. build.gradle (Module:app) ファイルで、dependencies セクションに以下を追加します。

    compile 'com.amazonaws:aws-android-sdk-core:2.2.+' compile 'com.amazonaws:aws-android-sdk-lambda:2.2.+'
  3. プロジェクトをビルドし、必要な依存関係が必要に応じてダウンロードされるようにします。

  4. Android アプリケーションマニフェスト (AndroidManifest.xml) で、次のアクセス権限を追加し、アプリケーションがインターネットに接続できるようにします。アクセス権限は、</manifest> 終了タグの直前に追加できます。

    <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  5. MainActivity で、次のインポートを追加します。

    import com.amazonaws.mobileconnectors.lambdainvoker.*; import com.amazonaws.auth.CognitoCachingCredentialsProvider; import com.amazonaws.regions.Regions;
  6. [package] セクションで、以下の 2 つのクラス(RequestClassResponseClass)を追加します。POJO が、前のセクションの Lambda 関数で作成した POJO と同じであることに注意してください。

    • RequestClass。このクラスのインスタンスは、名と姓で構成されるイベントデータの POJO (Plain Old Java Object) として機能します。前のセクションで作成した Lambda 関数に Java の例を使用している場合、この POJO は Lambda 関数コードで作成した POJO と同じです。

      package com.example....lambdaeventgenerator; public class RequestClass { String firstName; String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public RequestClass(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public RequestClass() { } }
    • ResponseClass

      package com.example....lambdaeventgenerator; public class ResponseClass { String greetings; public String getGreetings() { return greetings; } public void setGreetings(String greetings) { this.greetings = greetings; } public ResponseClass(String greetings) { this.greetings = greetings; } public ResponseClass() { } }
  7. 同じパッケージで、AndroidBackendLambdaFunction Lambda 関数を呼び出すために MyInterface というインターフェイスを作成します。

    package com.example.....lambdaeventgenerator; import com.amazonaws.mobileconnectors.lambdainvoker.LambdaFunction; public interface MyInterface { /** * Invoke the Lambda function "AndroidBackendLambdaFunction". * The function name is the method name. */ @LambdaFunction ResponseClass AndroidBackendLambdaFunction(RequestClass request); }

    コード内の @LambdaFunction の注釈により、特定のクライアントメソッドが同じ名前の Lambda 関数にマッピングされます。

  8. アプリケーションをシンプルに保つため、onCreate() イベントハンドラで Lambda 関数を呼び出すコードを追加します。MainActivity で、onCreate() コードの末尾に以下のコードを追加します。

    // Create an instance of CognitoCachingCredentialsProvider CognitoCachingCredentialsProvider cognitoProvider = new CognitoCachingCredentialsProvider( this.getApplicationContext(), "identity-pool-id", Regions.US_WEST_2); // Create LambdaInvokerFactory, to be used to instantiate the Lambda proxy. LambdaInvokerFactory factory = new LambdaInvokerFactory(this.getApplicationContext(), Regions.US_WEST_2, cognitoProvider); // Create the Lambda proxy object with a default Json data binder. // You can provide your own data binder by implementing // LambdaDataBinder. final MyInterface myInterface = factory.build(MyInterface.class); RequestClass request = new RequestClass("John", "Doe"); // The Lambda function invocation results in a network call. // Make sure it is not called from the main thread. new AsyncTask<RequestClass, Void, ResponseClass>() { @Override protected ResponseClass doInBackground(RequestClass... params) { // invoke "echo" method. In case it fails, it will throw a // LambdaFunctionException. try { return myInterface.AndroidBackendLambdaFunction(params[0]); } catch (LambdaFunctionException lfe) { Log.e("Tag", "Failed to invoke echo", lfe); return null; } } @Override protected void onPostExecute(ResponseClass result) { if (result == null) { return; } // Do a toast Toast.makeText(MainActivity.this, result.getGreetings(), Toast.LENGTH_LONG).show(); } }.execute(request);
  9. コードを実行し、以下のように確認します。

    • Toast.makeText() に、返されたレスポンスが表示されます。

    • CloudWatch Logs に、Lambda 関数によって作成されたログが示されます。これはイベントデータ(名と姓)を示します。この情報も、AWS Lambda コンソールで確認できます。