Screaming Loud

研究・プログラミングなど気づいたことをメモをしています。読書記録はこちらに記載しています。https://bookmeter.com/users/75944

AWScalaでIamRoleのクレデンシャルでクライアントに繋ぎたかった

本題の通りAWScalaを使っていて、IAMRoleを適用したかったんですが、InstanceProfileCredentialsProviderを埋めたS3Clientが作れず、困っていました。

やりたかったこと

local環境ではcredentialKeyを使い、prd環境ではIAMroleを使う ただし、複数のアカウントのS3を見ているため、一部credentialKeyを利用する必要がある。

問題点

単純に空でS3インスタンスを作成すれば、DefaultAwsCredentialsProviderChainから作成できる(以下参照)んですが、 Default empty constructor for AmazonS3Client (and others) · Issue #11 · seratch/AWScala · GitHub
lastUsedのクレデンシャルを使うので、IAMroleとクレデンシャルファイルを混ぜて使うことが出来ない。

対応

以下のように単純に親のSDKを型として指定してあげれば、うまくいきました。

  val credentailName = "hoge"
  protected implicit lazy val s3: AmazonS3 = {
    if (env == "local") {
      val credential = new ProfileCredentialsProvider(credentialName).getCredentials
      // AWScalaでクライアント作成
      S3(credential.getAWSAccessKeyId, credential.getAWSSecretKey)(Region.AP_NORTHEAST_1)
    } else {
      val credential: AWSCredentialsProvider = new InstanceProfileCredentialsProvider()
      val clientConfiguration = new ClientConfiguration
      clientConfiguration.setConnectionTimeout(30000)
      // AWSSDKの生のclientを作成
      new AmazonS3Client(credential, clientConfiguration)
    }
  }

AWScalaのS3はAWSSDKのAmazonS3を継承しているので、こうやって指定することができます。

まとめ

なんか単純なことですが、思考を柔軟にしないとだめですね。。

参考