【Scala】Scala ~ JDBC / DB接続 ~

■ はじめに

SparkからSnowflakeへの接続について考える
https://dk521123.hatenablog.com/entry/2023/03/19/013833

で、JDBCでもSnowflakeにアクセスすることに触れたが
今回は、ScalaでJDBCドライバからDBにアクセスすることについて触れる

目次

【1】JDBCドライバ取得
 1)PostgreSQL
 2)Snowflake
【2】JDBC ドライバー
 1)JDBC ドライバークラス
 2)JDBC ドライバー接続文字列
【3】API
 1)PostgreSQL
 2)Snowflake
【4】サンプル
 1)PostgreSQL

【1】JDBCドライバ取得

1)PostgreSQL

libraryDependencies ++= Seq(
  "org.postgresql" % "postgresql" % "42.6.0",

https://mvnrepository.com/artifact/org.postgresql/postgresql

2)Snowflake

libraryDependencies ++= Seq(
  "net.snowflake" % "snowflake-jdbc" % "3.13.28",

https://mvnrepository.com/artifact/net.snowflake/snowflake-jdbc
https://docs.snowflake.com/ja/user-guide/jdbc-download#integrating-the-driver-into-a-maven-project

【2】JDBC ドライバー

1)JDBC ドライバークラス

[1] PostgreSQL

Class.forName("org.postgresql.Driver")

[2] Snowflake

Class.forName("net.snowflake.client.jdbc.SnowflakeDriver")

https://docs.snowflake.com/ja/user-guide/jdbc-configure#jdbc-driver-class
https://docs.snowflake.com/ja/user-guide/jdbc-api#object-driver

2)JDBC ドライバー接続文字列

[1] PostgreSQL

// jdbc:postgresql://<host>:<port>/<db_name>?<connection_params>
val connectionURL ="jdbc:postgresql://localhost:5432/sample_db"

[2] Snowflake

// Syntax
// jdbc:snowflake://<account_identifier>.snowflakecomputing.com/?<connection_params>
val connectionURL = "jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?query_tag='folder%3Dfolder1%20folder2%26'

https://docs.snowflake.com/ja/user-guide/jdbc-configure#jdbc-driver-connection-string

【3】API

1)PostgreSQL

https://www.postgresql.jp/document/7.4/html/jdbc.html

2)Snowflake

* メソッドの中には、Snowflake独自の動きをするメソッドも
 ちらほらあるので使う前に確認しておいた方がよさそう

オブジェクト: Statement
https://docs.snowflake.com/ja/user-guide/jdbc-api#object-statement
オブジェクト: PreparedStatement
https://docs.snowflake.com/ja/user-guide/jdbc-api#object-preparedstatement

【4】サンプル

1)PostgreSQL

例1:SELECT文

import java.sql.DriverManager
import java.sql.Connection

object  Hello {
  def main(args: Array[String]) {
    val dbUrl = "jdbc:postgresql://localhost:5432/sample_db"
    val dbUser = "postgres"
    val dbPassword = "password"

    var dbConnector: Connection = null
    Class.forName("org.postgresql.Driver")
    try {
      dbConnector = DriverManager.getConnection(dbUrl, dbUser, dbPassword)
      val sql = "SELECT user_id, user_name, created_at FROM users LIMIT ?"
      val limit = 5
      val sqlStatement = dbConnector.prepareStatement(sql)
      sqlStatement.setInt(1, limit)
      val resultSet = sqlStatement.executeQuery()
      var index = 0
      while (resultSet.next()) {
        println(s"*[${index}]******************")
        println("user_id: " + resultSet.getInt(1))
        println("user_name: " + resultSet.getString("user_name"))
        println("created_at: " + resultSet.getTimestamp("created_at"))
        println("*******************")
        index = index + 1
      }
      resultSet.close()
      sqlStatement.close()
    } finally {
      if (dbConnector != null) {
        dbConnector.close()
      }
    }
    println("Done...")
  }
}

サンプルデータ

CREATE TABLE IF NOT EXISTS "users" (
    "user_id" INTEGER NOT NULL,
    "user_name" VARCHAR(50) NOT NULL,
    "created_at" TIMESTAMP NULL DEFAULT 'CURRENT_TIMESTAMP',
    PRIMARY KEY ("user_id")
);

INSERT INTO "users" ("user_id", "user_name", "created_at") VALUES
    (1, 'Mike', '2019-12-19 21:50:21.3885'),
    (2, 'Tom', '2019-12-19 21:50:21.3885'),
    (3, 'Sam', '2019-12-19 21:50:21.3885'),
    (4, 'Kevin', '2019-12-19 21:50:27.483248'),
    (5, 'Smith', '2019-12-19 21:50:27.484514'),
    (6, 'Ken', '2019-12-19 21:50:27.484514'),
    (10, 'Sam', '2020-08-26 22:39:55.175736'),
    (12, 'Naomi', '2020-08-26 22:39:55.175736'),
    (20, 'Tim', '2021-08-02 16:39:55.175736'),
    (30, 'kevin', '2021-08-02 16:40:55.175736');

例2:複数SQL文実行 / addBatch

import java.sql.DriverManager
import java.sql.Connection

object  Hello {
  def main(args: Array[String]) {
    val dbUrl = "jdbc:postgresql://localhost:5432/sample_db"
    val dbUser = "postgres"
    val dbPassword = "password"

    var dbConnector: Connection = null
    Class.forName("org.postgresql.Driver")
    try {
      dbConnector = DriverManager.getConnection(dbUrl, dbUser, dbPassword)
      val statement = dbConnector.createStatement()
      statement.addBatch("/*ex1*/ DROP TABLE IF EXISTS test;")
      statement.addBatch("/*ex2*/ CREATE TABLE test(id integer, name varchar);")
      statement.addBatch("/*ex3*/ INSERT INTO test VALUES(1, 'Mike');")
      statement.addBatch("/*ex4*/ INSERT INTO test VALUES(2, 'Smith');")
      val results = statement.executeBatch()
      println(s"Result ${results.length}")
      statement.close()
    } finally {
      if (dbConnector != null) {
        dbConnector.close()
      }
    }
    println("Done...")
  }
}

例3:複数SQL文実行 / execute

import java.sql.DriverManager
import java.sql.Connection

object  Hello {
  def main(args: Array[String]) {
    val dbUrl = "jdbc:postgresql://localhost:5432/sample_db"
    val dbUser = "postgres"
    val dbPassword = "password"

    var dbConnector: Connection = null
    Class.forName("org.postgresql.Driver")
    try {
      dbConnector = DriverManager.getConnection(dbUrl, dbUser, dbPassword)
      val statement = dbConnector.createStatement()
      val param11 = 1
      val param12 = "Mike"
      val param21 = 2
      val param22 = "Kevin"
      val sql = s"""
      -- ex1
      DROP TABLE IF EXISTS test2;
      -- ex2
      CREATE TABLE test2 (
        id integer,
        name varchar
      );
      -- ex3
      INSERT INTO test2 VALUES(${param11}, '${param12}');
      INSERT INTO test2 VALUES(${param21}, '${param22}');
      INSERT INTO test2 VALUES(3, 'Tommy');
      """
      val isOk = statement.execute(sql)
      println(s"Result ${isOk}")
      statement.close()
    } finally {
      if (dbConnector != null) {
        dbConnector.close()
      }
    }
    println("Done...")
  }
}

関連記事

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
ScalaEnum
https://dk521123.hatenablog.com/entry/2023/01/05/000000
Scala ~ ファイル名・パスの扱い ~
https://dk521123.hatenablog.com/entry/2023/03/11/000000
Scala ~ ファイルハンドリング ~
https://dk521123.hatenablog.com/entry/2023/01/03/000000
ScalaYAML
https://dk521123.hatenablog.com/entry/2023/03/16/012034
ScalaAWS SDK
https://dk521123.hatenablog.com/entry/2023/03/24/211033
SBT ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/22/000000
SBT ~ 基本編 / build.sbt ~
https://dk521123.hatenablog.com/entry/2023/01/27/000000
SBT ~ 基本編 / sbtコマンド ~
https://dk521123.hatenablog.com/entry/2023/01/26/000000
SBT ~ sbtプラグイン
https://dk521123.hatenablog.com/entry/2023/01/25/000000
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
SparkからSnowflakeへの接続について考える
https://dk521123.hatenablog.com/entry/2023/03/19/013833

【Docker】Docker compose ~ LocalStack/Glue4.0 ~

■ はじめに

Spark/Scalaの開発環境構築 ~ Windows編 ~
https://dk521123.hatenablog.com/entry/2023/03/20/115450

で、『本当は、Dockerで一発でばーんって作りたい、、、』って
言ったのだが、それを実践してみた
以前やった

https://dk521123.hatenablog.com/entry/2022/01/31/165650
https://dk521123.hatenablog.com/entry/2022/01/31/165650

の Glue4.0版でLocalStackを加えて、Docker composeで作ってみた

目次

【1】導入するコンポーネント
 1)LocalStack
 2)Glue v4 on Local
【2】前提条件
 1)Docker/Docker compose
 2)その他開発環境
【3】構築手順
 1)設定ファイル作成
 2)コンテナ起動
 3)動作確認
 4)コンテナ停止
【4】トラブル
 1)エラー「Cannot connect to the Docker daemon」が表示

【1】導入するコンポーネント

* 以下のコンポーネントを Docker compose を使って導入する
~~~~~~~~
1)LocalStack
2)Glue v4 on Local
~~~~~~~~

1)LocalStack

* Glue から S3 API を呼ぶことを想定して導入

https://localstack.cloud/
Github
https://github.com/localstack/localstack

2)Glue v4 on Local

前述「1)LocalStack」の有償版であれば、
Glueがサポート内であるのだが、貧乏人なので、、、

Github
https://github.com/awslabs/aws-glue-libs
Docker hub
https://hub.docker.com/r/amazon/aws-glue-libs/tags

【2】前提条件

* 以下が必要。
~~~~~~
1)Docker/Docker compose (compose v2)
2)AWS CLI (awscli-local)
~~~~~~

1)Docker/Docker compose

* Docker/Docker compose を使える環境
 => 今回は、Docker compose v2を想定(v1はサポートが切れるし)
 => 用意する場合は、以下の関連記事を参照のこと

WSL ~ Docker-CE + Genie / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2021/11/03/003836

2)その他開発環境

Docker composeで「LocalStack/Glue Scala」を構築する際には
関係ないかもしれないが、目的としてそこで開発するので
それ以外の開発に必要なツールを紹介。

[1] AWS CLI (awscli-local)

* 作成した疑似AWS環境(LocalStack)に対して操作するAWS CLI が必要
 => 今回は、以前扱ったawscli-localを使う

https://dk521123.hatenablog.com/entry/2020/12/16/211127

[2] JDK/SBT

* Glue / Scala で開発するので、JDK/SBT
 => 構築については、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2023/03/10/193805

[3] その他

* VS Code とかも入れることを考えたが、
 以下の関連記事の「【4】WSLで作成したファイルの場所」で
 書いた通り、「\\wsl$」で見れるので、とりあえず保留。

https://dk521123.hatenablog.com/entry/2023/01/29/000000

【3】構築手順

1)設定ファイル作成

[1] Docker compose「compose.yaml

services:
  # [1] For LocalStack
  localstack:
    container_name: localstack
    image: localstack/localstack:latest
    ports:
      # LocalStack Gateway
      - 4566:4566
    volumes:
      - ./docker/localstack:/docker-entrypoint-initaws.d
      -  /var/run/docker.sock:/var/run/docker.sock
      - 'localstack-data:/tmp/localstack'
    networks:
      - glue.local.network
    environment:
      # Add the AWS service, If you want
      - SERVICES=kms,sns,ses,s3,lamdba,secretsmanager
      - AWS_ACCESS_KEY_ID=dummy
      - AWS_SECRET_ACCESS_KEY=dummy
      - AWS_DEFAULT_REGION=us-west-1
      - DATA_DIR=/tmp/localstack/data
      # Add the hostname for SQS, If you want
      # See https://qiita.com/imunew/items/b74cecb7e12a9b9c4441
      - HOSTNAME_EXTERNAL=localstack
  # [2] For Glue local
  glue.local:
    container_name: glue.local
    image: amazon/aws-glue-libs:glue_libs_4.0.0_image_01
    volumes:
      - ./:/home/glue_user/workspace/jupyter_workspace
      - ./glue-local-spark.conf:/home/glue_user/spark/conf/spark-defaults.conf
    environment:
      - DISABLE_SSL=true
      - AWS_ACCESS_KEY_ID=dummy
      - AWS_SECRET_ACCESS_KEY=dummy
      - AWS_DEFAULT_REGION=us-west-1
    ports:
      # Port of jupyterlab
      - 18888:8888
      # Port of Spark UI
      - 14040:4040
    networks:
      - glue.local.network
    command: /home/glue_user/jupyter/jupyter_start.sh
volumes:
  localstack-data:
networks:
  glue.local.network:
    name: glue.local.network

[2] Sparkの設定ファイル「glue-local-spark.conf」

spark.driver.extraClassPath /home/glue_user/spark/jars/*:/home/glue_user/aws-glue-libs/jars/*
spark.executor.extraClassPath   /home/glue_user/spark/jars/*:/home/glue_user/aws-glue-libs/jars/*
spark.sql.catalogImplementation hive
spark.eventLog.enabled  true
spark.history.fs.logDirectory   file:////tmp/spark-events
spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version    2
spark.hadoop.mapreduce.fileoutputcommitter.marksuccessfuljobs   false
spark.unsafe.sorter.spill.read.ahead.enabled    false
spark.network.crypto.enabled    true
spark.network.crypto.keyLength  256
spark.network.crypto.keyFactoryAlgorithm    PBKDF2WithHmacSHA256
spark.network.crypto.saslFallback   false
spark.authenticate  true
spark.io.encryption.enabled false
spark.io.encryption.keySizeBits 256
spark.io.encryption.keygen.algorithm    HmacSHA256
spark.authenticate.secret       62e100c5-5281-4030-992b-1f60391ed508

2)コンテナ起動

# ファイルの確認
ls
~~~~
compose.yaml  glue-local-spark.conf
~~~~

# コンテナ起動
sudo docker compose up -d

3)動作確認

[1] LocalStackの確認 (S3)

# To create S3 bucket
#  Only use AWS CLI, add --endpoint-url http://localhost:4566
# aws s3 mb s3://local-demo-bucket --endpoint-url http://localhost:4566
awslocal s3 mb s3://local-demo-bucket

# To check the S3 bucket
# aws s3 ls --endpoint-url http://localhost:4566
awslocal s3 ls

# Upload files
mkdir demo
echo "Hello world!" > ./demo/hello.txt
echo "Hi, world!" > ./demo/hi.txt
# aws s3 cp ./demo s3://local-demo-bucket/sample --recursive --endpoint-url http://localhost:4566
awslocal s3 cp ./demo s3://local-demo-bucket/sample --recursive

# To check uploaded files
# aws s3 ls s3://local-demo-bucket/sample/ --endpoint-url http://localhost:4566
awslocal s3 ls s3://local-demo-bucket/sample/
2023-03-21 23:03:15         13 hello.txt
2023-03-21 23:03:15         11 hi.txt

[2] LocalStackの確認 (Secrets manager)

# Create Secret
$ aws --endpoint-url=http://localhost:4566 secretsmanager create-secret \
 --name "app/local/DemoSecrets" \
 --secret-string '{"CLIENT_SECRET_VALUE1":"Hello", "CLIENT_SECRET_VALUE2":"World" }'

# Get Secret
$ aws --endpoint-url=http://localhost:4566 secretsmanager get-secret-value \
    --secret-id app/local/DemoSecrets

{
    "ARN": "arn:aws:secretsmanager:us-west-1:000000000000:secret:app/local/DemoSecrets-TNEKYE",
    "Name": "app/local/DemoSecrets",
    "VersionId": "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx",
    "SecretString": "{\"CLIENT_SECRET_VALUE1\":\"Hello\", \"CLIENT_SECRET_VALUE2\":\"World\" }",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2023-04-02T23:44:48.267328+09:00"
}

4)コンテナ停止

環境が不要になったら、以下を実行

docker compose down --volumes

【5】トラブル

1)エラー「Cannot connect to the Docker daemon」が表示

「docker compose up -d」実行後に、以下のエラー内容が発生した。

エラー内容

Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
Is the docker daemon running?

原因

Dockerデーモンが動いていないため。

対応案

# restart docker
sudo service docker stop
sudo service docker start

参考文献

https://future-architect.github.io/articles/20220428a/

関連記事

Docker ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2020/04/24/160044
Docker compose ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2022/04/28/000000
Docker compose ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/05/21/222910
Docker compose ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/04/11/000000
Docker compose ~ docker-compose.yml ~
https://dk521123.hatenablog.com/entry/2020/12/18/152949
Docker compose ~ Version 2 ~
https://dk521123.hatenablog.com/entry/2023/01/02/000000
WSL ~ Docker-CE + Genie / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2021/11/03/003836
WSL2 ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/01/29/000000
AWS Glue ~ ローカル環境を作成する ~
https://dk521123.hatenablog.com/entry/2022/01/31/165650
AWS Glue ~ ローカル環境を作成する / Glue v3.0版 ~
https://dk521123.hatenablog.com/entry/2022/01/31/165650
LocalStack ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/14/010524
LocalStack ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2019/12/16/231149
LocalStack ~ awscli-local ~
https://dk521123.hatenablog.com/entry/2020/12/16/211127
Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Spark/Scalaの開発環境構築 ~ Windows編 ~
https://dk521123.hatenablog.com/entry/2023/03/20/115450
AWS Glue ~ Scalaでの実装 ~
https://dk521123.hatenablog.com/entry/2023/03/17/000000
ScalaAWS SDK / S3サンプル ~
https://dk521123.hatenablog.com/entry/2023/04/01/002005
ScalaAWS SDK / Secrets Managerサンプル ~
https://dk521123.hatenablog.com/entry/2023/04/03/012600
Visual Studio Code ~ WSLプラグイン
https://dk521123.hatenablog.com/entry/2023/04/02/172851

【Scala】Scala ~ AWS SDK ~

■ はじめに

AWS Glue で Scala を使うことになって悪戦苦闘中なのだが
Scalaの実装のしにくさとして、
Pythonのように便利な boto3 がある訳ではないので調べてみた。

とりあえず、以下のサービスを利用したい。
~~~~~
 + S3
 + Secrets Manager
 + SES
~~~~~

目次

【1】AWS SDK
 1)サンプル集
 補足:その他のライブラリ
【2】設定方法
 1)個別に入れたい場合
【3】AWS SDK for Java 2.x
 1)S3
 2)Secrets Manager

【1】AWS SDK

 結局は、Scalaの場合、色々あるが
「AWS SDK for Java」がよさそう

https://aws.amazon.com/jp/sdk-for-java/

1)サンプル集

* Java ではあるが、以下のGithubに豊富にサンプルがある

https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/java/example_code
[1] S3
https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3ObjectOperations.java
[2] Secrets Manager
https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java_secrets-manager_code_examples.html
https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/java/example_code/secretsmanager/src/main/java/aws/example/secretsmanager/GetSecretValue.java

補足:その他のライブラリ

* 以下のサイトで取り上げている

https://qiita.com/neilli-sable/items/3696c4c5f4cd3a4a23e6
https://www.utakata.work/entry/scala/aws-library-2021

【2】設定方法

* sbt の場合、公式ドキュメントを参考に
 libraryDependenciesに以下を追加

SDK v2
https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-project-maven.html

  // From 'Build the entire SDK into your project'
  "software.amazon.awssdk" % "aws-sdk-java" % "2.20.20",

1)個別に入れたい場合

* 以下の公式ドキュメントの「Specifying individual SDK modules」に記載

https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-project-maven.html

libraryDependencies ++= Seq(
  // ...
  "software.amazon.awssdk" % "s3" % "2.20.30",
  "software.amazon.awssdk" % "secretsmanager" % "2.20.30",
  "software.amazon.awssdk" % "ses" % "2.20.30"
)

S3
https://mvnrepository.com/artifact/software.amazon.awssdk/s3
Secrets Manager
https://mvnrepository.com/artifact/software.amazon.awssdk/secretsmanager
SES
https://mvnrepository.com/artifact/software.amazon.awssdk/ses

【3】AWS SDK for Java 2.x

* ネットの情報だと v1 と混合しているので整理

https://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/home.html

API仕様
https://sdk.amazonaws.com/java/api/latest/index.html

* 以下で、主なAPIを整理

1)S3

[1] ListObjectsV2Request

* ファイル情報をリストとして取得する
 => 注意点としては、ファイル数が多い場合は取り切れないので
  nextContinuationTokenで判断するところ

https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html#listObjectsV2(software.amazon.awssdk.services.s3.model.ListObjectsV2Request)

[2] getObjectAsBytes

* ネットだと「GetObject」があるのが、
 個人的には、S3にあるファイルの中身をみたいので
 getObjectAsBytes の方が使いやすい

https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html#getObjectAsBytes(software.amazon.awssdk.services.s3.model.GetObjectRequest)
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example_s3_GetObject_section.html

2)Secrets Manager

https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java_secrets-manager_code_examples.html

* withVersionStage については、以下の公式ドキュメント参照

https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/retrieving-secrets_cache-java-ref_SecretCacheConfiguration.html
https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/getting-started.html#term_version

[1] getSecretValue

* Secrets Manager で管理している値を取得する

https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/secretsmanager/SecretsManagerClient.html#getSecretValue(software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest)

参考文献

https://www.office-matsunaga.biz/dev/description.php?id=15
https://jyuch.hatenablog.com/entry/2018/02/15/230828
https://yu-memorandum.hatenablog.com/entry/2020/08/19/195117

関連記事

ScalaAWS SDK / S3サンプル ~
https://dk521123.hatenablog.com/entry/2023/04/01/002005
ScalaAWS SDK / Secrets Managerサンプル ~
https://dk521123.hatenablog.com/entry/2023/04/03/012600
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
ScalaYAML
https://dk521123.hatenablog.com/entry/2023/03/16/012034
ScalaAWS SDK / S3サンプル ~
https://dk521123.hatenablog.com/entry/2023/04/01/002005
ScalaAWS SDK / Secrets Managerサンプル ~
https://dk521123.hatenablog.com/entry/2023/04/03/012600
ScalaAWS SDK / SESサンプル ~
https://dk521123.hatenablog.com/entry/2023/04/16/003338
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