在Gradle中获取AWS角色证书



我有一个S3存储库,我想在构建过程中访问它。它包含了我项目的一些依赖项。我的项目被部署到具有指定角色Repo_dependent的EC2实例中。该角色附加了一个Access_Repo策略:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1484560548000",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::my_bucket",
"arn:aws:s3:::my_bucket/*"
]
}
]
}

当我部署新服务器时,我会得到一个The AWS Access Key Id you provided does not exist in our records. (Service: Amazon S3; Status Code: 403; Error Code: InvalidAccessKeyId; Request ID: 02169BFDCF7AFE10)异常。

我的构建脚本是这个(为了简单起见,缩写)

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.amazonaws:aws-java-sdk:1.11.83'
}
}
import com.amazonaws.auth.*
repositories {
jcenter()
maven {
url "s3://my_bucket.s3.amazonaws.com"
credentials(AwsCredentials) {
def providercreds = new InstanceProfileCredentialsProvider().getCredentials()
accessKey providercreds.getAWSAccessKeyId()
secretKey providercreds.getAWSSecretKey()
}
}
}

我的假设是,我在EC2实例访问其角色的方式或定义角色的方式上遗漏了一些东西。当尝试在本地运行相同的脚本时,如果用户附加了Access_Repo策略,而不是使用InstanceProfileCredentialsProvider使用DefaultAWSCredentialsProviderChain,则构建运行良好。但是,使用DefaultAWSCredentialsProviderChain并再次部署实例会导致相同的异常。

如有任何帮助,我们将不胜感激。

更新:

使用AWS CLI和STSAssumeRoleSessionCredentialsProvider进行的测试表明,构建脚本使用DefaultAWSCredentialsProviderChain提供程序的正确角色。将AmazonS3FullAccess策略添加到角色不会更改结果

我正在使用Jenkins来部署代码,所以我的下一个线索是可能出了问题

更新2:

我试图捕获网络流量,看看哪些凭据被发送到AWS,Gradle和AWS CLI似乎发送了不同的凭据,所以我回到了我最初的假设,即Gradle没有扮演正确的角色

如果有人遇到这个问题。我在从Gradle 3.0迁移到3.3之后修复了它。这允许我使用以下代码:

buildscript {
repositories {
jcenter()
}
dependencies {
}
}

repositories {
jcenter()
maven {
url "s3://my_bucket.s3.amazonaws.com"
authentication {
awsIm(AwsImAuthentication)
}
}
}
task wrapper(type: Wrapper) {
gradleVersion = '3.3'
}
dependencies {
compile 'com.amazonaws:aws-java-sdk-iam:1.11.78'
compile 'com.amazonaws:aws-java-sdk-ec2:1.11.78'
}

当您使用aws配置文件时,您必须按照文档中的描述设置AWS_PROFILE环境变量才能使其工作,因为gradle(或aws-sdk)使用环境变量AWS_ACCESS_KEY_IDAWS_SECREST_ACCESS_KEY,或者如果设置,则使用位于~/.aws/的默认配置文件

export AWS_PROFILE=project-x
./gradlew build

或内联

AWS_PROFILE=project-x ./gradlew build

或者作为~/.bashrc或类似文件中的别名,在那里您还可以添加一些基于配置文件的逻辑

alias gw='AWS_PROFILE=project-x ./gradlew'

相关内容

  • 没有找到相关文章

最新更新