2017-01-22 116 views
2

我有一个S3存储库,我想在我的构建过程中访问该存储库。它包含我的项目的一些依赖项。我的项目被部署到具有指定角色的EC2实例 - Repo_dependent。作用有一个Access_Repo政策连接到它:在Gradle中获取AWS角色凭证

{ 
"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政策的作用并没有改变结果

我使用詹金斯部署代码,所以我的下引线的是,或许真的是有错的

UPDATE2:

我试图捕捉网络流量来查看哪些凭据发送到AWS,并且似乎不同的凭证由Gradle和AWS CLI发送,因此我回到了我原来的假设,即Gradle不能发挥正确的作用

+0

通过观察URL,我觉得你是在弗吉尼亚州北部地区建立桶。您可以在构建脚本部分评论凭据定义。从我的角度来说,它搜索EC2实例(本地驱动器)内的访问密钥和密钥,而不是IAM角色。 –

+0

不知道我明白..如果我删除凭证部分一切都会工作? –

+0

它应该工作。代码显示它在本地搜索aws凭证.. –

回答

1

如果有人遇到这个问题。我从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' 
} 
+0

很好找。以下是gradle文档中的['AwsImAuthentication'选项]示例(https://docs.gradle.org/current/userguide/dependency_management.html#mavenIvyS3RepositoriesAuthWithIam)。 –

+0

你应该标记你的答案,我一直在努力寻找这个。谢谢btw –