2017-01-30 8 views
0

Androidでlambdaリクエストを呼び出そうとしていますが、lambdaメソッドを呼び出した後でエラーが発生しています。私はLambda.invokeメソッドに直接パラメータを渡すインターフェースクラスを作成していません。 Iコードチェーン内の任意のプロバイダからAWS資格情報を読み込むことができません - Android

CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
      getApplicationContext(), 
      AppConstant.CognitoPoolID, 
      Regions.EU_WEST_1); 
new LambdaInvokerFactory(this.getApplicationContext(), 
      Regions.EU_WEST_1, credentialsProvider); 

private static void invokeFunction() { 
    AWSLambdaClient lambda=new AWSLambdaClient(); 

    // out.println("Invoking function..."); 
    JSONObject x= new JSONObject(); 
    try{ 
     x.put("Command","GetMyLocations"); 

    }catch (JSONException e){ 

    } 

    InvokeResult result = lambda.invoke(new InvokeRequest() 
      .withFunctionName("LAMBDA_SDK_User") 
      .withInvocationType(InvocationType.RequestResponse) 
      .withLogType(LogType.None) 
      .withPayload(ByteBuffer.wrap(x.toString().getBytes()))); 

    Log.d("Lambda Result",""+result.getPayload()); 
    //out.print(); 
} 

エラーは以下のとおり:

01-30 16:51:44.027 20754-20754/com.example.sanmol E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.example.sanmol, PID: 20754 
                   com.amazonaws.AmazonClientException: Unable to load AWS credentials from any provider in the chain 
                    at com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:117) 
                    at com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:406) 
                    at com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:364) 
                    at com.example.sanmol.activities.RegistrationActivity.invokeFunction(RegistrationActivity.java:303) 
                    at com.example.sanmol.activities.RegistrationActivity.credentialsProvider(RegistrationActivity.java:286) 
                    at com.example.sanmol.activities.RegistrationActivity$AsyncTaskUserLogin.onPostExecute(RegistrationActivity.java:267) 
                    at com.example.sanmol.activities.RegistrationActivity$AsyncTaskUserLogin.onPostExecute(RegistrationActivity.java:232) 
                    at android.os.AsyncTask.finish(AsyncTask.java:632) 
                    at android.os.AsyncTask.access$600(AsyncTask.java:177) 
                    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
                    at android.os.Handler.dispatchMessage(Handler.java:106) 
                    at android.os.Looper.loop(Looper.java:209) 
                    at android.app.ActivityThread.main(ActivityThread.java:5916) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:372) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1005) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:800) 
+0

タイトルを確認して、テキストでより明確にしてください。タイトルとテストには関係がないと考えてください。 – josedlujan

+0

しかし、起動時に資格情報を自動的に取得する必要がありますか? – Nayank

+0

ラムダを自分で起動し、APIゲートウェイを使用せず、HTTP経由でラムダを起動する理由はありますか? – doorstuck

答えて

0

をあなたの作成したLambdaInvokerFactoryを使用していません。私はあなたがラムダ関数を呼び出す別の方法をミックスしていると思います。

あなたはラムダクライアントで資格情報を使用することができます。

AWSLambdaClient lambda=new AWSLambdaClient(credentialsProvider); 

それ以外の場合AWSは、このようなLambdaInvokeFactory.builder()でそれを行う方法について案内し読み:あなたが要求をモデル化する必要がある

public class Request { 
    // Standard POJO stuff here modeling the input your Lambda function 
    // expects. 
} 

public class Result { 
    // More standard POJO stuff here modeling the output your Lambda 
    // function produces. 
} 

public interface LambdaFunctions { 

    @LambdaFunction 
    Result doSomeStuff(Request request); 
} 

LambdaFunctions functions = LambdaInvokerFactory.builder() 
         .lambdaClient(AWSLambdaSyncClientBuilder.standard() 
          .withCredentials(credentialsProvider) 
          .build()) 
         .build(LambdaFunctions.class); 

Request request = new Request(...); 
Result result = functions.doSomeStuff(request); 

POJOクラスのラムダ関数の結果モデル。

+0

@doorstck LambdaInvokerFactoryファクトリ= new LambdaInvokerFactory(context.getApplicationContext()、 Regions.EU_WEST_1、credentialsProvider)を追加しました。このメソッドには引き続きエラーが発生します。「このIDプールでは認証されていないアクセスはサポートされていません。 – Nayank

+0

@Nayankはい。しかし、LambdaInvokerFactoryとAWSLambdaClientは2つの異なる方法です。あなたはそれを混ぜている。どちらか一方を使用してください。工場の使用方法の例を私の編集を参照してください。 – doorstuck

+0

あなたが示したのと同じものを実装しましたが、次のコードが正しいことを確認してください。 – Nayank

関連する問題