Авторизация Google OAuth2.0 Lambda S3 — Как ссылаться на файл из S3?

#java #amazon-web-services #amazon-s3 #aws-lambda #google-oauth-java-client

#java #amazon-веб-сервисы #amazon-s3 #aws-lambda #google-oauth-java-client

Вопрос:

Я пытаюсь использовать аутентификацию от Google, однако у меня есть сомнения в том, как я могу использовать этот метод:

 GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));
 

Файл MyProject-1234.json хранится в корзине S3, и в настоящее время он выполняется внутри lambda, как я могу использовать этот файл для аутентификации? Я не уверен, должен ли я отправлять путь и как, или я должен делать что-то еще.

Ответ №1:

Вам необходимо использовать AWS SDK для Java, чтобы сначала загрузить файл из S3 в локальную файловую систему функции Lambda. Вы не можете использовать FileInputStream для открытия объекта S3, вы можете использовать его только для открытия объекта локальной файловой системы.

Ответ №2:

Вот как вы можете извлечь файл из S3 и использовать его.

Короче говоря, getFileFromS3(...) метод вернет File объект, который вы можете использовать для создания FileInputStream .

 public class S3FileTest implements RequestStreamHandler {

    private LambdaLogger logger;

    @Override
    public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
        logger = context.getLogger();

        String bucketName = "==== S3 BUCKET NAME ====";
        String fileName = "==== S3 FILE NAME ====";

        File localFile = getFileFromS3(context, bucketName, fileName);

        if(localFile == null) {
            // handle error
            // return ....
        }

        // use the file
        GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(localFile))
                .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));
        
        // do more
        // ...
    }

    private File getFileFromS3(Context context, String bucketName, String fileName) {
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();

        // s3 client
        if (s3Client == null) {
            logger.log("S3 Client is null - can't continue!");
            return null;
        }

        // s3 bucket - make sure it exist
        if (!s3Client.doesBucketExistV2(bucketName)) {
            logger.log("S3 Bucket does not exists - can't continue!");
            return null;
        }


        File localFile = null;

        try {
            localFile = File.createTempFile(fileName, "");

            // get S3Object
            S3Object s3Object = s3Client.getObject(bucketName, fileName);

            // get stream from S3Object
            InputStream inputStream = s3Object.getObjectContent();

            // write S3Object stream into a temp file
            Files.copy(inputStream, localFile.toPath(), StandardCopyOption.REPLACE_EXISTING);

            return localFile;
        } catch (Exception e) {
            logger.log("Failed to get file from S3: "   e.toString());
            return null;
        }
    }
}
 

Комментарии:

1. Большое спасибо за ответ! Это мне ОЧЕНЬ помогло!