我有一个S3
要在构建过程中访问的存储库。它包含我项目的某些依赖项。我的项目已部署到具有指定角色-的EC2实例Repo_dependent
。该角色具有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
use 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' }