[SpringBoot] エクスポートしたjarファイルをEC2で実行する 〜非公開のS3にアクセス〜

2016.08.19

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

はじめに

前回はS3のバケットが公開されている状態でS3のオブジェクトを取得しましたが
扱うファイルが公開されているとは限らないので、S3のファイルは認証済みユーザーのみに公開されている想定でやってみます。
EC2にエクスポートしたjarファイルがアップロードされている前提なので、アップロードする手順については前回の記事をご覧ください。

環境

Spring Tool Suite 3.8.0

コード

コードは前回と同じものを使用します。詳細については前回の記事を参照していただければと思います。

BlogProjectApplication.java

@SpringBootApplication
@EnableScheduling
public class BlogProjectApplication {

	public static void main(String[] args) {
		SpringApplication.run(BlogProjectApplication.class, args);
	}
}

ScheduledService.java

@Service
public class ScheduledService {

	@Autowired
	GetS3Object getS3Object;
	
	@Scheduled(cron = "0 * * * * *", zone = "Asia/Tokyo")
	public void fixedRate(){
		getS3Object.showS3Object();
	}
}

GetS3Object.java

@Component
public class GetS3Object {

	public void showS3Object(){
		
		AmazonS3 amazonS3 = new AmazonS3Client();
		S3Object s3Object = amazonS3.getObject("BUCKET_NAME", "FILENAME");
		
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s3Object.getObjectContent()));
		StringBuilder stringBuilder = new StringBuilder();
		String line;
		try {
			while ((line = bufferedReader.readLine()) != null) {
			    stringBuilder.append(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println(stringBuilder.toString());
	}
}

build.gradle

buildscript {
	ext {
		springBootVersion = '1.4.0.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'spring-boot'

jar {
	baseName = 'BlogProject'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
	mavenCentral()
}


dependencies {
	compile 'com.amazonaws:aws-java-sdk:+'
	compile('org.springframework.boot:spring-boot-starter')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}


eclipse {
	classpath {
		 containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
		 containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
	}
}

作業内容

  • S3のバケットのアクセス許可を認証済みユーザーとしている

  • IAMでS3にアクセスできるユーザーを作成する

  • credentialsは環境変数に設定する

実践

S3のファイルのアクセス許可の確認方法は

スクリーンショット 2016-08-19 15.27.38

マネジメントコンソールのバケットorファイルを指定してプロパティ→アクセス許可で指定できます。

次にIAMでS3にアクセスできるユーザーを作成します。   マネジメントコンソールでIAMを選択し  

ユーザー → 新規ユーザーの作成 → ユーザー名を入力後作成ボタン押下 → 認証情報のダウンロード

これでユーザーが作成できましたので、このユーザーにポリシーをアタッチします。(今回はFullAccessとしました)   認証情報(credentials)を発行したら環境変数に設定します

$ export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx

環境変数にセットされているかどうかは

$ env

で確認できます。

環境変数にセットされていれば

GetS3Object.java

AmazonS3 amazonS3 = new AmazonS3Client();

上記コードGetS3Object.javaの6行目で環境変数からcredentialsを取得しているのでS3にアクセスすることができます。 (EC2上で実行するのでInstanceProfileCredentialsProviderを使えばいいのかもしれませんが、手元のマシンでも都度確認したいので環境変数としています。)
なぜこれでcredentialsを取得できているんだ!!と思われた方は以下のサイトを参考にしてもらえれば詳細な説明があります。

IAMによるAWS権限管理運用ベストプラクティス (2)

java -jar BlogProject.jar

とコマンドを打てばEC2上で実行したプロジェクトでアクセス制限されているS3のリソースにアクセスすることができます。

最後に

次はRedshiftにCOPYコマンドを送ってS3のファイルをLoadしてみようと思います。