チュートリアル: Mobile SDK for Android で AWS Lambda を使用する
このチュートリアルでは、Amazon Cognito を使用して認証情報を取得し Lambda 関数を呼び出す、シンプルな Android モバイルアプリケーションを作成します。
このモバイルアプリケーションは、Amazon Cognito アイデンティティプールから AWS 認証情報を取得し、その認証情報を使用して、リクエストデータを含むイベントで Lambda 関数を呼び出します。この関数は、リクエストを処理し、レスポンスをフロントエンドに返します。
前提条件
このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。初めての方は、コンソールで Lambda の関数の作成 の手順に従って最初の Lambda 関数を作成してください。
以下の手順を完了するには、「AWS Command Line Interface (AWS CLI) バージョン 2」が必要です。コマンドと予想される出力は、別々のブロックにリストされます。
aws --version
次のような出力が表示されます。
aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64
コマンドが長い場合、コマンドを複数行に分割するためにエスケープ文字 (\
) が使用されます。
Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。
注記
Windows では、Lambda でよく使用される一部の Bash CLI コマンド (zip
など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、Windows Subsystem for Linux をインストール
実行ロールを作成する
AWS リソースにアクセスするためのアクセス権限を関数に付与する実行ロールを作成します。
実行ロールを作成するには
-
IAM コンソールの [roles page (ロールページ)
] を開きます。 -
[ロールの作成] を選択します。
-
次のプロパティでロールを作成します。
-
信頼されたエンティティ - 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); }
関数を作成するには
-
サンプルコードを
index.js
という名前のファイルにコピーします。 -
デプロイパッケージを作成します。
zip function.zip index.js
-
create-function
コマンドを使用して Lambda 関数を作成します。aws lambda create-function --function-name AndroidBackendLambdaFunction \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs16.x \ --role arn:aws:iam::
111122223333
:role/lambda-android-role
Lambda 関数をテストする
サンプルイベントデータを使用して手動で関数を呼び出します。
Lambda 関数をテストするには (AWS CLI)
-
以下のサンプルイベント JSON を
input.txt
ファイル に保存します。{ "firstName": "first-name", "lastName": "last-name" }
-
以下の
invoke
コマンドを実行します。aws lambda invoke --function-name AndroidBackendLambdaFunction \ --payload file://
file-path
/input.txt outputfile.txtAWS 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 プールを作成するには
-
Amazon Cognito コンソール
を開きます。 -
JavaFunctionAndroidEventHandlerPool
という名前の新しい ID プールを作成します。ID プールを作成する手順に従う前に、次のことに注意してください。-
作成する ID プールでは、認証されていない ID へのアクセスを許可する必要があります。この例のモバイルアプリケーションでは、ユーザーがログインする必要はないためです。したがって、必ず [認証されていない ID に対してアクセスを有効にする] オプションを選択してください。
-
認証されていない ID に関連付けられているアクセス許可ポリシーに、次のステートメントを追加します。
{ "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-east-1:
111122223333
: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] (新しいアイデンティティプール) のウィザードに従います。 -
-
アイデンティティプール ID を記録します。次のセクションで作成するモバイルアプリケーションで、この ID を指定します。アプリケーションは、一時的なセキュリティ認証情報をリクエストするため Amazon Cognito にリクエストを送る際に、この ID を使用します。
Android アプリケーションの作成
イベントを生成し、パラメータとしてイベントデータを渡すことで Lambda 関数を呼び出すシンプルな Android モバイルアプリケーションを作成します。
次の手順は、Android Studio を使用して確認されました。
-
次の設定を使用して、
AndroidEventGenerator
という新しい Android プロジェクトを作成します。-
[Phone and Tablet] プラットフォームを選択します。
-
[Blank Activity] を選択します。
-
-
build.gradle (
Module:app
) ファイルで、dependencies
セクションに以下を追加します。compile 'com.amazonaws:aws-android-sdk-core:2.2.+' compile 'com.amazonaws:aws-android-sdk-lambda:2.2.+'
-
プロジェクトをビルドし、必要な依存関係が必要に応じてダウンロードされるようにします。
-
Android アプリケーションマニフェスト (
AndroidManifest.xml
) で、次のアクセス権限を追加し、アプリケーションがインターネットに接続できるようにします。アクセス権限は、</manifest>
終了タグの直前に追加できます。<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-
MainActivity
で、次のインポートを追加します。import com.amazonaws.mobileconnectors.lambdainvoker.*; import com.amazonaws.auth.CognitoCachingCredentialsProvider; import com.amazonaws.regions.Regions;
-
[
package
] セクションで、以下の 2 つのクラス(RequestClass
とResponseClass
)を追加します。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() { } }
-
-
同じパッケージで、
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 関数にマッピングされます。 -
アプリケーションをシンプルに保つため、
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); -
コードを実行し、以下のように確認します。
-
Toast.makeText()
に、返されたレスポンスが表示されます。 -
CloudWatch Logs に、Lambda 関数によって作成されたログが示されます。これはイベントデータ(名と姓)を示します。この情報も、AWS Lambda コンソールで確認できます。
-