【问题标题】:Getting AWS role credentials in Gradle在 Gradle 中获取 AWS 角色凭证
【发布时间】:2017-06-07 03:03:33
【问题描述】:

我有一个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 来部署代码,所以我的下一个线索是那里可能有问题

更新2:

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

【问题讨论】:

  • 通过查看 URL,我认为您是在北弗吉尼亚地区创建的存储桶。您可以在构建脚本部分评论凭证定义。从我的角度来看,它在 EC2 实例(本地驱动器)而不是 IAM 角色中搜索访问密钥和秘密密钥。
  • 不确定我是否理解.. 如果我删除凭据部分,一切都会正常吗?
  • 它应该可以工作。代码显示它在本地搜索 aws 凭据..
  • 对不起,它不起作用。我必须通过一些凭据
  • 但通常我们不应该在项目中拥有 AWS 凭证。对于 AWS 凭证,我们必须使用具有特定权限的 IAM 角色。

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


【解决方案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'
}

【讨论】:

  • 不错的发现。这是AwsImAuthentication option in the gradle docs 的示例。
  • 你应该标记你的答案,我一直在努力寻找这个。谢谢顺便说一句
  • 不错的解决方案。谢谢。它解决了我的问题
【解决方案2】:

当您使用 aws 配置文件时,您必须按照 docs 中的说明设置 AWS_PROFILE 环境变量以使其正常工作,因为 gradle(或 aws-sdk)正在使用环境变量 @987654323 @ 和 AWS_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'

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多