EMD Blog

[GCP] IAM에 대해 알아보자(1)- SDK 설치 본문

Public Cloud/GCP

[GCP] IAM에 대해 알아보자(1)- SDK 설치

EmaDam 2021. 12. 16. 21:15

IAM 

 Identity and Access Management의 약자로 엑세스 제어를 위한 서비스이다. 대체로 IAM에서 하게 되는 것은 사용자(주 구성원)를 만들고 권한을 부여하는 것이다. 사용자는 가지고 있는 권한에 따라 원하는 리소스에 접근할 수도 있고 접근하지 못할 수도 있다. 

 

역할 

 역할이란 권한을 여러개 묶어 놓은 것을 말한다. 위에서 사용자에게 권한을 부여한다고 했었는데, 사실 정확하게는 사용자에게 직접적으로 개별 권한을 부여할 수는 없고 역할을 부여해한다. 예를 들어 조직 내 누군가에게 Cloud Storage를 전체적으로 관리할 수 있도록 권한을 주고자 한다면 Cloud Storage 내 Bucket에 대한 생성, 삭제, 목록 보기 등에 대한 권한을 하나씩 부여하는 것이 아닌 생성, 삭제, 목록 보기 등의 권한을 먼저 원하는 이름의 역할(ex BucketsAdmin)로 묶어 해당 역할을 사용자에게 부여해야하는 것이다. 물론 이제 막 Cloud를 접하기 시작해서는 어떤 리소스에 어떤 권한이 존재하는 지도 모르는데 그것들을 전부 문서 뒤져가면서 찾아가지고 역할을 하나씩 만들고 있기는 힘들 것이다. 그렇게 때문에 GCP에서는(AWS도 마찬가지다.) 기본 역할, 사전 정의된 역할, 커스텀 역할을 제공하고 있다. 

 

 기본 역할대부분의 권한을 가지고 있는 역할이다. 총 세가지로 나뉘는데 뷰어, 편집자, 소유자이다. 이름으로 봐서 알겠지만 뷰어의 경우 대부분 리소스에 대한 읽기 권한을 가지고 있고 편집자생성 수정, 소유자 역할 설정과 결제에 대한 권한까지 가지고 있다. 참고로 편집자는 뷰어에 대한 모든 권한을 포함하고 소유자는 편집자에 대한 모든 권한을 포함한다. 기본 역할은 기본적으로 권한을 넓게 가지고 있기 때문에 인프라 구축을 주도하는 팀외에는 어지간하면 사용을 하지 않는 것이 좋다. 모든 Public Cloud에서는 최소 권한 원칙을 준수해야한다. 

 

 그럼 다른 팀내에서 이런 저런 권한을 요구하는 상황이라면 어떡해야 할까? 기본 역할을 주기에는 조금 꺼려질 수 있지만 그렇다고 그에 대한 역할을 전부 만드는 것도 너무 일이 많아진다. 이럴 때 사용할 수 있는 것이 사전 정의된 역할이다. 사전 정의된 역할GCP에서 미리 만들어 제공하는 역할로 다양한 리소스에 대한 역할을 제공하고 있다. 아까 위에서 Cloud Storage에 대한 역할을 만드는 예를 들었었는데 이에 대해 사전 정의된 역할이 어떻게 제공되고 있는지 한번 보자. 

 

[Cloud Storage의 사전 정의된 역할]

 

위 링크를 열어보면 Cloud Storage에 대한 사전 정의된 역할 목록이 나온다. 나름 세부적으로 잘 나뉘어져 있어 유용하게 쓸 수 있어보인다. 다른 서비스들도 마찬가지로 이런식의 사전 정의된 역할이 존재하니 필요에 따라 적당한 역할을 찾아 부여하자. 사전 정의된 역할을 쉽게 찾는 방법은 그냥 구글에다가 "<서비스 명> role"로 검색하면 대부분 나온다.

 

 사전 정의된 역할을 사용하면 대부분의 요구사항을 만족할 수는 있겠지만 사실 모든 요구사항을 지키기는 힘들다. 특히 최소 권한 원칙을 완벽하게 준수하려면 무조건 커스텀 역할이라는 것을 통해 역할을 직접 만들어 관리해야한다. 실제 있었던 예를 들면 외부 개발자가 Cloud Storage에 대한 Bucket 목록 조회 권한을 부여해달라고 요청한 적이 있었는데 Bucket 목록 조회 권한을 부여하려면 사전 정의된 역할 중 스토리지 관리자 역할을 부여해야 했다. 하지만 이는 너무 많은 권한이 포함되어 있기 때문에 부여해줄 수 없었고 커스텀 역할을 사용해 직접 역할을 만들어 부여해주었다. 이런 상황은 프로덕션 환경이라면 반드시 준수해야하기 때문에 프로덕션 환경을 구축하기 전에 역할에 대한 정책을 팀내에서 미리 수립해두어야한다. 

 

서비스 계정

 서비스 계정리소스에서 사용하는 계정이다. 이 계정은 리소스에서 리소스로 엑세스 해야할 경우 주로 사용된다. 예를 들면 API를 만들어 GCP의 VM Instance위에 배포했다고 가정해보자. 그런데 이 API는 Cloud Storage에 파일을 업로드하는 권한이 필요하다. 하지만 API는 GCP의 주 구성원이 아니라서 역할을 부여받을 수가 없다. 이때 바로 서비스 계정이 필요하다. 먼저 서비스 계정에 Cloud Storage 업로드에 대한 역할을 부여하고 API가 서비스 계정 사용할 수 있도록 API 코드와 OS내에 약간의 설정을 추가하면 API가 서비스 계정의 역할을 통해 Cloud Storage에 업로드할 수 있게 된다. 사실 이 경우 꼭 서비스 계정말고 그냥 자신의 계정을 사용해도 똑같이 작동하지만 계정의 용도는 정확하게 분리하는 것이 관리 차원에서 유리하므로 서비스 계정을 사용하는 것이 가장 좋다.

 

IAM 사용하기전 SDK 설치

가볍게 사용하기 위해서는 위의 역할과 서비스 계정이 있다는 것 정도만 알고 있어도 충분하다. 나머지는 직접 해보면서 확인해보자. 

먼저 아래 절차를 따라 GCP SDK(gcloud)부터 설치하자. GCP SDK를 설치하면 CLI를 통해 리소스를 관리할 수 있게 된다. 물론 처음부터 헷갈리게 SDK를 사용할 필요는 없지만 당장 사용하지 않더라도 일단 설치해두자. 

 

 

설치는 공식 문서에 있는대로 따라해도 되지만 내용이 살짝 부실하다. 윈도우의 경우 문서를 참고하고 macOS라면 아래대로 따라하자.

 

Cloud SDK를 사용하기 위해서는 먼저 python3 (3.7, 3.8), python2 (2.7.9 이상)가 필요하다. 만약에 macOS Big sur 이상을 사용하고 있다면 python 버전도 3.9 이상을 사용하고 있을 확률이 높으므로 꼭 확인하자. 

$ python -V
Python 3.8.12

나 같은 경우는 이미 버전을 바꿔놔서 3.8로 되어있지만 3.9 이상으로 출력될 경우 아래와 같이 버전을 바꿔주자. 

먼저 python 3.8버전이 설치되어 있는지 확인한다.

$ ls -l /usr/local/opt/ | grep python
또는 
$ brew list | grep python

만약에 3.7 또는 3.8이 없다면 설치해주자. 

$ brew install python@3.8

설치가 끝나면 3.8 버전을 사용하도록 환경변수를 설정해준 뒤 python 명령어가 python3.8 버전을 가리키도록 alias를 설정해준다. 만약에 alias 설정 없이 환경변수만 설정해줄 경우 python3.8 버전을 사용하기 위해서는 python3 -V 이런식으로 불편하게 사용해야하니 alias를 꼭 설정해주도록 하자.

 

.zshrc 또는 .bashrc에 아래 내용을 추가한다. macOS Big sur 기준으로 terminal 기본 쉘은 zsh이며, 이 부분은 그냥 터미널 상단바를 확인하면 된다. z쉘(zsh)을 사용하고 있다면 .zshrc에, bash를 사용하고 있다면 .bashrc에 아래 내용을 추가하자.

export PATH="/usr/local/opt/python@3.8/bin:$PATH"
alias python=/usr/local/opt/python@3.8/bin/python3

아마 바로 알겠지만 윗 줄이 환경변수를 설정해준 것이고, 아래가 alias를 설정해준 것이다. 마지막으로 변경된 설정들을 저장하고 다시 버전을 확인해보자.

$ source .zshrc
$ python -V
Python 3.8.12

자 이제 Cloud SDK를 설치할 준비가 다 되었다. 그럼 먼저 GCP 문서로 이동해 SDK를 다운로드 하자. 

 

SDK 목록

환경에 따라 SDK파일이 나뉘어져 있는데 나 같은 경우는 intel을 사용하고 있어 첫 번째 SDK 파일을 다운로드 받았다. M1을 쓰고 있다면 두 번째 파일을 받으면 된다. 

파일을 다운로드 받았으면 받은 파일을 원하는 위치에 옮겨 놓고 압축을 해제한다. 어차피 환경변수 설정할거라 아무 곳에나 압축해제해도 상관 없다. 압축을 해제 했으면 .zshrc 또는 .bashrc 파일에 환경변수를 추가하자.

export PATH=$PATH:<GOOGLE_CLOUD_SDK_PATH>/bin
# python 환경설정들
export PATH="/usr/local/opt/python@3.8/bin:$PATH"
alias python=/usr/local/opt/python@3.8/bin/python3

위 설정에서 <GOOGLE_CLOUD_SDK_PATH>를 본인이 압축해제한 SDK 경로로 바꿔주면 SDK설치가 끝이 난다. 

$ source .zshrc
$ gcloud -v
Google Cloud SDK 308.0.0
bq 2.0.60
core 2020.08.28
gsutil 4.53

만약에 여기서 python 버전이 제대로 설치되어 있지 않다면 아래와 같은 에러가 발생하니 꼭 python 버전이 잘 설정되어 있는지 확인하자. 

Unable to connect to the server: error executing access token command "/usr/lib64/google-cloud-sdk/bin/gcloud config config-helper --format=json": err=exit status 1 output= stderr=Traceback (most recent call last):
File "/usr/lib64/google-cloud-sdk/lib/gcloud.py", line 104, in
main()
File "/usr/lib64/google-cloud-sdk/lib/gcloud.py", line 62, in main
from googlecloudsdk.core.util import encoding
File "/usr/lib64/google-cloud-sdk/lib/googlecloudsdk/init.py", line 23, in
from googlecloudsdk.core.util import importing
File "/usr/lib64/google-cloud-sdk/lib/googlecloudsdk/core/util/importing.py", line 23, in
import imp
File "/usr/lib64/python3.9/imp.py", line 23, in
from importlib import util
File "/usr/lib64/python3.9/importlib/util.py", line 2, in
from . import abc
File "/usr/lib64/python3.9/importlib/abc.py", line 17, in
from typing import Protocol, runtime_checkable
File "/usr/lib64/python3.9/typing.py", line 26, in
import re as stdlib_re # Avoid confusion with the re we export.
File "/usr/lib64/python3.9/re.py", line 124, in
import enum
File "/usr/lib64/google-cloud-sdk/lib/third_party/enum/init.py", line 26, in
spec = importlib.util.find_spec('enum')
AttributeError: module 'importlib' has no attribute 'util'

 

어쩌다보니까 SDK 설치 포스팅이 되었는데 다음 포스팅에서는 이 SDK를 사용해 이리저리 IAM 설정을 해보도록 하자.