# Resource hierarchy
GCP 리소스는 계층이 존재한다. 1번부터 순서대로 하위 -> 상위 계층으로 올라간다.
- Resources: VM을 가리킨다. 클라우드 스토리지 버킷, VPCs(Virtual Private Networks), 빅쿼리 테이블 등
- Projects: 프로젝트는 리소스들로 구성된다.
- Folders: 폴더는 프로젝트들로 구성된다.
- Organization node: 조직 노드는 리소스, 프로젝트, 폴더 전체를 감싸는 최상위 계층이다.
이러한 리소스 계층은 구글 클라우드에서 정책들이 어떻게 관리되는 지와 깊게 관련되어 있기 때문에 중요한 개념이다.
정책은 프로젝트, 폴더, 조직 노드에서 정의될 수 있다. 특정 구글 클라우드 내 서비스 중에서는 리소스 단위까지 정책을 적용할 수도 있다. 정책은 하위 계층에 상속된다.
# Projects
프로젝트는 구글 클라우드 서비스 사용 및 관리(API 관리, 비용 관리, 콜라보레이터 추가 및 삭제...)를 위한 기초 단위이다. 각 프로젝트는 독립적이고 각 리소스는 하나의 프로젝트에만 속해있다. 프로젝트별로는 소유자 및 사용자를 설정할 수 있다. 비용 청구 또한 프로젝트 단위로 이루어진다.
프로젝트는 세개의 식별자 속성을 갖는다.
- project ID: 구글에 의해 할당되는 글로벌하게 유니크한 식별자이다. 생성 이후에는 변경될 수 없는 속성이다. (프로젝트 생성 과정에서는 직접 설정 가능하다는 것을 의미한다.)
- project names: 유저가 직접 설정하는 프로젝트 이름이다. 유니크할 필요가 없고, 생성 이후에도 자유롭게 수정 가능하다.
- project number: 리소스 추적을 위해 구글 클라우드 내부적으로 사용하는 값이다. 글로벌하게 유니크하고, 불변값이다.
프로젝트 관리는 구글 클라우드에서 제공하는 Resource Manager
툴을 통해 이루어진다. 해당 툴은 계정과 관련된 프로젝트 리스트를 조회하고, 새로운 프로젝트를 생성하고, 삭제하고, 복구하는 등의 작업을 할 수 있는 API이다. 코드 기반으로 관리가 가능하다. CLI, 코드, 파이프라인 등으로 연동 가능하고 RPC / REST API 형태로 제공된다. (대규모 프로젝트 관리 시 유용)
# Folders
폴더는 정책 적용과 조직화에 있어서 강력한 역할을 한다. IAM과 조직 정책을 세분화(granularity) 할 수 있다.
Organization Node (your-company.com)
└── Folder: Product Department (IAM: Engineers Read/Write)
├── Folder: Mobile Team (IAM: Mobile Devs Admin)
│ └── Project: mobile-backend-prod
│ └── Project: mobile-analytics
├── Project: web-frontend
리소스는 폴더에 설정된 정책들을 상속받는다. 두개의 프로젝트가 하나의 폴더에 속해 있다면 해당 폴더의 정책들을 상속받지만, 해당 폴더와 동일 계층에 존재하는 다른 폴더에 속한 프로젝트들은 상속받지 않도록 설계할 수 있다.
폴더 사용을 위해서는 최상위 계층인 조직 노드를 사용해야 한다.
# Organization node
조직 노드에는 특수한 역할이 있는데, 바로 조직 정책 관리자(Organization policy administrator)이다. 해당 역할을 부여 받은 유저만이 정책을 변경할 수 있다.
프로젝트 생성자 (Project creator) 역할도 지정할 수 있다. 프로젝트 생성 권한을 주는 것이고, 이에 따라 비용을 누가 발생시켰는지 확인할 수 있다. (프로젝트 단위로 비용이 발생하기 때문)
조직 노드를 생성하는 방법은 회사가 구글 워크스페이스 고객인지 여부에 따라 달려있다. 워크스페이스 사용자면 구글 클라우드가 자동으로 조직 노드를 할당해주고, 워크스페이스를 사용하지 않는다면 Cloud Identity를 통해 조직 노드를 생성할 수 있다.
워크스페이스 기존 사용자들은 조직 노드 생성과 동시에 프로젝트 생성 권한이 할당된다. 이후 폴더 생성을 통해 워크스페이스 내 사용자들에 대한 권한 관리가 가능하다.
# IAM (Identity and Access Management)
조직 노드가 많은 폴더, 프로젝트, 리소스를 보유하면 누가 어떤 곳에 접근 가능할지 제한할 필요가 있다는 것을 의미한다. 이러한 태스크를 처리하기 위해 관리자는 IAM을 활용할 수 있다. IAM을 통해 누가 어떤 리소스에 접근하여 무엇을 할 수 있는지 정의할 수 있다.
Who(Principal) → Can do what(Role) → On which Resource
- IAM 정책의 WHO: 구글 계정, 구글 그룹, 서비스 계정, Cloud Identity domain이 될 수 있다. 이를 주체(principal)라고 지칭하고 일반적으로 이메일 형식의 식별자를 갖는다.
- IAM 정책의 can do WHAT: 역할(role)로 정의된다. IAM에서 역할은 여러 권한의 묶음을 의미한다. 하나의 주체에게 역할을 부여하면 해당 역할과 관련된 권한들을 모두 승인하게 된다.
주체가 리소스 계층의(조직 노드, 폴더, 프로젝트 등) 특정 요소에서 역할을 받게 되면 하위 계층의 모든 요소에도 적용된다.
역할이 갖는 허용 권한 기본 설정과 상관없이 특정 주체에 대해서 권한을 막을 수 있다. 거부된 권한 역시 하위 계층 모든 요소에 적용된다. IAM은 허용 권한 규칙 확인 이전에 거부 권한 규칙부터 확인한다.
# IAM roles
IAM은 basic, predefined, custom 세 종류의 역할이 존재한다.
- basic: 프로젝트에 베이직 역할이 적용되면 해당 프로젝트 모든 리소스에 영향을 미칠 수 있다. 베이직 역할은
owner
,editor
,viewer
,billing administrator
를 포함한다. (해당 역할은 기본적으로 넓은 작업 범위를 커버하기 때문에 조심히 다뤄야 한다.)viewer
: 리소스 조회 권한만 갖는다.editor
: 리소스 조회 및 조작 권한을 갖는다.owner
: editor 권한에 프로젝트 내 역할 및 권한 할당, 결제 설정이 가능하다.billing administrator
: 리소스 조작 권한은 갖지 않고, 결제 설정만 가능하다.
- predefined: 사전정의 역할은 구글 클라우드에서 서비스별로 미리 정의해 제공하는 역할로, 특정 작업(권한)만 수행할 수 있도록 구성된 세분화된 권한 묶음이다.
- Compute Engine을 예로,
instanceAdmin
이라는 이름의 사전 정의 역할을 부여할 수 있다. 해당 역할은 인스턴스 삭제, 조회, 시작, 중지, 머신 타입 설정 권한들을 갖는다. 해당 권한을 조직 전체 혹은 특정 폴더의 Compute Engine 리소스에 적용 가능하다.
- Compute Engine을 예로,
- custom: 관리자가 직접 선택한 권한 세트를 갖는 역할이다.
- 많은 기업들은 최소 권한(least-privilege) 모델을 사용한다. 해당 모델은 조직 내 각 구성원에게 필요한 최소 권한만 부여하는 것을 의미한다.
- 커스텀 역할은 프로젝트 또는 조직 노드 수준에서 생성 가능하다. (폴더 레벨에서는 커스텀 역할 생성이 불가능하다. 조직 레벨에서 생성한 커스텀 역할을 폴더 레벨에 적용하는 것은 가능)
- 조직 레벨 커스텀 역할은 커스텀 역할에 지원하는 어떠한 IAM 권한이든 할당 가능하다.
- 프로젝트 레벨 커스텀 역할은 폴더 레벨 또는 조직 레벨에서 사용하는 권한 외에는 모두 할당 가능하다. (ex -
resourcemanager.organizations.get
)
# Service accounts
주기적으로 다른 클라우드 서비스에 접근해야 하는 프로그램을 GCP Compute Engine에서 수행하고 있는 경우를 생각해보자. 프로그램이 수행되는 동안 매번 해당 클라우드 서비스에 권한 허용을 요청하는 대신 해당 가상 머신이 필요한 권한들을 부여하는 게 바람직하다. 이러한 시나리오에서 service accounts
라는 개념이 필요하게 되었다.
service accounts
는 가상 머신에 특정 권한을 허용할 수 있는데, 이를 통해 사람의 개입 없이 다른 클라우드 서비스와 상호작용이 가능하다.
가상 머신에서 실행중인 어플리케이션이 구글 클라우드 스토리지에 데이터를 저장하고 싶을때, 인터넷 상의 모든 사용자에게 접근 권한을 부여하는 것이 아니라 해당 가상 머신만 접근 하능하도록 제한하고 싶은 경우 서비스 계정을 생성하면 된다. 서비스 계정 생성 후 VM이 구글 클라우드 스토리지에 인증된 방식으로 접근하도록 구성하는 것이다.
서비스 계정은 이메일 형식으로 이름이 설정되지만 패스워드는 암호화된 키를 사용한다. (my-service-account@my-project.iam.gserviceaccount.com
) 해당 서비스 계정에 권한을 부여함으로써 리소스에 제한된 역할로 접근 가능하다.
서비스 계정은 IAM에 의해 관리될 수 있는데, 이 말은 즉슨 뷰어, 에디터 등의 역할 분류를 통해 서비스 계정에 대한 제어 권한을 다르게 가질 수 있다는 것을 말한다. 이는 하나의 신원으로 사용될 수 있을 뿐 아니라 리소스로도 취급된다는 말도 된다. 서비스 계정은 현업에서도 보안 사고로 자주 발생한다고 하니 주의하자.
# Cloud Identity
조직 노드 생성과 관련해서 워크스페이스를 사용하지 않는 유저에 대해서는 Cloud Identity를 사용하면 가능하다고 언급했는데, 이와 관련된 내용이다.
구글 클라우드에 새 고객이 들어와 gmail 계정을 등록 및 로그인 후 구글 클라우드 콘솔의 Group에 다른 동료들을 추가하는 상황이다. 이러한 경우 팀 신원이 중앙 집권적으로 관리되지 않게 된다. (xxx@gmail.com
) 이러한 경우 조직을 기존 팀 동료 누군가가 떠났을 때 문제가 될 여지가 존재한다. 팀의 클라우드 리소스에 대해 접근하는 유저를 즉시 삭제하기가 어려울 수 있다.
클라우드 아이덴티티를 통해 조직은 정책을 정의하고 유저들과 그룹을 Google Admin
콘솔을 통해 쉽게 관리할 수 있다. 회사 자체 도메인을 가지면서 구글 워크스페이스를 사용하고 있지 않다면 Cloud Identity와 연동하여 ID/PW를 새로 생성하지 않으면서 기존 인증 정보를 그대로 가져갈 수 있다.
이를 통해 팀 동료가 조직을 떠났을때 권한 회수 및 유저 삭제가 쉽게 가능해진다. 워크스페이스 환경을 엔터프라이즈, 비즈니스 수준으로 사용하고 있는 경우 Cloud Identity Premium 수준 기능까지 무료로 제공된다. (비즈니스 단계는 프리미엄 기능 중 몇 가지는 제공 안될 수 있음)
# Interacting with Google Cloud
구글 클라우드와는 네 가지 방법으로 상호작용 가능하다.
- Google Cloud Console: 웹 GUI 기반으로 배포, 스케일링, 프로덕션 이슈 진단 등을 한다. 리소스 검색 및 브라우저에서 SSH를 통한 인스턴스 연결 등의 작업까지도 가능하다.
- Google Cloud SDK and Cloud Shell
- Google Cloud SDK는 리소스들과 구글 클라우드에서 호스팅되는 어플리케이션들을 관리하는데 사용하는 도구 모음집이다. 해당 SDK는 구글 클라우드 상품 및 서비스를 위한
gCloud CLI
, 빅쿼리를 위한bq
커맨드 라인 인터페이스들을 포함한다. 해당 CLI들은 SDK 설치 시 생성되는bin
하위 폴더에 모인다. - Cloud Shell은 브라우저에서 클라우드 리소스들에 직접 접근하는 커맨드 라인을 제공한다. 리눅스 Debian 배포판 기준으로 5GB 크기의 홈 디렉토리를 갖는 가상머신 위에서 동작한다. 이를 통해 구글 클라우드 프로젝트 및 리소스 관리를 쉽게 할 수 있다.
- Google Cloud SDK는 리소스들과 구글 클라우드에서 호스팅되는 어플리케이션들을 관리하는데 사용하는 도구 모음집이다. 해당 SDK는 구글 클라우드 상품 및 서비스를 위한
- APIs: 구글 클라우드 서비스들은 API를 제공하므로 직접 작성한 코드를 통해 제어 가능하다.
- 구글 클라우드 콘솔에는
Google APIs Explorer
라는 도구가 내장되어 사용자 인증이 필요한 API까지 인터랙티브 하게 테스트 가능하다. - API를 활용한 코드 작성 시
Cloud Client
,Google API Client
라이브러리를 활용하면 반복적 작업을 줄일 수 있다. (보일러 플레이트 최소화 가능)
- 구글 클라우드 콘솔에는
- Google Cloud App: 인스턴스 로그, SSH를 통한 컴퓨팅 엔진 인스턴스 연결, 구동 및 중단 등의 동작들을 할 수 있다. 배포 롤백 및 트래픽 분할까지도 가능하다. Budget 한계치에 대한 알림, 결제 정보 등 또한 제공한다. CPU 사용량 등 원하는 메트릭을 골라 커스텀 가능한 그래프를 설정할 수 있다.