[SpringBoot] エクスポートしたjarファイルをEC2で実行する〜RedshiftでCOPYコマンドを使いS3からLoadする〜

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

前回は定時実行でS3にアクセスするプロジェクトを作りましたが今回はRedshiftにCOPYコマンドを送るプロジェクトを作ります。

環境

STS Version: 3.8.0

作業

  • S3にGZIP形式のTSVファイルがある
  • SpringBootでエクスポートしたファイルをEC2にアップロードして実行 アップロードの手順はこちら
  • 定時実行されて、RedshiftでCOPYコマンドを実行してS3のファイルをLoadする

コード

@Service
public class ScheduledService {

	@Autowired
	Copy copy;

	// 1日1回 0時に実行
	@Scheduled(cron = "0 0 * * * *", zone = "Asia/Tokyo")
	public void fixedRate() {
		copy.copyFromS3ToRedshift();
	}
}
@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みたいなやつです)

  compile fileTree(dir: 'libs', include: '*.jar')

build.gradleのdependencesに上記記述をして、プロジェクトルートのlibsにJDBCドライバを配置します。

プロジェクト名
    ├ src/
    ├ libs/ ←ここ
    ├ build/
    └ build.gradle

JDBCドライバの取得は
スクリーンショット 2016-08-22 1.17.21 マネジメントコンソールの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コマンドを実行することができます。

最後に

他にもハマりどころがありましたので、少し頭の中で整理できたら追記します。