2016-01-13 27 views
10

ラムダ関数を記述しました。 この関数はs3Bucket = "my-lambda"にアップロードされ、hello-lambda-roleロールとregionName = "us-west-2"にマップされます。AWS Lambda:Javaを使用してLambda関数からS3バケットにアクセスする方法

私は、「hello-lambda-role」というポリシーをマップしていて、「eu-west-1」の領域にあるs3Bucket = "some-other"にアクセスしたかったのです。

私はAmazonS3Clientを使用しているAPIクラスです。私の意図は、バケツから何らかのファイルを取得することです。しかし、その前に私は接続を行う必要があります。

import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.RequestHandler; 

public class LambdaFunctionHandler implements RequestHandler<Request, Response> { 

    public Response handleRequest(Request request, Context context) { 
     String greetingString = String.format("Hello %s %s.", 
       request.firstName, request.lastName); 
     return new Response(greetingString); 
    } 

} 

ここでは、バケットを一覧表示するクラスです。

public class Test{ 
    private static final Log logger = LogFactory.getLog(InvokeLambda.class); 
    private static final String awsAccessKeyId = "XXXXX"; 
    private static final String awsSecretAccessKey = "XXXXX"; 
    private static final String regionName = "eu-west-1"; 
    private static Region region; 
    private static AWSCredentials credentials; 
    private static AWSLambdaClient lambdaClient; 
    private static AmazonS3Client s3Client; 

    private static void init() { 
     credentials = new BasicAWSCredentials(awsAccessKeyId, 
       awsSecretAccessKey); 
     s3Client = (credentials == null) ? new AmazonS3Client() 
       : new AmazonS3Client(credentials); 
     region = Region.getRegion(Regions.fromName(regionName)); 
     s3Client.setRegion(region); 
     lambdaClient = (credentials == null) ? new AWSLambdaClient() 
       : new AWSLambdaClient(credentials); 

     lambdaClient.setRegion(region); 
     // lambdaClient.configureRegion(Regions.US_WEST_2); 
    } 

    /** 
    * The entry point into the AWS lambda function. 
    */ 
    public static void main(String... args) { 
     init(); 
     getExistingBucket(); 
    } 

    private static Bucket getExistingBucket() { 
     List<Bucket> buckets = s3Client.listBuckets(); 
     for (Bucket bucket : buckets) { 
      logger.error(bucket.getName()); 
     } 
     return null; 
    } 
} 
+1

? –

+1

コードにアクセスキーと秘密キーを配置することはパターンに反します。 AWSの外部でコードを実行するときは '〜/ .aws/credentials'ファイルに配置し、EC2またはLambdaで実行する場合はIAMロールを使用する必要があります。 –

答えて

10

使用するのと同じコードをあなたのテストでは同じように、あなたがAmazonS3Clientを作成するときに資格情報を提供する必要はありません除きます。ラムダが使用する役割には、S3バケットにアクセスする権限が必要であることに注意してください。 S3バケットの領域は重要ではありません。バケット名は、領域にかかわらずバケットを一意に識別する。

通常、Lambdaはイベントによってトリガーされますが、AWSLambdaClient.invoke()を呼び出して手動で実行することができます。その後、 "mylambda" としてAWSへ

public Response handleRequest(Request request, Context context) { 
    AmazonS3Client s3Client = new AmazonS3Client(); 
    S3Object = s3Client.getObject("some-other", request.getFilename()); 
    .... 
    return new Response(result); 
} 

展開すること、およびを使用してリモート呼び出し:例えば

あなたが持っている問題が何であるかを

lambdaClient.invoke(new InvokeRequest().withFunctionName("mylambda").withPayload("input")); 
関連する問題