■ はじめに
https://dk521123.hatenablog.com/entry/2023/03/24/211033
の続き。 今回は、Scalaで、AWS SDK for Java を使ったサンプル集
目次
【1】S3 1)S3をハンドリングする共通処理 【2】Secrets Manager 1)Secrets Managerをハンドリングする共通処理
【1】S3
1)S3をハンドリングする共通処理
import scala.util.control.Breaks._ import scala.collection.JavaConversions._ import scala.reflect._ import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.s3.S3Client import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable import software.amazon.awssdk.services.s3.model.ListObjectsV2Request import software.amazon.awssdk.services.s3.model.ListObjectsV2Response import software.amazon.awssdk.services.s3.model.S3Object import software.amazon.awssdk.services.s3.model.GetObjectRequest import org.yaml.snakeyaml.Yaml import org.yaml.snakeyaml.constructor.Constructor import java.io.File import java.io.ByteArrayInputStream class S3Utils(val region: Region = Region.US_WEST_2) { val s3Client = S3Client.builder().region(region).build() def getFileList(bucketName: String, s3Key: String): Seq[S3FileObject] = { // See https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ListObjectsV2Request.html var listObjectsReqManual = ListObjectsV2Request.builder() .bucket(bucketName) .prefix(s3Key) .build() var fileList = Seq[S3FileObject]() breakable { while (true) { // See https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html val listObjResponse = s3Client.listObjectsV2(listObjectsReqManual) // See https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/S3Object.html for (content <- listObjResponse.contents()) { fileList = fileList :+ new S3FileObject( bucketName, content.key, content.size ) } val nextToken = listObjResponse.nextContinuationToken() if (nextToken == null) { // Done break } // Set next token and get next list listObjectsReqManual = listObjectsReqManual.toBuilder() .continuationToken(nextToken) .build() } } fileList } def readYaml[T: ClassTag](bucketName: String, s3Key: String): T = { val fileContentAsBytes = getS3FileBytes(bucketName, s3Key) readYaml[T](fileContentAsBytes) } def readYaml[T: ClassTag](inputPath: Array[Byte]): T = { val reader = new ByteArrayInputStream(inputPath) try { // e.g. "class ProcessInfo" val targetClass = classTag[T].runtimeClass.toString() // e.g. "class ProcessInfo" -> "ProcessInfo" val className = targetClass.replaceFirst("class ", "") val inputYaml = new Yaml(new Constructor(className)) return inputYaml.load(reader).asInstanceOf[T] } finally { reader.close() } } // https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example_s3_GetObject_section.html def getS3FileBytes(bucketName: String, s3Key: String): Array[Byte] = { val objectRequest = GetObjectRequest .builder() .key(s3Key) .bucket(bucketName) .build() val objectBytes = s3Client.getObjectAsBytes(objectRequest) objectBytes.asByteArray() } } class S3FileObject( val bucketName: String, val s3Key: String, val fileSize: Long ) { def getFullPath : String = s"s3://${bucketName}/${s3Key}" }
【2】Secrets Manager
1)Secrets Managerをハンドリングする共通処理
import java.nio.ByteBuffer import com.amazonaws.AmazonClientException import com.amazonaws.AmazonServiceException import com.amazonaws.client.builder.AwsClientBuilder import com.amazonaws.auth.profile.ProfileCredentialsProvider import com.amazonaws.AmazonWebServiceRequest import com.amazonaws.services.secretsmanager._ import com.amazonaws.services.secretsmanager.model._ class SecretsManagerUtils( endpoint: String = "secretsmanager.us-west-2.amazonaws.com", region: String = "us-west-2") { val config = new AwsClientBuilder.EndpointConfiguration(endpoint, region) val clientBuilder = AWSSecretsManagerClientBuilder.standard() clientBuilder.setEndpointConfiguration(config) // AWSSecretsManager val secretsClient = clientBuilder.build() def getSecretValue(secretName: String): String = { val secretValueResponse = getSecretValueResponse(secretName) if(secretValueResponse == null) { return "" } val secretValue = secretValueResponse.getSecretString() if (secretValue == null) "" else secretValue } def getSecretValueAsBytes(secretName: String): Array[Byte] = { val secretValueResponse = getSecretValueResponse(secretName) if(secretValueResponse == null) { return new Array[Byte](0) } val secretValue = secretValueResponse.getSecretBinary() val secretValueAsBytes = new Array[Byte](secretValue.remaining) secretValue.get(secretValueAsBytes) secretValueAsBytes } def getSecretValueResponse(secretName: String): GetSecretValueResult = { val secretValueRequest = new GetSecretValueRequest() .withSecretId(secretName) .withVersionStage("AWSCURRENT") secretsClient.getSecretValue(secretValueRequest) } }
関連記事
Scala ~ AWS SDK ~
https://dk521123.hatenablog.com/entry/2023/03/24/211033
Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / 繰り返し ~
https://dk521123.hatenablog.com/entry/2023/01/24/000000
Scala ~ 基本編 / Option型 ~
https://dk521123.hatenablog.com/entry/2023/03/09/000000
Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000
Scala ~ 基本編 / クラス ~
https://dk521123.hatenablog.com/entry/2023/03/14/000857
Scala ~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
Scala ~ 基本編 / 日付・日時 ~
https://dk521123.hatenablog.com/entry/2023/03/08/000000
Scala ~ 基本編 / 正規表現 ~
https://dk521123.hatenablog.com/entry/2023/03/18/034704
Scala ~ 基本編 / ジェネリック
https://dk521123.hatenablog.com/entry/2023/03/21/003817
Scala ~ ファイル名・パスの扱い ~
https://dk521123.hatenablog.com/entry/2023/03/11/000000
Scala ~ ファイルハンドリング ~
https://dk521123.hatenablog.com/entry/2023/01/03/000000
Scala ~ YAML ~
https://dk521123.hatenablog.com/entry/2023/03/16/012034
JavaでEmail ~ JavaMail / Text ~
https://dk521123.hatenablog.com/entry/2016/07/16/222422
JavaでEmail ~ JavaMail / 添付ファイル ~
https://dk521123.hatenablog.com/entry/2016/07/17/023459
JavaでEmail ~ SMTP認証 ~
https://dk521123.hatenablog.com/entry/2016/11/07/215251
JavaでEmail ~ SMTP認証 / DIGEST-MD5 ~
https://dk521123.hatenablog.com/entry/2016/12/07/222229
JavaでEmail ~ JavaMail / TLS ~
https://dk521123.hatenablog.com/entry/2017/05/03/163219
JavaでEmail ~ JavaMail / Return-Path・Errors-To ~
https://dk521123.hatenablog.com/entry/2017/05/07/000344
Amazon SES ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2017/04/28/234103
Amazon S3 ~ Boto3編 ~
https://dk521123.hatenablog.com/entry/2019/10/21/230004
Amazon S3 ~ Boto3でファイル存在チェック ~
https://dk521123.hatenablog.com/entry/2022/02/26/182526
AWS Glue ~ Scalaでの実装 ~
https://dk521123.hatenablog.com/entry/2023/03/17/000000
AWS Glue ~ ローカル環境を作成する / Glue v3.0版 ~
https://dk521123.hatenablog.com/entry/2022/01/31/165650
LocalStack ~ ローカルで疑似AWSを作成する ~
https://dk521123.hatenablog.com/entry/2019/12/14/010524
LocalStack ~ ローカルで疑似Lambda/S3/DynamoDBを作成する ~
https://dk521123.hatenablog.com/entry/2019/12/16/231149