本題の通り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を継承しているので、こうやって指定することができます。
まとめ
なんか単純なことですが、思考を柔軟にしないとだめですね。。