1. 概要
このラボでは、コンテナ化された環境で Python アプリケーションを開発するソフトウェア エンジニア向けに、開発ワークフローを効率化するための特長と機能を紹介します。一般的なコンテナ開発では、ユーザーがコンテナの詳細とコンテナのビルドプロセスを理解する必要があります。さらに、デベロッパーは通常、作業の中断を余儀なくされ、IDE から離れてリモート環境でアプリケーションのテストやデバッグを行う必要もあります。このチュートリアルで説明するツールとテクノロジーを使用すると、デベロッパーは IDE を離れることなく、コンテナ化されたアプリケーションを効果的に操作できます。
Cloud Workstations とは
Cloud Workstations は、組み込みのセキュリティ機能と事前構成済みかつカスタマイズ可能な開発環境を備えた、Google Cloud 上のマネージド開発環境を提供します。Cloud Workstations には、ブラウザベースの IDE、複数のローカル コードエディタ(VSCode や JetBrains IDE(IntelliJ IDEA Ultimate や PyCharm Professional など)など)、または SSH 経由でアクセスできます。
Cloud Workstations は次のリソースを使用します。
- 管理者がワークステーション クラスタを作成する
- 管理者は、各ワークステーション クラスタで、ワークステーションのテンプレートとして機能する 1 つ以上のワークステーション構成を作成します。
- 開発者はワークステーションを作成して開発環境を定義し、クラウド IDE、言語ツール、ライブラリなどを提供できます。
Cloud Workstations を使用すると、IT およびセキュリティ管理者は開発環境を簡単にプロビジョニング、スケール、管理、保護できます。また、デベロッパーは一貫した構成とカスタマイズ可能なツールを使用して開発環境にアクセスできます。
Cloud Workstations は、アプリケーション開発環境のセキュリティ ポスチャーを強化することで、セキュリティのシフトレフトを支援します。VPC Service Controls、限定公開の上り(内向き)または下り(外向き)トラフィック、イメージの強制更新、Identity and Access Management のアクセス ポリシーなどのセキュリティ機能を備えています。
Cloud Code とは
Cloud Code は、サンプル テンプレートからの新しいアプリケーションの作成とカスタマイズから完成したアプリケーションの実行まで、Kubernetes と Cloud Run アプリケーションの開発サイクル全体を IDE でサポートします。Cloud Code は、すぐに実行できるサンプル、すぐに使える構成スニペット、カスタマイズされたデバッグ エクスペリエンスなど、作業の道のりをサポートします。そのため、Kubernetes と Cloud Run を使用した開発がはるかに簡単になります。
Cloud Code の機能の一部を以下に示します。
- アプリケーションを継続的に構築して実行
- 開発中の Kubernetes アプリケーションのデバッグ サポート
- ログのストリーミングと表示
Cloud Code のその他の機能の詳細を確認する。
学習内容
このラボでは、GCP でコンテナを使用して開発するための次のような方法について学びます。
- Cloud Workstations を確認する
- ワークステーションを起動
- Cloud Code の確認
- Kubernetes でのデバッグ
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。
- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この値はいつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常、それが何であるかは関係ありません。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常は
PROJECT_ID
として識別されます)。生成された ID が気に入らない場合は、別のランダムな ID を生成できます。または、ご自身でお試しになることもできます。このステップを終えた後は変更できず、プロジェクト期間中は維持されます。 - なお、3 つ目の値は、一部の API で使用される [プロジェクト番号] です。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に課金が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
環境設定
Cloud Shell で、プロジェクトのプロジェクト ID とプロジェクト番号を設定します。これらを PROJECT_ID
変数と PROJECT_ID
変数として保存します。
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
このラボでは、GKE にコードをデプロイします。また、IDE としてクラウド ワークステーションも使用します。
以下の設定スクリプトは、このインフラストラクチャを準備します。
- 設定スクリプトをダウンロードして、実行可能にします。
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
setup_with_cw.sh
ファイルを開き、現在 CHANGEME に設定されているパスワードの値を編集します- 設定スクリプトを実行して、このラボで使用する GKE クラスタを起動します。この設定には約 20 分かかります。
./setup_with_cw.sh &
- Cloud コンソールで Cloud Workstations を開きます。クラスタが
READY
ステータスになるまで待ってから、次のステップに進みます。 - Cloud Shell セッションが切断された場合は、[再接続] をクリックします。gcloud cli コマンドを実行してプロジェクト ID を設定しますコマンドを実行する前に、以下のサンプル プロジェクト ID を Qwiklabs プロジェクト ID に置き換えてください。
gcloud config set project qwiklabs-gcp-project-id
- 以下のスクリプトをダウンロードしてターミナルで実行し、Cloud Workstations 構成を作成します。
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh
Cloud Workstations クラスタと構成
Cloud コンソールで Cloud Workstations を開きます。クラスタのステータスが READY
であることを確認します。
既存の構成のステータスを確認します。
新しいワークステーションを作成します。
名前を my-workstation
に変更し、既存の構成(codeoss-python
)を選択します。
ワークステーションを起動
- ワークステーションを起動して起動します。ワークステーションが起動するまでに少し時間がかかります。
- アドレスバーのアイコンをクリックして、サードパーティ Cookie を許可します。
- [サイトが動作していない場合] をクリックします。
- [Cookie を許可] をクリックします。
- ワークステーションを起動すると、Code OSS IDE が表示されます。
[完了マークを付ける] をクリックしますワークステーションの IDE では
3. Cloud Code の概要
Cloud Code で利用可能なさまざまなセクションを確認します。
- Kubernetes の開発。IDE 内で完全に統合された Kubernetes 開発環境とデバッグ環境を利用できます。IDE 内で直接クラスタを作成して管理できます。
- 実行中のアプリケーションをデバッグする。Cloud Code for VS Code と Cloud Code for IntelliJ を使用して IDE 内のコードをデバッグするには、組み込みの IDE デバッグ機能を使用します。
- デプロイメントを確認する。Kubernetes クラスタと Cloud Run サービスの基礎となるリソースとメタデータを表示します。説明の取得、ログの表示、Secret の管理、ターミナルの Pod への直接の取得を行うことができます。
- Kubernetes ローカル開発を簡素化します。Cloud Code for IDE は、Skaffold、Jib、kubectl などの一般的なツールを使用して、コードに対する継続的なフィードバックをリアルタイムで提供します。
Google Cloud にログインする
- Cloud Code アイコンをクリックし、[Sign in to Google Cloud] を選択します。
- [ログインに進む] をクリックします。
- ターミナルで出力を確認し、リンクを開きます。
- Qwiklabs の受講者用認証情報でログインします。
- [許可] を選択:
- 確認コードをコピーして、[ワークステーション] タブに戻ります。
- 確認コードを貼り付けて、Enter キーを押します。
[許可] をクリックします。このメッセージが表示された場合は、コピーしてワークステーションに貼り付けることができます。
4. 新しい Python スターター アプリケーションを作成する
このセクションでは、新しい Python アプリケーションを作成します。
- 新しいターミナルを開きます。
- 新しいディレクトリを作成し、ワークスペースとして開きます。
mkdir music-service && cd music-service
code-oss-cloud-workstations -r --folder-uri="$PWD"
requirements.txt
というファイルを作成し、次の内容をコピーします。
Flask
gunicorn
ptvsd==4.3.2
app.py
という名前のファイルを作成し、次のコードを貼り付けます。
import os
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/")
def hello_world():
message="Hello, World!"
return message
if __name__ == '__main__':
server_port = os.environ.get('PORT', '8080')
app.run(debug=False, port=server_port, host='0.0.0.0')
Dockerfile
という名前のファイルを作成し、次のコードを貼り付けます。
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]
注: FLASK_DEBUG=1 を使用すると、コードの変更を Python Flask アプリに自動的に再読み込みできます。この Dockerfile を使用すると、この値をビルド引数として渡すことができます。
マニフェストを生成する
ターミナルで次のコマンドを実行して、デフォルトの skaffold.yaml
と deployment.yaml
を生成します。
- 次のコマンドを使用して Skaffold を初期化する
skaffold init --generate-manifests
メッセージが表示されたら、矢印キーでカーソルを動かし、Space キーを使用してオプションを選択します。
次のいずれかを選択:
- ポートに対する
8080
y
: 構成を保存する
Skaffold 構成を更新する
- デフォルトのアプリケーション名を変更する
skaffold.yaml
を開きます。- 現在
dockerfile-image
として設定されているイメージ名を選択します - 右クリックして [すべてのオカレンスを変更] を選択します。
- 新しい名前として「
python-app
」と入力します。 - build セクションをさらに編集し、
docker.buildArgs
を追加してFLASK_DEBUG=1
を渡す- 設定を同期して、IDE から実行中のコンテナに
*.py
ファイルへの変更を読み込みます
編集後、skaffold.yaml
ファイルのビルド セクションは次のようになります。
build:
artifacts:
- image: python-app
docker:
buildArgs:
FLASK_DEBUG: "1"
dockerfile: Dockerfile
sync:
infer:
- '**/*.py'
Kubernetes 構成ファイルを変更する
- デフォルトの名前を変更する
deployment.yaml
ファイルを開く- 現在
dockerfile-image
として設定されているイメージ名を選択します - 右クリックして [すべてのオカレンスを変更] を選択します。
- 新しい名前として「
python-app
」と入力します。
5. 開発プロセスの説明
これで、ビジネス ロジックが追加されたので、アプリケーションのデプロイとテストができるようになりました。次のセクションでは、Cloud Code プラグインの使用方法を紹介します。特に、このプラグインは skaffold と統合され、開発プロセスを効率化できます。次の手順で GKE にデプロイすると、Cloud Code と Skaffold がコンテナ イメージを自動的にビルドして Container Registry に push し、your
アプリケーションを GKE にデプロイします。この処理はバックグラウンドで行われ、デベロッパー フローでは詳細が抽象化されます。
Kubernetes クラスタを追加
- クラスタを追加する
- Google Kubernetes Engine を選択します。
- プロジェクトを選択します。
- [python-cluster] を選択します。初期セットアップで作成された すべてのジョブに適用されます
- Cloud Code の Kubernetes クラスタリストにクラスタが表示されます。ここからクラスタを操作、探索します。
Kubernetes へのデプロイ
- Cloud Shell エディタの下部にあるペインで、[Cloud Code] を選択します。
- 上部に表示されるパネルで、[Run on Kubernetes] を選択します。
プロンプトが表示されたら、[はい] を選択して現在の Kubernetes コンテキストを使用します。
このコマンドは、ソースコードのビルドを開始し、テストを実行します。ビルドとテストの実行には数分かかります。これらのテストには、単体テストと、デプロイ環境用に設定されているルールをチェックする検証ステップが含まれます。この検証ステップはすでに構成されているため、開発環境で作業している場合でも、デプロイの問題に関する警告が表示されます。
- コマンドを初めて実行すると、画面の上部に現在の Kubernetes コンテキストが必要かどうかを尋ねるプロンプトが表示されます。[はい] を選択します。現在のコンテキストを受け入れて使用します。
- 次に、使用する Container Registry を尋ねるプロンプトが表示されます。Enter キーを押して、指定されたデフォルト値を受け入れます。
- [出力] を選択します。Tab キーを押して進行状況と通知を表示します。プルダウンで [Kubernetes: Run/Debug] を選択します。
- [Kubernetes: Run/Debug - Detailed] を選択します。右側のチャネル プルダウンから、追加の詳細情報や、コンテナからライブ ストリーミングされるログを確認できます。
ビルドとテストが完了すると、[出力] タブのログの [Kubernetes: Run/Debug] に URL http://localhost: 8080 が表示されます。表示されます。
- Cloud Code ターミナルで、出力の最初の URL(http://localhost:8080)にカーソルを合わせ、表示されたツールチップで [Open Web Preview] を選択します。
- 新しいブラウザタブが開き、「
Hello, World!
」というメッセージが表示されます。
ホットリロード
app.py
ファイルを開きます。- 応答メッセージを「
Hello from Python
」に変更します
すぐに、Output
ウィンドウの Kubernetes: Run/Debug
ビューで、ウォッチャーが更新されたファイルを Kubernetes のコンテナと同期します。
Update initiated Build started for artifact python-app Build completed for artifact python-app Deploy started Deploy completed Status check started Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress Resource deployment/python-app status updated to In Progress Resource deployment/python-app status completed successfully Status check succeeded ...
Kubernetes: Run/Debug - Detailed
ビューに切り替えると、ファイルの変更を認識し、アプリをビルドして再デプロイします。
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
- 前に表示したブラウザタブを更新して、更新された結果を確認します。
デバッグ
- デバッグビューに移動し、現在のスレッド
を停止します。必要に応じて、実行後にクリーンアップすることもできます。
- 下部のメニューで
Cloud Code
をクリックし、Debug on Kubernetes
を選択して、アプリをdebug
モードで実行します。
Output
ウィンドウのKubernetes Run/Debug - Detailed
ビューで、skaffold がこのアプリケーションをデバッグモードでデプロイします。
- 初回実行時には、ソースがコンテナ内のどこにあるかを尋ねるプロンプトが表示されます。この値は、Dockerfile 内のディレクトリに関連付けられています。
Enter キーを押して、デフォルトを受け入れます。
アプリケーションのビルドとデプロイには数分かかります。デバッグ セッションが切断された場合は、「Kubernetes でデバッグする」の手順を再実行します。「Development Sessions」の。
- プロセスが完了したとき。デバッガが接続され、[出力] タブに
Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully.
と表示され、URL http://localhost:8080 が表示されています。
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
- 下部のステータスバーの色が青からオレンジ色に変わり、デバッグモードになっていることを示します。
Kubernetes Run/Debug
ビューで、Debuggable コンテナが開始されていることを確認します。
**************URLs***************** Forwarded URL from service python-app: http://localhost:8080 Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default) Update succeeded ***********************************
ブレークポイントの活用
app.py
ファイルを開きます。- 「
return message
」というステートメントを見つけます。 - 行番号の左側にある空白スペースをクリックして、その行にブレークポイントを追加します。ブレークポイントが設定されたことを示す赤いインジケーターが表示される
- ブラウザを再読み込みすると、デバッガがブレークポイントでプロセスを停止し、GKE でリモートで実行されているアプリケーションの変数と状態を調査できるようになります。
- クリックして [変数] セクションまで移動します。
- [Locals] をクリックして、
"message"
変数を見つけます。 - 変数名「message」をダブルクリックします。ポップアップで、値を
"Greetings from Python"
など別のものに変更します。 - デバッグ用コントロール パネルの [続行] ボタンをクリックします。
- ブラウザでレスポンスを確認します。入力した値が更新されています。
- 「Debug」と表示モードに切り替えるには停止ボタン
を押します。ブレークポイントをもう一度クリックすると、ブレークポイントを削除できます。
6. クリーンアップ
これで、このラボでは、新しい Python アプリケーションをゼロから作成し、コンテナと効果的に連携するように構成しました。その後、従来のアプリケーション スタックで見られるのと同じデベロッパー フローに従って、アプリケーションをリモート GKE クラスタにデプロイし、デバッグしました。
ラボの完了後にクリーンアップするには:
- ラボで使用したファイルを削除する
cd ~ && rm -rf ~/music-service
- プロジェクトを削除して、関連するすべてのインフラストラクチャとリソースを削除する
—
最終更新日: 2023 年 3 月 22 日