GCP VM 만들기 , 연결, VM 스케쥴링

Linux OS 선택

Linux 서버 OS (배포판) 선택 가이드

Linux 서버 필요할 경우 가장 최신의 Ubuntu Server LTS (Long Term Support) 사용 (2021년 10월 현재 Ubuntu Server 20.04 LTS )

CentOS가 필요하다면 CentOS 7을 사용을 하되 2024년 6월 30일 이전에 다른 OS로 마이그레이션을 해야 함.

상용 Linux 서버가 필요한 경우 가능한 Redhat 계열의 RHEL (Red Hat Enterprise Linux) 을 선택

VM instance type 및 블록 스토리지 선택

GCP VM 및 Block storage 선택

production : N 시리즈

테스팅용 : 공유 코어 VM 중 저렴한 것 사용 (2021.8.23 기준 서울에서 가장 저렴한 VM은 N1의 f1-micro)

Block storage : 일반적인 경우 zonal balanced persistent

네트워크 서비스 등급 : 네트워크 등급을 명시적으로 선택하지 않으면 기본적으로 프리미엄 등급이 사용됩니다. https://cloud.google.com/network-tiers/docs/overview

GCP VM OS 설정

GCP VM OS 설정

공통으로 사용하는 OS 설정은 시작스크립트에 추가를 해야 함. (timezone 설정 등)

프로젝트 수준의 시작 스크립트를 추가. https://cloud.google.com/sdk/gcloud/reference/compute/project-info/add-metadata

gcloud compute project-info add-metadata \ --metadata=startup-script='#! /bin/bash timedatectl set-timezone Asia/Seoul'

 

Linux VM 만들기

VM 만들기

https://cloud.google.com/compute/docs/quickstart-linux

이름

라벨

리전 : asia-northeast3

영역 : asia-northeast3-a / asia-northeast3-b / asia-northeast3-c

머신구성 : 2021.8.23 기준 서울에서 가장 저렴한 VM은 N1의 f1-micro 임.

부팅디스크 : Ubuntu 20.0.4 LTS / CentOS7 (Rocky Linux 8도 2021.8.23 기준 보임)

ID 및 API 액세스  : 기본 액세스 허용

관리, 보안, 디스크, 네트워킹, 단독 테넌시 - 네트워크 - 네트워크 인터페이스 - default - 나와 공유된 네트워크(호스트 프로젝트) - 적절한 subnet 선택

네트워크 태그 : 방화벽에서 사용하기 위해서 필요

네트워크 인터페이스에서 외부 IP는 기본이 “임시”로 되어 있음. 이 부분을 “없음”으로 변경하고 ssh 접속 확인 필요함

 

기본 내부 IP를 선택을 할 때 임시의 경우 인스턴스를 다시 시작해도 내부 IP가 변경되지 않지만 인스턴스를 삭제하고 다시 만들면 내부 IP가 변경됨. '임시(자동)'를 선택하여 서브네트워크 범위의 주소를 할당하거나 '임시(커스텀)'를 선택하여 직접 입력할 수 있음. 인스턴스를 삭제하고 다시 만들 때 IP를 유지하려면 고정 내부 IP 주소를 선택하거나 만드세요.

 

https://cloud.google.com/compute/docs/instances/moving-instance-across-zones?hl=ko#limitations 문서 참고하여. zone 변경을 하려고 했는데 안됨.

$ gcloud compute instances move instance-2 \ --zone asia-northeast3-b --destination-zone asia-northeast3-a ERROR: (gcloud.compute.instances.move) HTTPError 400: Invalid resource usage: 'Instance is a UEFI-enabled instance and does not support MoveInstance.'.

 

Ubuntu Server 20.04 Minimal OS 의 최신 이미지는 계속 업데이트가 되기 때문에 CLI를 통해서 가져온다.

https://cloud.google.com/compute/docs/images/os-details#ubuntu_lts

 

gcloud 명령으로 VM 만들기

https://cloud.google.com/sdk/gcloud/reference/compute/instances/create

REGION="asia-northeast3" ZONE="$REGION-a" HOST_PROJECT="sample-gw-shared-vpc" SUBNET="sample-gw-was-ne3-dev-subnet" GCP_VM="gw-was-dev-1" TAGS="was" ubuntu_image=`gcloud compute images list | grep -i ubuntu-minimal-2004-lts | awk '{ print $1 }'` UBUNTU_IMAGE_PROJECT="ubuntu-os-cloud" gcloud beta compute instances create $GCP_VM \ --zone=$ZONE \ --machine-type=f1-micro \ --subnet=projects/$HOST_PROJECT/regions/$REGION/subnetworks/$SUBNET \ --no-address \ --image=$ubuntu_image \ --image-project=$UBUNTU_IMAGE_PROJECT \ --boot-disk-size=10GB \ --boot-disk-type=pd-balanced \ --boot-disk-device-name=$GCP_VM \ --reservation-affinity=any \ --tags=$TAGS

--no-adress : 외부 ip 없음

--maintenance-policy :  호스트머신이 유지보수 들어갔을 때 해당 VM에 대한 정책 설정. The default is MIGRATE

--service-account : A service account is an identity attached to the instance. Its access tokens can be accessed through the instance metadata server and are used to authenticate applications on the instance. The account can be set using an email address corresponding to the required service account.

If not provided, the instance will use the project's default service account.

지정 안하면 project 의 기본 service account로 설정을 한다고 함.

--scopes : 지정 안 하면 default 설정.

boot-disk-size 는 최소 10G 이상 되어야 함

 

service-account, scopes 는 서비스 계정 및 인스턴스의 액세스 범위와 관련한 설정임. 보안을 위해서 역할 제한을 하는 경우 사용을 함. 일부 서비스는 Cloud Storage 에 쓰기 권한이 필요해서 별도의 서비스 계정을 사용함. scopes도 함께 조정을 해줌.

 

shielded 가 들어간 설정은 보안 VM 관련한 부분임. OS별로 지원하는 것이 다를 수 있을 것임.

보안 VM 기능에는 신뢰할 수 있는 UEFI 펌웨어가 포함되며 보안 부팅, vTPM, 무결성 모니터링 옵션이 함께 제공됩니다.

 보안 VM 기능을 지원하는 이미지를 확인하려면 OS 이미지 보안 기능를 참조하세요.

보안 VM 인스턴스에서는 Compute Engine이 기본적으로 vTPM(Virtual Trusted Platform Module)과 무결성 모니터링 옵션을 사용합니다

https://cloud.google.com/compute/docs/instances/modifying-shielded-vm?hl=ko

https://cloud.google.com/security/shielded-cloud/shielded-vm?hl=ko

--no-shielded-secure-boot
--shielded-vtpm
--shielded-integrity-monitoring

 

reservation-affinity : 예약된 instance 에 대한 설정이며 기본값은 any

https://cloud.google.com/compute/docs/instances/reserving-zonal-resources

 

몇가지 기본설정 사용해도 되는 것 제외하고 정리.

gcloud 명령을 이용하여 ssh 연결을 함. 로컬의 .ssh/ 디렉토리에 ssh private, public key를 만들고 VM에 ssh public key를 자동으로 올려줌.

gcloud 로 ssh 연결을 하는 것은 아마도 사전에 IAP 에서 22 ssh port 에 대한 방화벽 설정이 있어야 연결이 될 듯 하다.

내부 DNS

https://cloud.google.com/compute/docs/internal-dns

Google Cloud의 Virtual Private Cloud 네트워크에는 동일한 네트워크의 인스턴스가 내부 DNS 이름을 사용하여 서로 액세스할 수 있게 해 주는 내부 DNS 서비스가 포함되어 있습니다. 가상 머신(VM)의 내부 A 레코드는 .internal의 DNS 영역에서 만들어집니다. 

 

VM_NAME.ZONE.c.PROJECT_ID.internal

 

VM 인스턴스의 내부 DNS 이름 확인 : metadata 이용하여 확인 가능함.

VM 조회

zone을 지정하지 않으면 첫번째 zone 으로 찾는다. 그러므로 asia-northeast3-c 에 인스턴스를 만들었다면 zone 을 지정해 주어야 한다.

VM 연결

연결방식

https://cloud.google.com/compute/docs/instances/access-overview

대부분의 경우 OS 로그인을 사용하는 것이 좋습니다. OS 로그인 기능을 사용하면 Compute Engine IAM 역할을 사용하여 Linux 인스턴스에 대한 SSH 액세스를 관리할 수 있습니다.

아직은 OS 로그인과 메타데이터에서의 SSH 키 관리 부분이 정확히 이해가는 것은 아님.

OS 로그인 설정

전체 관리자 권한을 가지고 있는 경우에는 아래 일부 설정을 하지 않아도 OS 로그인을 할 수 있다. 그런데 특정한 사용자의 VM ssh 접근 권한을 제어해야 할 경우에는 필요한 설정이다.

 https://cloud.google.com/compute/docs/instances/managing-instance-access#configure_users

  • VM 인스턴스에 최신 버전의 게스트 환경이 설치되어 있어야 합니다. 대부분의 공개 이미지에는 이미 최신 버전이 설치되어 있습니다. 최신 게스트 환경을 설치하지 않았으면 게스트 환경을 업데이트합니다. Ubuntu는 따로 설정이 필요 없었음

  • (선택사항) 조직의 OS 로그인 관리 검토

    • https://cloud.google.com/compute/docs/oslogin/manage-oslogin-in-an-org#external-user

    • 조직 외부 사용자에게 인스턴스 액세스 권한 부여 : 기본적으로 조직 외부 사용자는 조직 내 인스턴스에 SSH 키를 설정하거나 조직 내 인스턴스 접근 권한을 부여받을 수 없습니다. 그러나 다른 조직에 속한 사용자 또는 일반 사용자 Google gmail.com 계정이 있는 사용자에게 인스턴스 액세스 권한을 부여해야 하는 경우가 있을 수 있습니다. 해당 사용자에게 조직의 IAM 설정에서 Compute Engine 역할 목록에서 Compute OS 로그인 외부 사용자를 추가해 주어야 함. (roles/compute.osLoginExternalUser) → 이 부분은 테스팅 기간만 필요로 하므로 코드로 만들지 않아도 될 듯 함.

  • OS 로그인 사용 설정 

    • 인스턴스 또는 프로젝트 수준에서 메타데이터 값을 설정하여 OS 로그인을 사용 설정하거나 사용 중지할 수 있습니다. 아래는 프로젝트 수준에서 설정.

  • 사용자 계정에 OS 로그인 역할 구성

    • project 차원 또는 인스턴스(개별 VM) 별로 역할을 부여할 수 있다. 세부적으로 보안설정을 한다면 인스턴스별로 설정을 해야 한다.

    • 다음 인스턴스 액세스 역할 중 하나를 부여합니다.

    • gcloud compute instances add-iam-policy-binding 명령어를 사용하여 인스턴스 수준에서 이러한 인스턴스 액세스 역할을 부여할 수 있습니다.

이 역할을 인스턴스 별로 부여했을 경우 인스턴스 재생성 시 역할이 초기화 돼 문제가 발생할 수 있으니 인스턴스를 재생성 했을 경우 접속하고자 하는 사용자가 위 역할을 가지고 있는지 다시 확인해야 한다.

  • VM이 서비스 계정을 사용하는 경우 SSH를 사용하여 VM에 연결하는 각 사용자가 서비스 계정을 가장할 수 있습니다. 권장사항에 따라 가장하게끔 각 사용자가 서비스 계정의 roles/iam.serviceAccountUser 역할을 갖도록 구성합니다.

  • 조직 외부에 있는 사용자가 VM에 액세스하려면 인스턴스 액세스 역할을 부여하는 것 외에 roles/compute.osLoginExternalUser 역할도 부여하세요.  이 설정은 특정 project 가 아니라 조직 차원에서 설정을 하는 것임.

TCP 전달을 위한 Cloud IAP 사용

 IAP TCP 전달을 사용하여 외부 IP 주소가 없거나 인터넷을 통한 직접 액세스를 허용하지 않는 VM 인스턴스에 대한 관리 액세스를 사용 설정하는 방법에 대해 설명합니다.

사전에 Cloud IAP 설정은 모두 되어 있다는 전제하에서 진행함. https://sysadmin.atlassian.net/wiki/pages/createpage.action?spaceKey=CLOUD&title=GCP%20-%20Cloud%20IAP%20%ED%86%B5%ED%95%9C%20%EC%A0%91%EC%86%8D&linkCreation=true&fromPageId=2275836400 에 관련 문서 있음.

https://cloud.google.com/iap/docs/using-tcp-forwarding#api

IAP TCP 전달을 사용할 권한 부여

IAP TCP 전달을 사용할 수 있는 사용자 및 그룹과 연결할 수 있는 VM 인스턴스를 제어하려면 ID 및 액세스 관리(IAM) 권한을 구성하세요. 신뢰할 수 있는 관리자에게는 다음 역할을 모두 부여하는 것이 좋습니다.

문서에는 위와 같이 나와있다. 그런데 compute.instanceAdmin.v1 를 주는 것은 compute instance 에 대해서 관리자 권한을 주는 것이다.

IAP 사용을 위해서는 IAP 보안 터널 사용자 (roles/iap.tunnelResourceAccessor), roles/iam.serviceAccountUser 권한을 주면 된다. (사용자 계정에 OS 로그인 역할 구성시 roles/iam.serviceAccountUser 권한을 주었었음)

ssh 연결

https://cloud.google.com/compute/docs/instances/ssh

SSH 연결은 메타데이터 또는 OS 로그인 두가지 방식이 있으며 기본은 메타데이터 관리 SSH 연결이다. 메타데이터 관리는 임시 SSH 키 쌍을 만들어서 잠시 사용할 수 있는 방식이다. 여러 문서를 읽어보았지만 메타데이터 또는 OS 로그인에 대해서 정확히 이해가 가지는 않음. 아무튼 gcloud beta compute ssh 명령을 이용하여 Ubuntu 에서는 ssh 접근 가능.

 

공유된 네트워크를 사용하는 경우 VM 만들면서 “ALLOW HTTP traffic”을 선택할 수 없다. 호스트 프로젝트의 방화벽에서 설정이 필요하다. 해당 VM에 대한 연결-SSH-브라우저에서 열기를 처음 선택하면 접속이 안된다. 해당 VM에 대한 22 port를 모두 열어주고나서 접속이 되었다. 웹콘솔에서 22 port에 대한 접속이 필요한 것 같다. 이 부분은 접근할 수 있는 곳을 제한하는 것이 필요할 것이다.

SSH-브라우저에서 열기는 IAP를 사용하여 연결을 하는 방식으로 보인다. “IAP TCP 전달을 사용하여 외부 IP 주소가 없거나 인터넷을 통한 직접 액세스를 허용하지 않는 VM 인스턴스에 대한 관리 액세스를 사용 설정”

https://cloud.google.com/iap/docs/using-tcp-forwarding?hl=ko

35.235.240.0/20 에서 TCP  22,3389 (ssh, rdp)를 허용해 주면 된다.

 

추가 접속 방법 : https://medium.com/google-cloud-apac/gcp-ssh-%EB%A1%9C-gce-vm-%EC%A0%91%EC%86%8D%EB%B0%A9%EB%B2%95-%EC%A2%80-%EB%8D%94-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-cb37dce39f87

VM에 파일 올리기 https://cloud.google.com/compute/docs/instances/transfer-files

VM 인스턴스 시작 및 중지 일정 관리

 https://cloud.google.com/compute/docs/instances/schedule-instance-start-stop?hl=ko#gcloud

일정에 따라 stop, start 할 수 있는 기능임. 인스턴스 일정을 사용하여 업무 시간 중에만 VM 인스턴스를 실행하거나 일회성 이벤트를 위해 용량을 제공할 수 있습니다.

VM 인스턴스 일정 위한 IAM 설정

인스턴스 일정을 사용하려면 프로젝트의 Compute Engine 서비스 에이전트에 다음 권한이 있어야 합니다.

  • VM 인스턴스를 시작하도록 예약할 compute.instances.start

  • VM 인스턴스를 중지하도록 예약할 compute.instances.stop

 

Google Cloud Console에서 IAM & Admin → IAM → 역할로 이동해서 compute.instances.start, compute.instances.stop 를 할 수 있는 역할을 하나 만든다.

이제 IAM 에서 Google 제공 역할 부여 포함 을 클릭한 후 service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com 형식의 IAM을 선택하여 위에서 만든 역할을 추가해준다.

이런 설정이 없으면 기존 VM 인스턴스에 인스턴스 일정 연결시 아래와 같은 에러가 나온다. IAM 설정이 추가로 필요하다.

Compute Engine System service account service-446928390800@compute-system.iam.gserviceaccount.com needs to have [compute.instances.stop] permissions applied in order to perform this operation.

 

https://cloud.google.com/compute/docs/access/service-accounts?hl=ko#compute_engine_service_account

“이 서비스 계정의 권한을 취소하거나 변경하면 Compute Engine이 VM에서 사용자 서비스 계정의 ID에 액세스하지 못하게 되며 VM 내부에서 실행되는 소프트웨어가 중단될 수 있습니다.

따라서 이 서비스 계정의 역할을 최대한 수정하지 않는 것이 좋습니다.”

 

참고자료 : https://rominirani.com/hands-on-guide-to-scheduling-vm-instances-to-start-and-stop-a079a50e16c6

 

인스턴스 일정 만든다.

기존 VM 인스턴스에 인스턴스 일정 연결

인스턴스 일정 리소스 정책 및 연결된 VM 인스턴스에 대해 감사 로그를 확인하여 인스턴스 일정이 성공적으로 실행되는지 확인할 수 있습니다. 각 작업에 대해 일정이 잡힌 시간 후 최대 15분까지 기다려야 할 수 있습니다.