AWS CLI를 사용하여 AssumeRole을 호출하고 임시 사용자 자격 증명을 저장하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 9월 28일

AWS 명령줄 인터페이스(AWS CLI)를 사용하여 AssumeRoleWithSAML, AssumeRole, AssumeRoleWithWebIdentity 작업에서 자격 증명을 가져오고 싶습니다. 어떻게 해야 합니까?

해결 방법

다음 지침에 따라 API를 호출하고 출력을 텍스트 파일에 저장한 후 이를 사용하여 AWS CLI에서 API 명령을 호출하십시오.

중요:

AssumeRoleWithSAML

참고: 자격 증명 공급자의 유효한 SAML 2.0 응답과 IdP를 신뢰하는 IAM 역할이 있어야 합니다.

개발자 도구에서 SAML 응답을 받으세요.

1.    문제 해결을 위해 브라우저에서 SAML 응답을 보는 방법에 대한 지침을 따르십시오.

2.    로그로 스크롤하고 SAML 로그 파일을 여십시오.

3.    전체 SAML 응답을 복사하세요.

4.    SAML 응답을 samlresponse.log라는 로컬 디렉터리 파일에 붙여 넣습니다. 그런 다음, assume-role-with-saml을 실행하여 STS 토큰을 호출합니다.

참고: 이 예제에서는 Linux 기반 배포와 호환되는 awk를 사용합니다.

aws sts assume-role-with-saml --role-arn arn:aws:iam::ACCOUNTNUMBER:role/IAM_ROLE --principal-arn arn:aws:iam::ACCOUNTNUMBER:saml-provider/SAML_PROVIDER --saml-assertion file://samlresponse.log

awk -F:  '
                BEGIN { RS = "[,{}]" ; print "[PROFILENAME]"}
                /:/{ gsub(/"/, "", $2) }
                /AccessKeyId/{ print "aws_access_key_id = " $2 }
                /SecretAccessKey/{ print "aws_secret_access_key = " $2 }
                /SessionToken/{ print "aws_session_token = " $2 }
' >> ~/.aws/credentials

그러면 자격 증명이 ~/.aws/credentials 파일 내부의 프로필에 저장됩니다.

5.    (선택 사항) 자격 증명을 백업하려면 다음 명령을 실행합니다.

cp -a ~/.aws/credentials ~/.aws/credentials.bak.

팁: ~/.aws/config에 출력 및 리전 세트와 일치하는 프로필이 있는지 확인하여 입력하라는 메시지가 여러 번 표시되지 않도록 합니다.

6.    --profile 파라미터로 사용자 자격 증명을 호출합니다.

aws ec2 describe-instances --profile PROFILENAME

파일에 파이프하지 않는 assume-role-with-saml 출력 예시:

{            
    "SubjectType": "persistent",
    "AssumedRoleUser": {
       "AssumedRoleId": "ROLE_ID_NUMBER:example@corp.example.com",
       "Arn": "arn:aws:sts::ACCOUNTNUMBER:assumed-role/ROLE_ID/example@corp.example.com"
    },    
    "Audience": "https://signin.aws.amazon.com/saml",
    "NameQualifier": "RANDOM_GENERATED_STRING",
    "Credentials": {
       "SecretAccessKey": "SECRET_ACCESS_KEY",
       "SessionToken": "TOKEN_KEY",
       "Expiration": "2015-05-11T20:00:49Z",
       "AccessKeyId": "ACCESS_KEY_ID"
},
"Subject": "CORP\\\\EXAMPLE",
"Issuer": "http://SERVER_NAME.corp.example.com/adfs/services/trust"
}

자격 증명 파일에 파이프하는 assume-role-with-saml 출력 예시:

aws_access_key_id =  ACCESS_KEY_ID
aws_session_token =  SESSION_TOKEN
aws_secret_access_key =  SECRET_ACCESS_KEY
[PROFILENAME]

AssumeRole

참고: IAM 자격 증명이 수임한 IAM 역할을 신뢰해야 합니다.

1.    AWS 명령 get-caller-identity를 실행하여 응답을 확인합니다.

aws sts get-caller-identity

참고: 응답을 받지 못했다면 유효한 IAM 액세스 또는 보안 키가 .aws/credentials 파일에 저장되어 있는지 확인하십시오.

2.    assume-role 명령을 실행합니다.

aws sts assume-role --role-arn arn:aws:iam::123456789012:role/ExampleRole --role-session-name ExampleSession

다음과 유사한 응답을 수신하게 됩니다.

{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAZRG5BQ2L7OB87N3RE:ExampleSession",
        "Arn": "arn:aws:sts::123456789012:assumed-role/RoleA/ExampleSession"
    },
    "Credentials": {
        "SecretAccessKey": "JCNFKY7XCUwHWTKcQhmmFokpjLetCmNLZ7pg9SJe",
        "SessionToken": "FwoGZXIvYXdzEL7//////////wEaDNoBLBJUNYWKaHXZXCKvARBGJ4CqOs+p2JR2a7Euni0d0XuSs31ZA/1QqpX6Spfuz2WAvHCyqwbE3+oxyvyqYlO8dTJwp56YCFCJ6K4Prt9pMeZU9R5NGBJHvRbXXKfxp+jktLc/ItrAfn4GMXWpoyJKZrY7hzv3MASomlIcwSD/RqWIBS1vAoo1UAxwjy29jai0OAPQ51LAnuFKeabgmllyP5Y2gu488P19D7ikfgQtmBtH5I/Q8+5IEn4qMwYo1bq/8wUyLe1b3+mQwhq+zEz4TSyHD8HBXd9W3KYcB53MIotwiJNS+m0P5ZlZnpcJm3JwtA==",
        "Expiration": "2020-03-16T21:11:01Z",
        "AccessKeyId": "ASIAZRG8BQ4K2EBXGR42”
    }
}

3.    AccessKeyId, SecretAccessKey, SessionToken을 환경 변수로 내보냅니다.

export AWS_ACCESS_KEY_ID=ASIAZRG8BQ4K2EBXGR42
export AWS_SECRET_ACCESS_KEY=JCNFKY7XCUwHWTKcQhmmFokpjLetCmNLZ7pg9SJe
export AWS_SESSION_TOKEN=FwoGZXIvYXdzEL7//////////wEaDNoBLBJUNYWKaHXZXCKvARBGJ4CqOs+p2JR2a7Euni0d0XuSs31ZA/1QqpX6Spfuz2WAvHCyqwbE3+oxyvyqYlO8dTJwp56YCFCJ6K4Prt9pMeZU9R5NGBJHvRbXXKfxp+jktLc/ItrAfn4GMXWpoyJKZrY7hzv3MASomlIcwSD/RqWIBS1vAoo1UAxwjy29jai0OAPQ51LAnuFKeabgmllyP5Y2gu488P19D7ikfgQtmBtH5I/Q8+5IEn4qMwYo1bq/8wUyLe1b3+mQwhq+zEz4TSyHD8HBXd9W3KYcB53MIotwiJNS+m0P5ZlZnpcJm3JwtA==

4.    자격 증명을 확인합니다.

aws sts get-caller-identity

출력에는 assume-role 호출의 자격 증명이 표시됩니다.

AssumeRoleWithWebIdentity

참고: 유효한 OAuth 2.0 액세스 토큰, OpenID Connect 토큰, IdP를 신뢰하는 IAM 역할이 있어야 합니다.

1.    다음과 비슷한 assume-role 명령을 실행합니다.

aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789012:role/FederatedWebIdentityRole --role-session-name ExampleSession --web-identity-token
Atza%7CIQEBLjAsAhRFiXuWpUXuRvQ9PZL3GMFcYevydwIUFAHZwXZXXXXXXXXJnrulxKDHwy87oGKPznh0D6bEQZTSCzyoCtL_8S07pLpr0zMbn6w1lfVZKNTBdDansFBmtGnIsIapjI6xKR02Yc_2bQ8LZbUXSGm6Ry6_BG7PrtLZtj_dfCTj92xNGed-CrKqjG7nPBjNIL016GGvuS5gSvPRUxWES3VYfm1wl7WTI7jn-Pcb6M-buCgHhFOzTQxod27L9CqnOLio7N3gZAGpsp6n1-AJBOCJckcyXe2c6uD0srOJeZlKUm2eTDVMf8IehDVI0r1QOnTV6KzzAI3OY87Vd_cVMQ

응답 예:

{
    "SubjectFromWebIdentityToken": "amzn1.account.AF6RHO7KZU5XRVQJGXK6HB56KR2A"
    "Audience": "client.5498841531868486423.1548@apps.example.com",
    "AssumedRoleUser": {
        "Arn": "arn:aws:sts::123456789012:assumed-role/FederatedWebIdentityRole/ExampleSession",
        "AssumedRoleId": "AROACLKWSDQRAOEXAMPLE:ExampleSession"
    }
    "Credentials": {
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
        "SessionToken": "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE",
        "Expiration": "2020-05-19T18:06:10+00:00"
    },
    "Provider": "www.amazon.com"

2.    AccessKeyId, SecretAccessKey, SessionToken을 .aws/credentials 파일에 저장합니다.

[ExampleRoleProfile]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
aws_session_token=AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE

3.    get-caller-identity 명령을 실행합니다.

aws sts get-caller-identity --profile ExampleRoleProfile

출력에서는 다음과 비슷한 assume-role 호출의 자격 증명이 표시됩니다.

{
"UserId": "AROACLKWSDQRAOEXAMPLE:ExampleSession",
"Account": "123456789012",
"Arn": "arn:aws:sts::123456789012:assumed-role/FederatedWebIdentityRole/ExampleSession"
}