Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 当JAVA应用程序托管在AWS EC2实例中时,获取凭证提供程序以调用AWS Lambda函数_Amazon Web Services_Amazon Ec2_Aws Lambda_Aws Sdk_Amazon Iam - Fatal编程技术网

Amazon web services 当JAVA应用程序托管在AWS EC2实例中时,获取凭证提供程序以调用AWS Lambda函数

Amazon web services 当JAVA应用程序托管在AWS EC2实例中时,获取凭证提供程序以调用AWS Lambda函数,amazon-web-services,amazon-ec2,aws-lambda,aws-sdk,amazon-iam,Amazon Web Services,Amazon Ec2,Aws Lambda,Aws Sdk,Amazon Iam,我想使用AWS java sdk在java应用程序中调用AWS Lambda函数。这是可能的 访问密钥和安全密钥在awsCredentials中给出 ARN和有效负载在invokeRequest中给出 如下代码所示 BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); AWSStaticCredentialsProvider credentialsProvider = new AW

我想使用AWS java sdk在java应用程序中调用AWS Lambda函数。这是可能的

  • 访问密钥和安全密钥在awsCredentials中给出
  • ARN和有效负载在invokeRequest中给出
  • 如下代码所示

    BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
    
    AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
    
    AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
            .withCredentials(credentialsProvider)
            .build();
    
    InvokeRequest invokeRequest = new InvokeRequest()
            .withFunctionName(resourceName)
            .withPayload(payload)
            .withInvocationType(InvocationType.RequestResponse);
    
    InvokeResult invokeResult = awsLambda.invoke(invokeRequest);
    
    根据AWS文档,如果我的java应用程序托管在AmazonEC2实例中,那么从AmazonEC2实例授予对AWS资源的安全访问权限比手动输入访问密钥更方便。为了尝试,我在托管在EC2实例中的java应用程序中实现了以下修改后的代码

    InstanceProfileCredentialsProvider credentialsProvider = InstanceProfileCredentialsProvider.getInstance();
    
    AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
            .withCredentials(credentialsProvider)
            .build();
    
    InvokeRequest invokeRequest = new InvokeRequest()
            .withFunctionName(resourceName)
            .withPayload(payload)
            .withInvocationType(InvocationType.RequestResponse);
    
    InvokeResult invokeResult = awsLambda.invoke(invokeRequest);
    
    但它返回以下错误

    com.amazonaws.SdkClientException: The requested metadata is not found at http://169.254.169.254/latest/meta-data/iam/security-credentials/
    
    我想知道

  • 生成凭据的方法是否正确
  • 如果错误,正确的方法是什么
  • 错误消息的原因
  • 正确的做法是,


    将with lambda调用策略附加到ec2实例。然后在不明确指定任何ak/sk的情况下使用Aws sdk。SDK可以从元数据中正确获取临时令牌。

    您使用的是Amazon Linux吗?是。(ubuntu 18.04)当你
    ssh
    进入EC2实例并运行
    curl时会发生什么http://169.254.169.254/latest/meta-data/iam/security-credentials/
    ?您的代码是否在EC2实例中的docker容器中运行?它返回
    404-Not Found 404-Not Found
    No,我没有使用docker容器您能提供示例代码吗?我是否应该使用lambda invoke策略创建另一个IAM角色,尽管我仍然拥有lambda完全访问权限?元数据是通过创建那个角色来更新的吗?另外,下面的链接帮助我附加了一个实例概要文件。