Python 클라이언트 라이브러리 사용

이 문서는 Google Compute Engine용 Google Python 클라이언트 라이브러리를 사용하는 방법을 보여줍니다. 여기에서는 요청을 승인하는 방법과 인스턴스를 생성, 나열, 삭제하는 방법을 설명합니다. 이 연습에서는 google-api-python-client 라이브러리를 사용하여 Google Compute Engine 리소스에 액세스하는 방법을 다룹니다. 샘플을 바르게 승인한 경우 로컬 머신 또는 VM 인스턴스에서 이 샘플을 실행할 수 있습니다.

다른 Google 클라이언트 라이브러리 및 제3자 오픈소스 라이브러리를 포함하여 사용 가능한 클라이언트 라이브러리의 전체 목록을 보려면 클라이언트 라이브러리 페이지를 참조하세요.

연습 과정을 건너뛰고 전체 코드 예제를 보려면 GoogleCloudPlatform/python-docs-samples GitHub 페이지를 방문하세요.

목표

  • oauth2client 라이브러리를 사용하여 OAuth 2.0 승인 수행
  • google-python-client 라이브러리를 사용하여 인스턴스 만들기
  • google-python-client 라이브러리를 사용하여 인스턴스 나열
  • google-python-client 라이브러리를 사용하여 인스턴스 삭제

비용

이 가이드에서는 Compute Engine 등 비용이 청구될 수 있는 Cloud Platform 구성요소를 사용합니다.

Cloud Platform 신규 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google 계정에 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Google Cloud Platform 프로젝트를 선택하거나 만듭니다.

    리소스 관리 페이지로 이동

  3. Google Cloud Platform 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

  4. Cloud SDK를 설치합니다.
  5. 일단 설치되면 gcloud auth application-default login을 실행합니다.
  6. google-api-python-client 라이브러리를 설치합니다. 일반적으로 다음을 수행할 수 있습니다.
    $ pip install --upgrade google-api-python-client

    이 라이브러리 설치 방법에 대한 자세한 내용은 설치 안내를 참조하세요. 또한 Google Python 클라이언트 라이브러리를 실행하려면 Python 2.7 또는 3.3 이상이 필요합니다.

  7. Google Cloud Storage API를 사용하도록 설정합니다.
  8. 저장소 버킷을 만들고 나중에 사용할 수 있게 버킷 이름을 적어둡니다.

요청 승인

이 샘플은 OAuth 2.0 승인을 사용합니다. OAuth 2.0을 사용하여 요청을 승인하는 방법에는 여러 가지가 있지만 예에서는 애플리케이션 기본 사용자 인증 정보를 사용하게 됩니다. 이렇게 하면 로컬 워크스테이션에서 샘플을 실행하는 경우에는 gcloud 도구의 사용자 인증 정보를 다시 사용할 수 있고, Compute Engine 또는 App Engine에서 샘플을 실행하는 경우에는 서비스 계정에서 사용자 인증 정보를 다시 사용할 수 있습니다. 시작하기 전에 섹션의 gcloud 도구를 설치하고 승인한 상태여야 합니다.

애플리케이션 기본 사용자 인증 정보는 Google API 클라이언트 라이브러리에 자동으로 제공됩니다. API만 빌드하고 초기화하면 됩니다.

compute = googleapiclient.discovery.build('compute', 'v1')

예를 들어 다음 스니펫은 API를 빌드하고 초기화한 후 인스턴스를 생성, 나열, 삭제하기 위한 호출을 수행하는 이 샘플의 주요 메소드입니다.

def main(project, bucket, zone, instance_name, wait=True):
    compute = googleapiclient.discovery.build('compute', 'v1')

    print('Creating instance.')

    operation = create_instance(compute, project, zone, instance_name, bucket)
    wait_for_operation(compute, project, zone, operation['name'])

    instances = list_instances(compute, project, zone)

    print('Instances in project %s and zone %s:' % (project, zone))
    for instance in instances:
        print(' - ' + instance['name'])

    print("""
Instance created.
It will take a minute or two for the instance to complete work.
Check this URL: http://storage.googleapis.com/{}/output.png
Once the image is uploaded press enter to delete the instance.
""".format(bucket))

    if wait:
        input()

    print('Deleting instance.')

    operation = delete_instance(compute, project, zone, instance_name)
    wait_for_operation(compute, project, zone, operation['name'])

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('project_id', help='Your Google Cloud project ID.')
    parser.add_argument(
        'bucket_name', help='Your Google Cloud Storage bucket name.')
    parser.add_argument(
        '--zone',
        default='us-central1-f',
        help='Compute Engine zone to deploy to.')
    parser.add_argument(
        '--name', default='demo-instance', help='New instance name.')

    args = parser.parse_args()

    main(args.project_id, args.bucket_name, args.zone, args.name)

인스턴스 나열

Python 클라이언트 라이브러리에서 compute.instances().list 메소드를 사용하여 인스턴스를 나열할 수 있습니다. 인스턴스를 나열할 프로젝트 ID 및 영역을 제공해야 합니다. 예를 들면 다음과 같습니다.

def list_instances(compute, project, zone):
    result = compute.instances().list(project=project, zone=zone).execute()
    return result['items'] if 'items' in result else None

인스턴스 추가

인스턴스를 추가하려면 instances().insert 메서드를 사용하고 새 인스턴스의 속성을 지정합니다. 이러한 속성은 요청 본문에서 지정됩니다. 각 속성에 대한 자세한 내용은 instances.insert에 대한 API 참조를 참조하세요.

새 인스턴스를 만들 때는 요청에 최소한 다음과 같은 속성 값을 제공해야 합니다.

  • 인스턴스 이름
  • 루트 영구 디스크
  • 머신 유형
  • 영역
  • 네트워크 인터페이스

이 샘플은 선택한 영역에서 다음 속성을 사용하여 인스턴스를 시작합니다.

  • 머신 유형: n1-standard-1
  • 루트 영구 디스크: 최신 Debian 8 이미지를 기반으로 하는 새 영구 디스크
  • 다음 범위를 갖는 Compute Engine 기본 서비스 계정

    • https://www.googleapis.com/auth/devstorage.read_write - 인스턴스가 Google Cloud Storage에서 파일을 읽고 쓸 수 있도록 허용
    • https://www.googleapis.com/auth/logging.write - 인스턴스 로그가 Google Cloud Logging에 업로드되도록 허용
  • 인스턴스가 시작 시 실행해야 하는 명령어를 지정하는 메타데이터

def create_instance(compute, project, zone, name, bucket):
    # Get the latest Debian Jessie image.
    image_response = compute.images().getFromFamily(
        project='debian-cloud', family='debian-9').execute()
    source_disk_image = image_response['selfLink']

    # Configure the machine
    machine_type = "zones/%s/machineTypes/n1-standard-1" % zone
    startup_script = open(
        os.path.join(
            os.path.dirname(__file__), 'startup-script.sh'), 'r').read()
    image_url = "http://storage.googleapis.com/gce-demo-input/photo.jpg"
    image_caption = "Ready for dessert?"

    config = {
        'name': name,
        'machineType': machine_type,

        # Specify the boot disk and the image to use as a source.
        'disks': [
            {
                'boot': True,
                'autoDelete': True,
                'initializeParams': {
                    'sourceImage': source_disk_image,
                }
            }
        ],

        # Specify a network interface with NAT to access the public
        # internet.
        'networkInterfaces': [{
            'network': 'global/networks/default',
            'accessConfigs': [
                {'type': 'ONE_TO_ONE_NAT', 'name': 'External NAT'}
            ]
        }],

        # Allow the instance to access cloud storage and logging.
        'serviceAccounts': [{
            'email': 'default',
            'scopes': [
                'https://www.googleapis.com/auth/devstorage.read_write',
                'https://www.googleapis.com/auth/logging.write'
            ]
        }],

        # Metadata is readable from the instance and allows you to
        # pass configuration from deployment scripts to instances.
        'metadata': {
            'items': [{
                # Startup script is automatically executed by the
                # instance upon startup.
                'key': 'startup-script',
                'value': startup_script
            }, {
                'key': 'url',
                'value': image_url
            }, {
                'key': 'text',
                'value': image_caption
            }, {
                'key': 'bucket',
                'value': bucket
            }]
        }
    }

    return compute.instances().insert(
        project=project,
        zone=zone,
        body=config).execute()

다음 섹션에서는 인스턴스 생성 매개변수에 대해 설명합니다.

루트 영구 디스크

모든 인스턴스는 루트 영구 디스크에서 부팅해야 합니다. 루트 영구 디스크에는 인스턴스를 시작하는 데 필요한 모든 파일이 들어 있습니다. 루트 영구 디스크를 만들 때 디스크에 적용되어야 하는 소스 OS 이미지를 지정해야 합니다. 위 예에서는 인스턴스와 동시에 Debian 8을 기준으로 새 루트 영구 디스크를 만들었습니다. 하지만 디스크를 미리 만든 후 인스턴스에 연결할 수도 있습니다.

인스턴스 메타데이터

인스턴스를 만들 때 시작 스크립트, 구성 변수 및 ssh 키와 같은 인스턴스 메타데이터를 포함할 수 있습니다. 위 예시에서는 요청 본문에 metadata 필드를 사용하여 인스턴스의 시작 스크립트를 지정하고 일부 구성 변수를 키/값 쌍으로 지정했습니다. 아래에 나열된 시작 스크립트는 이러한 변수를 읽고 사용하여 이미지에 텍스트를 적용한 후 Google Cloud Storage에 업로드하는 방법을 보여줍니다.

apt-get update
apt-get -y install imagemagick

# Use the metadata server to get the configuration specified during
# instance creation. Read more about metadata here:
# https://cloud.google.com/compute/docs/metadata#querying
IMAGE_URL=$(curl http://metadata/computeMetadata/v1/instance/attributes/url -H "Metadata-Flavor: Google")
TEXT=$(curl http://metadata/computeMetadata/v1/instance/attributes/text -H "Metadata-Flavor: Google")
CS_BUCKET=$(curl http://metadata/computeMetadata/v1/instance/attributes/bucket -H "Metadata-Flavor: Google")

mkdir image-output
cd image-output
wget $IMAGE_URL
convert * -pointsize 30 -fill white -stroke black -gravity center -annotate +10+40 "$TEXT" output.png

# Create a Google Cloud Storage bucket.
gsutil mb gs://$CS_BUCKET

# Store the image in the Google Cloud Storage bucket and allow all users
# to read it.
gsutil cp -a public-read output.png gs://$CS_BUCKET/output.png

인스턴스 삭제

인스턴스를 삭제하려면 instances().delete 메소드를 호출하고 삭제할 인스턴스의 이름, 영역 및 프로젝트 ID를 제공해야 합니다. 부팅 디스크에 대해 autoDelete 매개변수를 설정했으므로 인스턴스가 삭제될 때 해당 부팅 디스크도 삭제됩니다. 이 설정은 기본적으로 해제되어 있지만 사용 사례에서 디스크와 인스턴스를 함께 삭제해야 하는 경우에 유용합니다.

def delete_instance(compute, project, zone, name):
    return compute.instances().delete(
        project=project,
        zone=zone,
        instance=name).execute()

샘플 실행

코드를 다운로드하고 명령줄에서 실행하여 전체 샘플을 실행할 수 있습니다. create_instance.py 파일과 startup-script.sh 파일을 다운로드했는지 확인합니다. 샘플을 실행하는 방법은 다음과 같습니다.

python create_instance.py --name [INSTANCE_NAME] --zone [ZONE] [PROJECT_ID] [CLOUD_STORAGE_BUCKET]

각 항목의 의미는 다음과 같습니다.

  • [INSTANCE_NAME]은 만들 인스턴스의 이름입니다.
  • [ZONE]은 이 요청에서 원하는 영역입니다.
  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [CLOUD_STORAGE_BUCKET]은 초기에 설정한 버킷 이름에서 gs:// 프리픽스를 제외한 것입니다.

예를 들면 다음과 같습니다.

python python-example.py --name example-instance --zone us-central1-a example-project my-gcs-bucket

작업이 완료될 때까지 대기

인스턴스와 같은 리소스를 수정하는 Google Compute Engine API에 대한 요청 시 승인 응답이 즉시 반환됩니다. 이러한 승인을 통해 요청된 작업의 상태를 확인할 수 있습니다. 작업을 완료하는 데는 몇 분 정도 소요되므로 계속하기 전에 작업이 완료될 때까지 기다리는 것이 더 쉬운 경우가 많습니다. 이 도우미 메소드는 작업이 완료되어 반환될 때까지 기다립니다.

def wait_for_operation(compute, project, zone, operation):
    print('Waiting for operation to finish...')
    while True:
        result = compute.zoneOperations().get(
            project=project,
            zone=zone,
            operation=operation).execute()

        if result['status'] == 'DONE':
            print("done.")
            if 'error' in result:
                raise Exception(result['error'])
            return result

        time.sleep(1)

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

Cloud Storage 버킷 삭제

Cloud Storage 버킷을 삭제하는 방법은 다음과 같습니다.

  1. GCP Console에서 Cloud Storage 브라우저 페이지로 이동합니다.

    Cloud Storage 브라우저 페이지로 이동

  2. 삭제할 버킷 옆의 체크박스를 클릭합니다.
  3. 페이지 상단의 삭제 삭제를 클릭하여 버킷을 삭제합니다.

다음 단계

  • 전체 코드 샘플을 다운로드하고 확인합니다. 전체 샘플에는 이러한 모든 메소드를 함께 사용하는 방법에 대한 작은 예가 포함되어 있습니다. 다운로드한 후 필요에 맞게 변경하여 실행하세요.
  • API 참조를 검토하여 API로 다른 작업을 수행하는 방법을 알아보세요.
  • 나만의 애플리케이션 만들기를 시작해 보세요.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Compute Engine 문서