この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
前回は定時実行でS3にアクセスするプロジェクトを作りましたが今回はRedshiftにCOPYコマンドを送るプロジェクトを作ります。
環境
STS Version: 3.8.0
作業
- S3にGZIP形式のTSVファイルがある
- SpringBootでエクスポートしたファイルをEC2にアップロードして実行 アップロードの手順はこちら
- 定時実行されて、RedshiftでCOPYコマンドを実行してS3のファイルをLoadする
コード
ScheduledService.java
@Service
public class ScheduledService {
@Autowired
Copy copy;
// 1日1回 0時に実行
@Scheduled(cron = "0 0 * * * *", zone = "Asia/Tokyo")
public void fixedRate() {
copy.copyFromS3ToRedshift();
}
}
Copy.java
@Component
public class Copy {
@Autowired
Settings settings;
public void copyFromS3ToRedshift() {
EnvironmentVariableCredentialsProvider credentials = new EnvironmentVariableCredentialsProvider();
String sql = "copy TABLE_NAME from '"
+ "s3://BUCKET_NAME/FILE_NAME.tsv.gz"
+ "' CREDENTIALS 'aws_access_key_id="
+ credentials.getCredentials().getAWSAccessKeyId()
+ ";aws_secret_access_key="
+ credentials.getCredentials().getAWSSecretKey()
+ "'GZIP DELIMITER '\t' REMOVEQUOTES;";
Properties properties = new Properties();
properties.setProperty("user", "DB_USER_NAME");
properties.setProperty("password","DB_PASSWORD");
try (Connection connection = DriverManager.getConnection("RED_SHIFT_DB_URL",properties)) {
Statement statement = connection.createStatement();
statement.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
9,14,16行目で予め環境変数に設定したcredentialsを取得しています。
23行目のRED_SHIFT_DB_URLは
マネジメントコンソール → Redshift → Clustersで任意のClusterを選択したら表示されるJDBC URLをコピペします。 (jdbc:redshift:xxxxxxxxxxxxxxxxx:5439/db_nameみたいなやつです)
build.gradle
compile fileTree(dir: 'libs', include: '*.jar')
build.gradleのdependencesに上記記述をして、プロジェクトルートのlibsにJDBCドライバを配置します。
プロジェクト名
├ src/
├ libs/ ←ここ
├ build/
└ build.gradle
JDBCドライバの取得は
マネジメントコンソールのRedshiftの左ペインのConnect Clientの 2. Download Amazon Redshift drivers → JDBC Driverからダウンロードできます。
3.Get cluster connection URL ここからでも上記のJDBC URLを確認することができます。
この後にはまったのですが、これだけではまだEC2上でjarファイルを起動してもRedshiftにアクセスできません。
EC2からRedshiftにアクセスするために該当のClusterを選択しVPC Security GroupsでEC2からのインバウンドを許可しないといけないので
EC2のIPアドレスを指定します。
これでEC2からRedshiftへCOPYコマンドを実行することができます。
最後に
他にもハマりどころがありましたので、少し頭の中で整理できたら追記します。