Scala：aws-java-sdkを使用してs3にファイルをアップロードする

# 事前に

①　s3 にバケット（（例：hogehoge-bucket）を作成しておく
②　IAMで、作成したパケットに対するポリシーを作成しておく
③　IAMで、ポリシー（②）を割り当ててたユーザーを作成しておく
④　③のユーザーの「アクセスキー」と「シークレットキー」を控えておく

## ※ s3用IAMポリシーの例
```json
 {
    "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 に追加

```scala
  "com.amazonaws" % "aws-java-sdk" % "1.0.12",
  "com.amazonaws" % "aws-java-sdk-s3" % "1.11.497",
```

# importファイル
今回、Deleteは使用しません。

```scala
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を定義)

```scala
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 を実行します。

```scala
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)

}
```

以上