Para asumir un rol de AWS en la CLI, hago el siguiente comando:
aws sts assume-role --role-arn arn:aws:iam::123456789123:role/myAwesomeRole --role-session-name test --region eu-central-1
Esto me da una salida que sigue el esquema:
{ "Credentials": { "AccessKeyId": "someAccessKeyId", "SecretAccessKey": "someSecretAccessKey", "SessionToken": "someSessionToken", "Expiration": "2020-08-04T06:52:13+00:00" }, "AssumedRoleUser": { "AssumedRoleId": "idOfTheAssummedRole", "Arn": "theARNOfTheRoleIWantToAssume" } }
Y luego copio y pego manualmente los valores de AccessKeyId
, SecretAccessKey
y SessionToken
en un montón de exportaciones como esta:
export AWS_ACCESS_KEY_ID="someAccessKeyId" export AWS_SECRET_ACCESS_KEY="someSecretAccessKey" export AWS_SESSION_TOKEN="someSessionToken"
Para finalmente asumir el papel.
¿Cómo puedo hacer esto de una vez? Quiero decir, sin esa intervención manual de copiar y pegar la salida del comando aws sts ...
en las exports
.
Finalmente, un colega compartió conmigo este increíble fragmento que hace el trabajo de una sola vez:
eval $(aws sts assume-role --role-arn arn:aws:iam::123456789123:role/myAwesomeRole --role-session-name test | jq -r '.Credentials | "export AWS_ACCESS_KEY_ID=\(.AccessKeyId)\nexport AWS_SECRET_ACCESS_KEY=\(.SecretAccessKey)\nexport AWS_SESSION_TOKEN=\(.SessionToken)\n"')
Aparte de AWS CLI, solo requiere jq
, que generalmente se instala en cualquier escritorio Linux.
Puede almacenar una función de IAM como un perfil en la CLI de AWS y automáticamente asumirá la función por usted.
Este es un ejemplo deUso de un rol de IAM en la CLI de AWS - Interfaz de línea de comandos de AWS :
[profile marketingadmin] role_arn = arn:aws:iam::123456789012:role/marketingadminrole source_profile = user1
Esto está diciendo:
--profile marketingadmin
user1
AssumeRole
en el rol especificadoEsto significa que simplemente puede llamar a un comando como este y asumirá el rol y usará las credenciales devueltas automáticamente:
aws s3 ls --profile marketingadmin
Sin jq
, sin eval
, sin exportaciones múltiples, utilizando el printf
incorporado (es decir, sin pérdida de credenciales a través de /proc
) y sustitución de comandos:
export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \ $(aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/MyAssumedRole \ --role-session-name MySessionName \ --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \ --output text))
Tuve el mismo problema y logré usar uno de los tiempos de ejecución que me sirvió la CLI.
Una vez que obtuve las credenciales, utilicé este enfoque, aunque no tan elegante (utilicé el tiempo de ejecución de PHP, pero podría usar lo que tiene disponible en su CLI):
- export AWS_ACCESS_KEY_ID=`php -r 'echo json_decode(file_get_contents("credentials.json"))->Credentials->AccessKeyId;'` - export AWS_SECRET_ACCESS_KEY=`php -r 'echo json_decode(file_get_contents("credentials.json"))->Credentials->SecretAccessKey;'` - export AWS_SESSION_TOKEN=`php -r 'echo json_decode(file_get_contents("credentials.json"))->Credentials->SessionToken;'`
donde credentials.json es el resultado del rol asumido:
aws sts assume-role --role-arn "arn-of-the-role" --role-session-name "arbitrary-session-name" > credentials.json
Obviamente, esto es solo un enfoque, particularmente útil en caso de que esté automatizando el proceso. A mí me funcionó, pero no sé si es lo mejor. Seguro que no es el más lineal.
La respuesta de Arcones es buena, pero aquí hay una forma que no requiere jq:
eval $(aws sts assume-role \ --role-arn arn:aws:iam::012345678901:role/TrustedThirdParty \ --role-session-name=test \ --query 'join(``, [`export `, `AWS_ACCESS_KEY_ID=`, Credentials.AccessKeyId, ` ; export `, `AWS_SECRET_ACCESS_KEY=`, Credentials.SecretAccessKey, `; export `, `AWS_SESSION_TOKEN=`, Credentials.SessionToken])' \ --output text)