无法从链中的任何提供程序加载AWS凭证 - Android
我想在Android中调用lambda请求,但调用lambda方法后出现跟随错误。我尚未创建任何直接将参数传递给Lambda.invoke方法的接口类。我的代码按如下无法从链中的任何提供程序加载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)
你不使用你创建LambdaInvokerFactory。我认为你正在混合调用Lambda函数的不同方式。
您可以使用您的凭据在lambda客户端:
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类中的Lambda函数的Result模型。
@doorstck我添加了LambdaInvokerFactory factory = new LambdaInvokerFactory(context.getApplicationContext(), Regions.EU_WEST_1,credentialsProvider);此方法仍然出现错误“此身份池不支持未经身份验证的访问。” – Nayank
@Nayank是的。但是LambdaInvokerFactory和AWSLambdaClient是两种不同的方式。你在混合它。使用一个或另一个。看到我编辑如何使用工厂的例子。 – doorstuck
我执行的和你所显示的一样,请检查下面的代码是否正确? – Nayank
检查标题,并在文本中更清晰。认为标题和测试没有关系。 – josedlujan
但在调用方法时,它应该自动获得凭据吗? – Nayank
您有理由自己调用Lambda并且不使用API网关并通过HTTP调用Lambda? – doorstuck