事前に
① s3 にバケット((例:hogehoge-bucket)を作成しておく
② IAMで、作成したパケットに対するポリシーを作成しておく
③ IAMで、ポリシー(②)を割り当ててたユーザーを作成しておく
④ ③のユーザーの「アクセスキー」と「シークレットキー」を控えておく
※ s3用IAMポリシーの例
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:GetAccelerateConfiguration",
"s3:DeleteObject",
"s3:GetBucketNotification",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::hogehoge-bucket/*",
"arn:aws:s3:::hogehoge-bucket"
]
}
]
}
build.sbt
libraryDependencies に追加
"com.amazonaws" % "aws-java-sdk" % "1.0.12",
"com.amazonaws" % "aws-java-sdk-s3" % "1.11.497",
importファイル
今回、Deleteは使用しません。
import com.amazonaws.ClientConfiguration
import com.amazonaws.Protocol
import com.amazonaws.auth.AWSCredentials
import com.amazonaws.auth.AWSStaticCredentialsProvider
import com.amazonaws.auth.BasicAWSCredentials
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration
import com.amazonaws.services.s3.AmazonS3
import com.amazonaws.services.s3.AmazonS3ClientBuilder
import com.amazonaws.services.s3.model.DeleteObjectsRequest
import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion
import com.amazonaws.services.s3.model.DeleteObjectsResult
import com.amazonaws.services.s3.model.ObjectMetadata
import com.amazonaws.services.s3.model.S3Object
import com.amazonaws.services.s3.model.S3ObjectInputStream
import com.amazonaws.services.s3.model.PutObjectRequest
import java.io.File
import java.io.IOException
import java.io.FileInputStream
awsS3 (メソッド getClient/putObjectsを定義)
object awsS3{
def getClient(bucketName:String):Option[AmazonS3]={
//s3エンドポイント
val S3_SERVICE_END_POINT:String = "https://s3-ap-northeast-1.amazonaws.com" //東京リージョンの場合
//リージョン
val S3_REGION:String = "ap-northeast-1"; //東京リーションの場合
//アクセスキー
val S3_ACCESS_KEY:String = "******************" // ④で控えたアクセスキー
//シークレットキー
val S3_SECRET_KEY:String = "****************************************" // ④で控えたシークレットキー
// AWSの認証情報
val credentials:AWSCredentials = new BasicAWSCredentials(S3_ACCESS_KEY, S3_SECRET_KEY)
// クライアントconfigを初期化
val clientConfig:ClientConfiguration = new ClientConfiguration()
clientConfig.setProtocol(Protocol.HTTPS) // プロトコル
clientConfig.setConnectionTimeout(10000) // 接続タイムアウト(ms)
// エンドポイント設定
val endpointConfiguration:EndpointConfiguration = new EndpointConfiguration(S3_SERVICE_END_POINT, S3_REGION)
// クライアント生成
val client:AmazonS3 = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withClientConfiguration(clientConfig)
.withEndpointConfiguration(endpointConfiguration).build()
if(!client.doesBucketExist(bucketName)) {
None
}else{
Some(client)
}
}
def putObjects(bucketName:String ,fileName:String,objectKey:String) {
awsS3.getClient(bucketName) match{
case Some(s3client)=>{
// アップロード
val file:File = new File(fileName);
val fis:FileInputStream = new FileInputStream(file)
//メタデータを初期化
val metadata:ObjectMetadata = new ObjectMetadata()
//Fileサイズを取得
val objectSize=file.length()
//メタデータにFileサイズをセット
metadata.setContentLength(objectSize);
//s3にアップロード
try{
s3client.putObject(bucketName, objectKey, fis, metadata)
println("s3に送信できました。")
}catch{
case e:Exception =>{
println("s3送信時に失敗しました。")
}
}
}
case None => {
println("バケットが見つかりませんでした")
}
}
}
}
Main
バケット名とアップロードしたいファイルのファイル名とオブジェクトキーを指定して awsS3.putObjects を実行します。
object Application extends App {
//アップロード先のs3バケット名
val S3_BUCKET_NAME="hogehoge-bucket"
//ファイル名
val fileName="hoge.txt"
//オブジェクトキー
val objectKey="hoge.txt"
//アップロードを実行
awsS3.putObjects(S3_BUCKET_NAME,fileName,objectKey)
}
以上