OCI Console Cloud Shellから実行するPythonスクリプトの書き方 (2020/04/15)
OCI Console Cloud Shellから実行するPythonスクリプトの書き方 (2020/04/15)
投稿者:Stephen Cross
この記事は、Oracle Cloud Infrastructure のすべてのインスタンスとその IP アドレスを一覧表示する方法を尋ねる Reddit の質問に部分的に触発されたものです。
これにアプローチする 1 つの方法は、OCI Python-SDK でシンプルな Python スクリプトを使用することですが、私は、OCI コンソールから Cloud Shell で直接これを実行する方法を見つけ、スクリプトの実行に必要な追加設定を最小限に抑えたいと思いました。
OCI コンソールから Cloud Shell を起動すると、OCI CLI や Python SDK を含む多くの一般的なツールやユーティリティがプリインストールされた端末環境が提供されます。
Cloud Shellで実行する Python スクリプトを書くとき、シェルの既存の認証を利用することができ、外部環境からスクリプトを実行するときに通常必要な個別の API キーを手動で構成するステップを回避することができます。これを行うには、シェル内で既存のインスタンス原理委任トークンをロードして、APIリクエストサイナーを作成します。
#!/usr/bin/env python import oci # get the cloud shell delegated authentication token
delegation_token = open('/etc/oci/delegation_token', 'r').read() # create the api request signer
signer = oci.auth.signers.InstancePrincipalsDelegationTokenSigner(
delegation_token=delegation_token
)
この署名は、例えば検索クライアントを作成するために、通常の構成設定の代わりに空のディクショナリを渡して、認証クライアントを作成するために使用されます。
# create an authenticated api client
search_client = oci.resource_search.ResourceSearchClient(
config={},
signer=signer
)
この検索クライアントで、現在のリージョンにあるすべてのインスタンスを検索できるようになりました。
ヒント:デフォルトのホームリージョン以外のリージョンを対象にする必要がある場合は、 config={"region": "ca-toronto-1"} と設定することができます。
# search for all instances
resp = search_client.search_resources(
oci.resource_search.models.StructuredSearchDetails(
type="Structured",
query="query instance resources"
)
)
インスタンスに関する追加の詳細情報を照会し、IPアドレスを取得するために、コンピュートとネットワークリソース用の2つのAPIクライアントが追加で必要です。
compute_client = oci.core.ComputeClient({},signer=signer)
network_client = oci.core.VirtualNetworkClient({},signer=signer)
最後に、各インスタンスのIPアドレスを取得するために、そのインスタンスのすべてのvnicアタッチメントを照会し、各vnicについて、そのパブリックおよびプライベートIPアドレスを出力することができます。
for instance in resp.data.items:
# for each instance get its vnic attachments
resp = compute_client.list_vnic_attachments(
compartment_id=instance.compartment_id,
instance_id=instance.identifier
) for vnic_attachment in resp.data:
# for each vnic get the vnic details
vnic = network_client.get_vnic(vnic_attachment.vnic_id).data
# print tab separated list of instances and ips
print("\t".join([
instance.display_name,
vnic.display_name,
vnic.private_ip,
vnic.public_ip
]))
以下は、Cloud Shellターミナルウィンドウの list-instance-ips.py ファイルにコピーできる完全なスクリプトです。
#!/usr/bin/env pythonimport ocidelegation_token = open('/etc/oci/delegation_token', 'r').read()
signer = oci.auth.signers.InstancePrincipalsDelegationTokenSigner(
delegation_token=delegation_token
)search_client = oci.resource_search.ResourceSearchClient({},signer=signer)
compute_client = oci.core.ComputeClient({},signer=signer)
network_client = oci.core.VirtualNetworkClient({},signer=signer)resp = search_client.search_resources(
oci.resource_search.models.StructuredSearchDetails(
type="Structured",
query="query instance resources"
)
)for instance in resp.data.items:
resp = compute_client.list_vnic_attachments(
compartment_id=instance.compartment_id,
instance_id=instance.identifier
) for vnic_attachment in resp.data:
vnic = network_client.get_vnic(vnic_attachment.vnic_id).data
print("\t".join([
instance.display_name,
vnic.display_name,
vnic.private_ip,
vnic.public_ip
]))
そして、このスクリプトを実行した例です。現在、私の無料アカウントでは1つのインスタンスしか起動していないため、出力は特に興味深いものではありませんが、アイデアを得ることができます。
その他の情報
- OCI Python-SDK
- Cloud Shell
- インスタンスプリンシパル - インスタンスからサービスを呼び出す
注意 - Free Tier のユーザーは、アカウントに含まれるサービスに変更が生じる可能性があります。
コメント
コメントを投稿