AWS Lambda
Guia do desenvolvedor

Tutorial: usar o AWS Lambda com o Mobile SDK para Android

Neste tutorial, você vai criar um aplicativo simples para dispositivos móveis Android que usa o Amazon Cognito para obter credenciais e invoca uma função do Lambda.

O aplicativo para dispositivos móveis recupera credenciais da AWS a partir de um grupo de identidades do Amazon Cognito e as utiliza para invocar uma função do Lambda com um evento que contém dados de solicitação. A função processa a solicitação e retorna uma resposta para o front-end.

Pré-requisitos

Este tutorial pressupõe que você tenha algum conhecimento das operações básicas do Lambda e do console do Lambda. Caso ainda não tenha feito isso, siga as instruções em Conceitos básicos do AWS Lambda para criar sua primeira função do Lambda.

Para seguir os procedimentos neste manual, você precisa de um terminal de linha de comando ou de um shell para executar os comandos. Nas listagens, os comandos são mostrados precedidos por um símbolo de prompt ($) e pelo nome do diretório atual, quando apropriado:

~/lambda-project$ this is a command this is output

Para comandos longos, um caractere de escape (\) é usado para dividir um comando em várias linhas.

No Linux e no macOS, use seu gerenciador preferido de pacotes e de shell. No Windows 10, você pode instalar o Subsistema Windows para Linux para obter uma versão do Ubuntu integrada com o Windows e o Bash.

Criar a função de execução

Crie a função de execução que dá à sua função permissão para acessar recursos do AWS.

Para criar uma função de execução

  1. Abra a página Roles no console do IAM.

  2. Selecione Create role.

  3. Crie uma função com as seguintes propriedades.

    • Trusted entity (Entidade confiável)AWS Lambda.

    • Permissions (Permissões)AWSLambdaBasicExecutionRole.

    • Nome da funçãolambda-android-role.

A política AWSLambdaBasicExecutionRole tem as permissões necessárias para a função gravar logs no CloudWatch Logs.

Criar a função

O exemplo a seguir usa dados para gerar uma resposta de string.

nota

Para o código de amostra em outras linguagens, consulte Código da função de amostra.

exemplo index.js

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

Para criar a função

  1. Copie o código de amostra em um arquivo chamado index.js.

  2. Crie um pacote de implantação.

    $ zip function.zip index.js
  3. Crie uma função do Lambda com o comando create-function.

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

Testar a função do Lambda

Invoque a função manualmente usando os dados de evento de exemplo.

Para testar a função do Lambda (AWS CLI)

  1. Salve o seguinte JSON de evento de exemplo em um arquivo, input.txt.

    { "firstName": "first-name", "lastName": "last-name" }
  2. Execute o seguinte comando invoke:

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

Criar um grupo de identidades do Amazon Cognito

Nesta seção, você cria um grupo de identidades do Amazon Cognito. O grupo de identidades tem duas funções do IAM. Você atualiza a função do IAM para usuários não autenticados e concede permissões para executar a função AndroidBackendLambdaFunction do Lambda.

Para obter mais informações sobre funções do IAM, consulte Funções do IAM no Guia do usuário do IAM. Para obter mais informações sobre os serviços do Amazon Cognito, consulte a página de detalhes de produto Amazon Cognito.

Para criar um grupo de identidades

  1. Abra o console do Amazon Cognito.

  2. Crie um novo grupo de identidades chamado JavaFunctionAndroidEventHandlerPool. Antes de seguir o procedimento para criar um grupo de identidades, observe o seguinte:

    • O grupo de identidades que você está criando deve permitir o acesso a identidades não autenticadas, pois nosso aplicativo móvel de exemplo não exige que um usuário faça login. Portanto, certifique-se de selecionar a opção Enable access to unauthenticated identities (Habilitar o acesso a identidades não autenticadas).

    • Adicione a seguinte instrução à política de permissão associada às identidades não autenticadas.

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

      A política resultante será a seguinte:

      { "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" ] } ] }

    Para obter instruções sobre como criar um grupo de identidades, faça login no Console do Amazon Cognito e siga o assistente New Identity Pool (Novo grupo de identidades).

  3. Observe o ID do grupo de identidades. Você especificará esse ID no aplicativo móvel que será criado na próxima seção. O aplicativo usa esse ID quando ele envia a solicitação ao Amazon Cognito para solicitar credenciais de segurança temporárias.

Criar um aplicativo Android

Crie um aplicativo móvel simples para Android que gera eventos e invoca funções do Lambda ao passar os dados de eventos como parâmetros.

As instruções a seguir foram verificadas usando o Android Studio.

  1. Crie um novo projeto Android chamado AndroidEventGenerator usando a seguinte configuração:

    • Selecione a plataforma Phone and Tablet.

    • Escolha Blank Activity.

  2. No arquivo build.gradle (Module:app), adicione o seguinte na seção dependencies:

    compile 'com.amazonaws:aws-android-sdk-core:2.2.+' compile 'com.amazonaws:aws-android-sdk-lambda:2.2.+'
  3. Crie o projeto para que as dependências necessárias sejam obtidas por download, conforme necessário.

  4. No manifesto do aplicativo Android (AndroidManifest.xml), adicione as seguintes permissões para que seu aplicativo possa se conectar à Internet. Você pode adicioná-las antes da tag </manifest> final.

    <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  5. Em MainActivity, adicione as seguintes importações:

    import com.amazonaws.mobileconnectors.lambdainvoker.*; import com.amazonaws.auth.CognitoCachingCredentialsProvider; import com.amazonaws.regions.Regions;
  6. Na seção package, adicione as seguintes duas classes (RequestClass e ResponseClass). Observe que o POJO é igual ao POJO que você criou na sua função do Lambda na seção anterior.

    • RequestClass. As instâncias dessa classe atuam como o POJO (objeto Java antigo simples) para dados de eventos que consiste em nome e sobrenome. Se você estiver usando Java para a função do Lambda que você criou na seção anterior, este POJO é o mesmo que o POJO que você criou no código de sua função do Lambda.

      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. No mesmo pacote, crie uma interface chamada MyInterface para invocar a função do AndroidBackendLambdaFunction Lambda.

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

    A anotação @LambdaFunction no código mapeia o método de cliente específico à função do Lambda do mesmo nome.

  8. Para manter o aplicativo simples, vamos adicionar um código para invocar a função do Lambda no manipulador onCreate() de eventos. Em MainActivity, adicione o seguinte código ao final do código 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. Execute o código e verifique-o como se segue:

    • O Toast.makeText() exibe a resposta retornada.

    • Verifique se o CloudWatch Logs exibe o log criado pela função do Lambda. Ele deve mostrar os dados do evento (nome e sobrenome). Você também pode verificar isso no console do AWS Lambda.