GCP Python API 연동 - VM 인스턴스 만들기
AWS와 다르게 Google은 각 서비스마다 api를 다르게 다운로드 해야한다.
VM 인스턴스를 만들기위해서는 공식 서비스 명인 Compute Engine 을 사용해야 하고 다운로드는 아래처럼 하면 된다.
- 1. 일단 gcp api 다운받기
pip install virtualenv
virtualenv <your-env>
source <your-env>/bin/activate
<your-env>/bin/pip install google-cloud-compute google-api-python-client
- 2. 그 다음은 API 인증 정보가 필요하다. 아래 절차로 받으면 json파일이 나온다.
1. Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다.school나머지 단계는 Google Cloud 콘솔에 자동으로 표시됩니다.
2. 프로젝트를 선택합니다.
3. 키를 만들려는 서비스 계정의 이메일 주소를 클릭합니다.
4. 키 탭을 클릭합니다.
5. 키 추가 드롭다운 메뉴를 클릭한 후 새 키 만들기를 선택합니다.
6. 키 유형으로 JSON을 선택하고 만들기를 클릭합니다.
- 3. IAM 에서 해당 계정에 Compute 인스턴스 관리자(v1) 권한을 부여해야한다.
- https://console.cloud.google.com/iam-admin/iam
- 4. SSH 접속을 위해 키 생성을 한다. AWS처럼 키 페어를 만들어주지 않나 보다.
- 5. 그러면 .ssh 밑에 공개키가 나온다 이 값을 복사해서
- 6. compute engine -> 메타데이터 -> SSH키 -> 추가 버튼을 눌러서 등록하면 끝.
- 7. 이제 파이썬 코드를 작성하자 기초 정보를 입력해주고
import paramiko
import time
from google.oauth2 import service_account
from google.cloud import compute_v1
from googleapiclient.discovery import build
# GCP 서비스 계정 인증 정보를 포함하는 클라이언트 객체 생성
credentials = service_account.Credentials.from_service_account_file('JSON 파일 이름')
compute_client = compute_v1.InstancesClient(credentials=credentials)
# compute 라이브러리를 사용
compute = build('compute', 'v1', credentials=credentials)
#인스턴스 생성
project = 'GCP 프로젝트 이름을 입력하세요'
zone = 'asia-northeast3-a' # 한국은 요거 쓰시면됩니다.
instance_type = 'e2-medium'
instance_name = 'gold-instance-1-1'
- 8. 인스턴스의 설정을 만들고 만든다.
- projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v2023030 이 이미지는 우분투 22 LTS 이미지다.
config = {
'name': instance_name,
'machineType': f'zones/{zone}/machineTypes/{instance_type}',
'disks': [{
'boot': True,
'autoDelete': True,
'initializeParams': {
'sourceImage': f'projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v20230302',
'diskSizeGb' : 35
}
}],
'networkInterfaces': [{
'network': 'global/networks/default',
'accessConfigs': [{
'type': 'ONE_TO_ONE_NAT',
'name': 'External NAT'
}]
}]
}
instance = compute.instances().insert(project=project, zone=zone, body=config).execute()
instance_id = instance['name']
print(f'Instance {instance_id} is starting...')
여기까지가 인스턴스 생성 내용이고. 아래 부분은 생성 이후에 SSH 접속을 하여 간단한 명령을 날리는 예제이다.
- 9. 인스턴스를 만든다고 바로 사용할 수 있는 것이 아니다. 상태 체크를 하는 반복문을 추가한다.
instance = compute.instances().insert(project=project, zone=zone, body=config).execute()
instance_id = instance['name']
print(f'Instance {instance_id} is starting...')
# 인스턴스 상태를 확인합니다.
status = None
while status != 'RUNNING':
time.sleep(5)
instance = compute.instances().get(
project=project,
zone=zone,
instance=instance_name).execute()
status = instance['status']
print(f'Instance status: {status}')
print('Instance is running')
- 10. 인스턴스가 다 켜졌다면 접속하기 위한 공인 ip를 불러오자
instance = compute.instances().get(project=project, zone=zone, instance=instance_name).execute()
network_interface = instance['networkInterfaces'][0]
access_config = network_interface['accessConfigs'][0]
public_ip = access_config['natIP']
print(f'Instance Public IP is {public_ip}')
- 11. SSH 연결을 해서 ls -al 결과를 불러보자.
max_retries = 5
retry_delay = 5
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Connect with retry
for retry_count in range(max_retries):
try:
ssh.connect(hostname=public_ip, username='gold', key_filename='아까 만든 Private 키 경로')
break
except :
print(f'Failed to connect to {public_ip} Retrying in {retry_delay} seconds...')
time.sleep(retry_delay)
stdin, stdout, stderr = ssh.exec_command('ls -al')
result = stdout.read().decode()
# 결과 출력
print(result)
stdin, stdout, stderr = ssh.exec_command('ls -al')
result = stdout.read().decode()
# 결과 출력
print(result)
# SSH 연결 종료
ssh.close()
생성부터 명령어 입력까지 이어서 실행하면 이렇게 된다.
- 12. 삭제하고싶다면
# 인스턴스 삭제
operation = compute.instances().delete(
project=project,
zone=zone,
instance=instance_name).execute()
print(f'Instance deletion initiated: {operation["name"]}')
끝.