2016-01-13 10 views
10

Ho scritto una funzione Lambda. Questa funzione è caricata in s3Bucket = "my-lambda", che è mappato al ruolo hello-lambda-role e regionName = "us-west-2".AWS Lambda: come accedere al bucket S3 dalla funzione Lambda utilizzando java

Ora volevo accedere a s3Bucket = "some-other" dove abbiamo mappato Policy con 'hello-lambda-role' ed è nella regione "eu-west-1".

Ecco la classe API che sto usando AmazonS3Client. La mia intenzione è di ottenere un file dal secchio "un altro". Ma prima devo stabilire la connessione.

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

} 

Ecco la classe che elenca il bucket.

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

Qual è il problema che stanno avendo? –

+1

Inserire la chiave di accesso e la chiave segreta nel codice è un anti-pattern. Dovresti inserirlo in un file '~/.aws/credentials' quando si esegue il codice all'esterno di AWS e utilizzare i ruoli IAM quando si esegue su EC2 o Lambda. –

risposta

10

Usa stesso codice come si farebbe nel test, tranne che non è necessario fornire le credenziali quando si crea il AmazonS3Client. Nota che il ruolo che usi lambda ha bisogno dell'autorità per accedere al tuo bucket S3. La regione del secchio S3 non dovrebbe importare; il nome del bucket identifica in modo univoco il bucket indipendentemente dalla regione.

I Lambd in genere vengono attivati ​​da un evento, ma è possibile chiamare AWSLambdaClient.invoke() per eseguirlo manualmente.

Ad esempio:

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

distribuirlo a AWS come "mylambda", e quindi richiamare in remoto con:

lambdaClient.invoke(new InvokeRequest().withFunctionName("mylambda").withPayload("input"));