在Gradle

时间:2017-01-22 14:37:52

标签: gradle amazon-s3 amazon-ec2 aws-sdk amazon-iam

我有一个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使用DefaultAWSCredentialsProviderChain,则构建运行正常。但是,使用DefaultAWSCredentialsProviderChain并再次部署实例会导致相同的异常。

非常感谢任何帮助。

更新

使用AWS CLI完成测试并使用STSAssumeRoleSessionCredentialsProvider显示构建脚本正在使用DefaultAWSCredentialsProviderChain提供程序的正确角色。向角色添加AmazonS3FullAccess策略不会更改结果

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

UPDATE2:

我尝试捕获网络流量以查看哪些凭据发送到AWS,看起来Gradle和AWS CLI发送了不同的凭据,因此我回到了我最初的假设,即Gradle没有拉正确的角色

2 个答案:

答案 0 :(得分: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'
}

答案 1 :(得分:0)

使用aws配置文件时,必须按照docs中的说明设置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'