[AWS 입문] AWS CLI에서 IAM Role 전환하기

AWS CLI로 IAM Role 전환을 하는 방법에 대해서 정리해보았습니다.
2020.07.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요! 클래스메소드 신입엔지니어 정하은입니다?

정말 오랜만의 한국어 블로그인데요.. 그동안 잊고 있었던 DevIO 한국어 블로그 사이트 프로젝트를 다시 시작하는 겸, 이전에 IAM Role 설정 시에 AWS서비스 접근이 잘 되지 않았던 부분을 해결해보았습니다.

그래서 이번 블로그는 나중에 다른 환경에서도 IAM Role 설정할 때 두고두고 보려고 쓰는 글이니 가볍게 읽어주셨으면 해요ㅎㅎ

실행 환경

제가 어떤 상황인지를 간단히 설명드리는게 이해가 빠를 것 같아, 참고차 적어둘게요.

  • 루트 사용자는 Role 생성 외 모든 권한이 막혀 있음
  • 루트 사용자에서 IAM Role을 생성해 둠
  • 루트 사용자에 MFA 설정이 되어 있음
  • IAM Role은 모든 서비스 접근 권한이 부여된 상태
  • macOS에서 AWS CLIv2 사용
  • aws configure로 루트 사용자의 Access Key ID와 Secret Access Key를 설정해놓음

IAM Role 교차 계정으로 사용하기

원래 정석으로 쓰이는 방법은 아니지만(정석적인 방법은 아래에 따로 기재), 초기 설정 이후에 가장 편하게 사용할 수 있는 방식이라 소개해드리고자 해요!

Role Profile 추가

일단 IAM Role을 AWS CLI에서 사용하기 위해서는 MFA Serial과 Role ARN이 필요한데요. vi ~/.aws/config 을 입력하여 아래의 내용을 추가합니다.

Windows 환경에서 사용하시는 경우, .aws 폴더의 config 파일을 직접 열어 편집해주세요.

[profile role]
source_profile = default 
mfa_serial = arn:aws:iam::xxxxxxxxxxxxx:mfa/사용자명 
role_arn = arn:aws:iam::yyyyyyyyyyyy:role/역할명

여기서 각각의 요소가 무엇을 의미하는지에 대해 간단하게 짚어보자면

  • source_profile

Role 설정을 하기 위해서는 Role을 생성한 유저의 Access Key ID와 Secret Access Key가 우선적으로 필요한데, IAM Role은 키 정보를 갖고 있지 않죠. 그렇기 때문에 처음에 aws configure 로 설정한 정보를 가져다 써야할 필요가 있답니다.

실행 환경 부분에서 언급했다시피 저는 루트 사용자로 접속한 상태에서 Role을 생성했고, AWS CLI에도 default로 지정해두었기 때문에 위와 같이 적었는데요. 다른 IAM User 상에서 IAM Role을 생성하셨더라도 AWS CLI에 프로파일을 등록하시면 응용해서 사용할 수도 있겠죠?

  • mfa_serial

이 값은 MFA 인증을 해야할 경우에 필요합니다.  MFA를 사용하시지 않는다면 아래로 넘어가주세요.

혹시나 mfa_serial 값은 어디서 확인할 수 있는지 궁금해하실 분들이 계실 것 같아 사진 첨부해두었으니, 빨간 네모 박스 부분을 복사해서 사용해주세요.

참고로 숫자값 다음에 나오는 mfa를 user로 쓰시면 접속 에러가 뜨니 제대로 입력했는지 꼭 확인해주세요!

  • role_arn

IAM Role 설정을 위해서 필요한 값입니다. 이것도 사진 첨부해두었니, 빨간 네모 박스 부분을 복사해서 사용해주시면 됩니다.

이 부분도 마찬가지로, 복사해서 쓰시면 문제가 없겠지만 숫자값 다음에 role을 user로 쓰지 않았는지 확인해주세요!

Role 전환 확인

저장하신 후, aws sts get-caller-identity를 입력해서 설정이 반영 되었는지 확인해봅시다.

{
"UserId": "XXXXXXXXXXXXXXXXXXXXX",
"Account": "xxxxxxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxxxxxxx:user/사용자명"
}

어라? role이 아닌 user가 뜨네요. 그리고 MFA 인증도 하지 않았는데 바로 출력이 되는 걸 보니 무언가를 빠뜨린 것 같아요.

이렇게 출력이 되는 이유는 AWS CLI에서 기본으로 사용하는 프로파일 설정이 아직 default에 맞춰져 있기 때문입니다.

config 파일에 추가한 role을 사용하도록 터미널에 아래와 같이 입력해주세요. Windows의 경우 export 명령어를 사용할 수 없기 때문에 set으로 바꿔주세요.

export AWS_DEFAULT_PROFILE = role

그리고 다시 aws sts get-caller-identity 를 입력해서 확인해봅시다.

Enter MFA code for arn:aws:iam::xxxxxxxxxxxx:mfa/사용자명: 
{
  "UserId": "YYYYYYYYYYYYYYYYYYYYY:botocore-session-oooooooooo",
  "Account": "yyyyyyyyyyyy",
  "Arn": "arn:aws:sts::yyyyyyyyyyyy:assumed-role/역할명/botocore-session-oooooooooo"
}

먼저 MFA 인증 코드를 입력하라는 문구가 나오네요. 코드를 입력해주시면 드디어 제대로 정보가 뜨는 걸 확인할 수 있답니다! ?

aws s3 ls를 입력해서 서비스에 제대로 접근이 되는지 확인해봤는데, 다행히 잘 되네요!

다른 방법

IAM Role 설정하는 방법이 한 가지 더 있는데요. 임시 토큰을 받아서 설정하는 방법이랍니다. (사실 제한 시간 때문에 토큰이 만료 되면 다시 유저로 돌아가서 토큰을 받아와야 하는 게 조금 귀찮은..)

우선 아래처럼 긴 명령어를 입력해주세요.

aws sts assume-role --role-arn arn:aws:iam::yyyyyyyyyyyy:role/역할명 --role-session-name 아무거나 --serial-number arn:aws:iam::xxxxxxxxxxxx:mfa/사용자명 --token-code MFA인증번호

그러면 관련 정보가 쭉 뜨실텐데 여기서 AccessKeyId, SecretAccessKey, SessionToken를 복사하여 사용하게 됩니다. 위에서도 언급한대로 Expiration에 만료 시각이 나와있어요.

{
  "Credentials": {
    "AccessKeyId": "ZZZZZZZZZZZZZZZZZZZZZ",
    "SecretAccessKey": "~",
    "SessionToken": "시크릿 액세스 키를 초월하는 엄청나게 긴 문자열이 나옵니다",
    "Expiration": "2020-07-28T12:15:05+00:00"
  },
  "AssumedRoleUser": {
    "AssumedRoleId": "OOOOOOOOOOOOOOOOOOOOO:세션명",
    "Arn": "arn:aws:sts::yyyyyyyyyyyy:assumed-role/역할명/세션명"
  }
}

이제 아래와 같이 export 명령으로 값을 지정해주시면 IAM Role 사용이 가능해진답니다.

export AWS_ACCESS_KEY_ID=위에 출력된 액세스 키
export AWS_SECRET_ACCESS_KEY=위에 출력된 액세스 키
export AWS_SESSION_TOKEN=위에 출력된 세션 토큰

마지막으로

사실 Amplify하면서 CLI 환경은 어느 정도 익숙해지기는 했지만, Management Console을 사용하는 게 습관이 되다보니 이런 간단한 작업 하나 하는데도 시간이 오래 걸리네요ㅠㅠ

특히 IAM Role의 경우는 IAM User보다 AWS CLI에서 사용할 때 설정이 조금 복잡해서 사용이 꺼려지기는 하지만, 보안적인 부분을 고려했을 때 IAM Role이 조금 더 안전하기 때문에 여러분들께 IAM Role로 전환해서 사용하는 걸 추천드리고 싶습니다!

참고

AWS CLI에서 IAM 역할 사용

MFA 토큰을 사용하여 AWS CLI를 통해 내 AWS 리소스에 대한 액세스를 인증하려면 어떻게 해야합니까?