CodeBuildでJavaのコードをビルドする際、S3をmavenリポジトリとして使用することにしました。
その際設定でけっこう詰まったので記事にしてみました。
credentialsで設定する
gradleのドキュメントには次のように書かれています。
build.gradle
repositories {
maven {
url "s3://myCompanyBucket/maven2"
credentials(AwsCredentials) {
accessKey "someKey"
secretKey "someSecret"
// optional
sessionToken "someSTSToken"
}
}
}
今回はCodeBuildにassumeされたIAM RoleからaccessKey, secretKey, sessionTokenを取得するので、次のようなコードになります。
build.gradle
import com.amazonaws.auth.AWSCredentialsProviderChain
import com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper
import com.amazonaws.auth.AWSSessionCredentials
...
repositories {
maven {
url "s3://sample-maven-repository/repository"
credentials(AwsCredentials) {
def credentials = new AWSCredentialsProviderChain(
new EC2ContainerCredentialsProviderWrapper()
).getCredentials()
accessKey credentials.getAWSAccessKeyId()
secretKey credentials.getAWSSecretKey()
if (credentials instanceof AWSSessionCredentials) {
sessionToken credentials.sessionToken
}
}
}
}
authenticationで指定するとエラーになる
一方、gradleのドキュメントには下記のような指定方法も記載してあります。
build.gradle
repositories {
maven {
url "s3://myCompanyBucket/maven2"
authentication {
awsIm(AwsImAuthentication) // load from EC2 role or env var
}
}
}
しかし、上記だとビルドはエラーとなります。
エラーログを見た所、InstanceProfileCredentialsProvider
がhttp://169.254.169.254/latest/meta-data/iam/security-credentials/
にアクセスしており、そこでエラーが発生し、全体の処理が終了しているようです。