3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python SDKを使ってOCIのダッシュボードで遊ぼう!

Last updated at Posted at 2025-06-22

一発ネタ。だけと使い方によっては有用かも!?

事の始まり

CloudWatchのダッシュボード&Lambda関数で遊ぶQiita記事を見て、OCIでもできないかなーと、OCIコンソールのダッシュボード機能を調べていて、残念ながらLambda相当であるOCI Functionsは呼べなかったけど、なんか遊べそうな感じだったので、試してみました。

どこが遊べそうなの?

これっすよ、これ。
image.png

今日の運勢とか表示させるようにしたら、楽しいと思いません?

事前準備

OCI Functionsで実装も可能ですが、実装に時間がかかるので、今回はコンピュート上でスクリプト動かして更新します。

まずは認可設定

インスタンス・プリンシパル、好きなんです。まずは動的グループ設定で対象のインスタンスのOCIDを指定。

OCI-Dashboard-Dynamic-Group
All {instance.id = 'ocid1.instance.oc1.ap-toky-1.(省略)'}

次にIAMポリシー。ステートメント数を減らしたい人は、use dashboards-familyで良いと思います。

OCI-Dashboard-SDK-Policy
Allow dynamic-group OCI-Dashboard-Dynamic-Group to read dashboards-family in tenancy
Allow dynamic-group OCI-Dashboard-Dynamic-Group to use dashboards in tenancy

ダッシュボードを書き換えるための仕様確認

見るのはこの辺ですね。

OCI CLIを使ってデータの詳細を確認します。export OCI_CLI_AUTH=instance_principalしておけば、コマンド実行時に毎回指定が不要になります。

OCIコンソールからはどうも対象のダッシュボードのOCIDが確認できないようなのですが、URLを見ればわかります。だいたいこんな感じになってます。後ろのOCIDがダッシュボードのOCIDになります。

https://cloud.oracle.com/dashboard/group/ocid1.consoledashboardgroup.oc1..XXX/dashboards/ocid1.consoledashboard.oc1..XXX?region=ap-tokyo-1

では、ダッシュボードの詳細を確認しましょう。

[opc@test-compute1 ~]$ oci dashboard-service dashboard get --dashboard-id ocid1.consoledashboard.oc1..XXX
{
  "data": {
(省略)
    "widgets": [
      {
        "data": {
          "dataSource": "Markdown",
          "staticWidgetData": {
            "text": "* これはテストです\n* これは2行目です"
          }
        },
        "id": "Markdown_XXX",
(省略)

ほほう。widgetsリストの中からidで対象のwidgetを探して、text書き換えれば行けそうですな。

それではスクリプト作成!

一応、元Ruby使いなのですが、サンプルはPythonの方が多いので、Pythonで。XXXの部分は上で確認したIDに変更してください。

せっかくなので、if-matchを使って更新の重複を防ごうと思ったら、意外に参考になるドキュメントがなくてびっくり。

change_markdown_widget.py
import oci

signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()
dashboard_id="ocid1.consoledashboard.oc1..XXX"
markdown_id="Markdown_XXX"

# ダッシュボードの情報を取得
dashboard_service_client = oci.dashboard_service.DashboardClient(config={'region': signer.region}, signer=signer)

get_dashboard_response = dashboard_service_client.get_dashboard(
        dashboard_id= dashboard_id
        )

# 該当のwidgetsを検索
data = get_dashboard_response.data
widgets_num = 0

for num in range(len(data.widgets)):
    if data.widgets[num]['id'] == markdown_id :
       widgets_num = num

# textを変更
data.widgets[widgets_num]['data']['staticWidgetData']['text'] = "更新したいテキストをここに"

# ダッシュボードを更新
update_dashboard_response = dashboard_service_client.update_dashboard(
        dashboard_id = dashboard_id,
        if_match = get_dashboard_response.headers['ETag'],
        update_dashboard_details = oci.dashboard_service.models.UpdateV1DashboardDetails(
            widgets = data.widgets
            )
        )

注意点

スクリプトを使って更新しても、表示は変わりません。リフレッシュボタンを押してもダメ、編集ボタンを押しても前のテキストが残ったままだったりします。ページをリロードするか、ダッシュボードを切り替えましょう。

おまけ

せっかくなので、こんなスクリプトも作って、文字列を生成AIに作ってもらいました。

generate_cheerful_message.py
import locale
import datetime
from google import genai

locale.setlocale(locale.LC_TIME,'ja_JP.UTF-8')
today = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9),'JST'))

client = genai.Client(api_key="XXX")

response = client.models.generate_content(
        model = "gemini-2.5-flash",
        contents = "今は{}の{}時です。あなたはチアリーダーです。働いている人に対して、やさしい応援の言葉を一文で作成してください。".format(today.strftime("%A"),today.hour)
)

print(response.text)

別スクリプトにしたのは、import ocifrom google import genaiがクラス重複?して動かなかったからですね。まあ、この方がいろいろカスタマイズしやすそう。

image.png

うん。ばっちり!元のスクリプトをcronとかで定期的に動かしておけば、都度メッセージが切り替わります。

これでOCIコンソールにログインするのが楽しくなるかも☆

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?