在 Gradle 中获取 AWS 角色凭证
Getting AWS role credentials in Gradle
我有一个 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 没有扮演正确的角色
如果有人遇到这个问题。我在从 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 配置文件时,您必须按照 docs 中的描述设置 AWS_PROFILE
环境变量才能使其正常工作,因为 gradle(或 aws- sdk) 要么使用环境变量 AWS_ACCESS_KEY_ID
和 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'
我有一个 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 没有扮演正确的角色
如果有人遇到这个问题。我在从 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 配置文件时,您必须按照 docs 中的描述设置 AWS_PROFILE
环境变量才能使其正常工作,因为 gradle(或 aws- sdk) 要么使用环境变量 AWS_ACCESS_KEY_ID
和 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'