Python クライアント ライブラリの使用

このドキュメントでは、Google Compute Engine の Google Python クライアント ライブラリを使用する方法を示します。ここで説明するのは、リクエストを承認する方法と、インスタンスを作成、一覧取得、削除する方法です。この演習では、google-api-python-client ライブラリを使用して Google Compute Engine リソースにアクセスします。このサンプルが正しく認証されると、サンプルをローカルマシンまたは VM インスタンスで実行できます。

他の Google クライアント ライブラリやサードパーティのオープンソース ライブラリを含む使用可能なすべてのクライアント ライブラリについては、クライアント ライブラリのページをご覧ください。

演習をスキップして完全なコード例を確認する場合は、GitHub の GoogleCloudPlatform/python-docs-samples のページをご覧ください。

目標

  • oauth2client ライブラリを使用して OAuth 2.0 認証を実行する
  • google-python-client ライブラリを使用してインスタンスを作成する
  • google-python-client ライブラリを使用してインスタンスの一覧を取得する
  • google-python-client ライブラリを使用してインスタンスを削除する

料金

このチュートリアルでは、Cloud Platform の課金対象となるコンポーネント(Compute Engine を含む)を使用しています。

Cloud Platform を初めて使用する方は、無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  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']

インスタンスの追加

インスタンスを追加するには、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-8').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 フィールドを使用してインスタンスの起動スクリプトを指定し、構成変数を Key-Value ペアとして指定しました。以下に記載されている起動スクリプトは、これらの変数を読み込んで使用し、テキストを画像に適用して 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 ドキュメント