我试图在 CI/CD 管道中承担 AWS 角色,因此我必须编写一个脚本来通过脚本更改角色。下面是执行此操作的脚本,我用来source <script>.sh
替换现有的 AWS 访问和密钥,并添加会话密钥。
我通过在终端中回显 3 个环境变量来检查它们是否存在。
#!/bin/bash
output="/tmp/assume-role-output.json"
aws sts assume-role --role-arn "arn:aws:iam::<account-id>:role/<rolename>" --role-session-name AWSCLI-Session > $output
AccessKeyId=$(cat $output | jq '.Credentials''.AccessKeyId')
SecretAccessKey=$(cat $output | jq '.Credentials''.SecretAccessKey')
SessionToken=$(cat $output | jq '.Credentials''.SessionToken')
export AWS_ACCESS_KEY_ID=$AccessKeyId
export AWS_SECRET_ACCESS_KEY=$SecretAccessKey
export AWS_SESSION_TOKEN=$SessionToken
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行简单的 aws 命令来列出 ECR 映像时aws ecr list-images --registry-id <id> --repository-name <name>
,它给出了以下错误消息。
An error occurred (UnrecognizedClientException) when calling the ListImages operation:
The security token included in the request is invalid.
Run Code Online (Sandbox Code Playgroud)
我尝试在终端中手动设置 AWS 密钥和令牌,令人惊讶的是 ecr …
我想将 AWS Assume Roles 与 Terraform Cloud / Enterprise 一起使用
在 Terraform 开源中,您通常只需执行假设角色,利用 CLI 上的 .aws/Credential Profile(这是初始身份验证)并执行假设角色:
provider "aws" {
assume_role {
role_arn = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
session_name = "SESSION_NAME"
external_id = "EXTERNAL_ID"
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,使用 Terraform Enterprise 或 Cloud,您无法引用配置文件,因为不可变基础架构的目录中不会包含该文件。
Terraform Cloud/Enterprise 需要将访问密钥 ID 和秘密访问密钥设置为变量,以便其基础设施可以通过其管道执行 Terraform RUN,并对您想要在其中配置的任何 AWS 账户进行身份验证。
所以问题是:如何利用 AWS 账户的访问密钥 ID 和秘密访问密钥以及“Action”:“sts:AssumeRole”策略来执行 AWS 承担角色?
我认为,下面的方法可行,但是 Terraform 正在通过 AWS Credential Profile 凭证对具有 sts:AssumeRole 策略的帐户进行初始身份验证
当尝试承担角色时,Terraform 是否可以查看 access_key 和 Secret_key 来确定要使用的 AWS 账户,而不是使用 AWS 凭证配置文件?
provider "aws" {
region = var.aws_region …
Run Code Online (Sandbox Code Playgroud) amazon-web-services terraform-enterprise assume-role terraform-cloud
我有一个使用Account-A中的以下 IAM 角色创建的lambda 函数 ( lambda-get-details )
角色名称:兰姆巴罗
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*",
"Effect": "Allow"
},
{
"Action": [
"config:PutEvaluations",
"ec2:DescribeImages",
"sts:AssumeRole"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
Run Code Online (Sandbox Code Playgroud)
在不同账户中创建相同的 IAM 角色名称 ( lambdarole ),就像Account-B一样
现在,来自账户 A 的lambda 函数需要从账户 B获取详细信息(例如 AMI 列表),我们收到以下错误
"errorMessage": "An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:sts::Account-A:assumed-role/lambdarole/lambda-get-details is not authorized to perform: sts:AssumeRole on resource: …
Run Code Online (Sandbox Code Playgroud) 几天来我一直在试图解开这个谜团,但没有任何乐趣。基本上,Terraform 无法发挥作用并失败:
\n\nInitializing the backend...\n2019/10/28 09:13:09 [DEBUG] New state was assigned lineage "136dca1a-b46b-1e64-0ef2-efd6799b4ebc"\n2019/10/28 09:13:09 [INFO] Setting AWS metadata API timeout to 100ms\n2019/10/28 09:13:09 [INFO] Ignoring AWS metadata API endpoint at default location as it doesn\'t return any instance-id\n2019/10/28 09:13:09 [INFO] AWS Auth provider used: "SharedCredentialsProvider"\n2019/10/28 09:13:09 [INFO] Attempting to AssumeRole arn:aws:iam::72xxxxxxxxxx:role/terraform-admin-np (SessionName: "terra_cnp", ExternalId: "", Policy: "")\n\nError: The role "arn:aws:iam::72xxxxxxxxxx:role/terraform-admin-np" cannot be assumed.\n\n There are a number of possible causes of this - the most common are:\n …
Run Code Online (Sandbox Code Playgroud) 我想通过 SDK 以编程方式获取 Quicksight 仪表板 URL(仪表板位于区域:eu-west-1),但是每当我使用以下区域时,我都会收到以下错误:
Operation is being called from endpoint eu-west-1, but your identity region is us-east-1. Please use the us-east-1 endpoint.
us-east-1.quicksight.aws.amazon.com refused to connect
浏览器中出现错误,例如: https: //us-east-1.quicksight.aws.amazon.com/embed/ XXXXXX&identityprovider=quicksight&isauthcode=true ',注意:为了简洁起见,添加了凭据,但这些凭据是从配置文件中加载的。在Java SDK中也尝试过。
const AWS = require('aws-sdk')
const dotenv = require('dotenv').config()
const init = async () => {
AWS.config.credentials = {accessKeyId: process.env.ACCESS_KEY_ID, secretAccessKey: process.env.SECRET_ACCESS_KEY}
AWS.config.region = 'us-east-1'
// AWS.config.region = 'eu-west-1'
const quicksight = new AWS.QuickSight()
const embedUrlParams …
Run Code Online (Sandbox Code Playgroud) 我有一个 Spark 作业,它从 s3 存储桶读取文件,格式化它们,然后将它们放入另一个 s3 存储桶中。我正在使用(SparkSession)spark.read.csv和spark.write.csv功能来完成此任务
当我读取文件时,我需要使用一个 IAM 角色(代入角色),而当我写入文件时,需要删除代入角色并恢复为我的默认角色。
这在同一个 Spark 会话中可能吗?如果没有,还有其他方法可以做到这一点吗?
感谢任何和所有的帮助!
我使用中国地区的curl命令向sts AssumeRoleWithWebIdentity发送POST请求以获取OIDC(OpenID Connect)的access_key、secret_key和令牌,该命令返回以下错误。
调用 AssumeRoleWithWebIdentity 操作时发生错误 (InvalidIdentityToken):提供的令牌不是使用 Amazon 登录令牌。
curl -v -X POST 'https://sts.cn-northwest-1.amazonaws.com.cn/?Action=AssumeRoleWithWebIdentity&DurationSeconds=3600&RoleSessionName=app1&RoleArn=<ROLE_ARN>&WebIdentityToken=<TOKEN>&Version=2011-06-15&&ProviderId=www.amazon.com'
Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的问题,我似乎无法去任何地方。我已经遵循了网上的所有内容(多个教程等),但无法让sts.assumeRole工作。
我的设置:
我有一个在子 AWS 账户 1中运行的机器人,我需要来自主 AWS 账户的定价信息。
因此,我在主 AWS 账户上创建了一个角色来拥有 AWS ce:* 访问权限,如下所示:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["ce:*"],
"Resource": ["*"]
}]
}
Run Code Online (Sandbox Code Playgroud)
信任关系
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com",
"AWS": "arn:aws:iam::SubAWSaccount1-ID:role/instance-profile"
},
"Action": "sts:AssumeRole"
}
]
}
Run Code Online (Sandbox Code Playgroud)
现在,这是附加到在子 AWS 账户 1上运行的 EC2 实例的实例配置文件:
"Version": "2012-10-17", …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个示例,说明如何在 ECS 内正在运行的应用程序中担任角色。
我有一个角色设置,并且已使用此处的设置将 roleARN 添加到任务定义中:https: //docs.aws.amazon.com/en_us/AmazonECS/latest/developerguide/task-iam-roles.html
然后我可以像往常一样承担应用程序逻辑中的角色吗?或者有什么特别需要的吗?
我可以使用此设置,但使用 IAM 用户,该用户具有在我的应用程序中用作凭据的密钥和访问密钥。通过上述设置可以将此身份验证切换到假设角色吗?
amazon-web-services amazon-ecs assume-role ecs-taskdefinition
我运行了以下代码段。我对 aws 的调用工作正常,但现在我必须切换角色,它遇到了问题,使其生效,因为我似乎仍然停留在原来的角色中。
public void awsAssumeRoleUsingEnvironmentVariable(Regions region, String roleARN, String roleSessionName) throws Exception {
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
.withCredentials(new EnvironmentVariableCredentialsProvider())
.withRegion(region)
.build();
GetCallerIdentityRequest request = new GetCallerIdentityRequest();
GetCallerIdentityResult response = stsClient.getCallerIdentity(request);
System.out.println("CURRENT ROLE ASSUMED IS: " + response.toString());
request = new GetCallerIdentityRequest();
System.out.println("EXECUTING ASSUME ROLE");
AssumeRoleRequest roleRequest = new AssumeRoleRequest()
.withRoleArn(roleARN)
.withRoleSessionName(roleSessionName);
AssumeRoleResult roleResponse = stsClient.assumeRole(roleRequest);
Credentials sessionCredentials = roleResponse.getCredentials();
response = stsClient.getCallerIdentity(request);
System.out.println("CURRENT ROLE ASSUMED IS: " + response.toString());
}
Run Code Online (Sandbox Code Playgroud)
getCallerIdentity 每次都返回相同的角色
编辑:只是试图解决这个问题,这绝对是我通过尝试使用使用 AWSCLI 返回的凭证进行编码的方式的问题。当我对运行应用程序时生成的变量执行 a 操作System.out.println()
时 …
在去年 12 月 24 日发布 GO SDK-v2 RC 之后,我不知道如何创建配置来在不同的 aws 账户中承担角色。我找不到任何文档或示例,并尝试使用“config.WithAssumeRoleCredentialsOptions”或“stscreds.NewAssumeRoleProvider”,但没有任何结果。有人有这方面的例子或指示吗?
assume-role ×11
amazon-s3 ×2
aws-sdk ×2
amazon-ecr ×1
amazon-ecs ×1
amazon-iam ×1
apache-spark ×1
aws-lambda ×1
go ×1
java ×1
node.js ×1
pyspark ×1
sdk ×1
sts ×1
terraform ×1