LoginSignup
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-02-17

事前に

① 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)

}

以上

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3