[Oracle Cloud]oci cli とShell でiSCSIでアタッチされたブロック・ボリュームへの接続するコマンド生成してみた (2025/06/05)

# はじめに
OCI Computeにブロック・ボリュームをアタッチする際、ボリューム・アタッチメント・タイプとして「iSCSI」を選択した場合、ボリュームを使用可能にするために、インスタンスからボリュームを接続してマウントする必要があります。Linux OSにアタッチする場合は、iscsiadmツールを使用してボリュームを登録などを行います。コマンドはOCI Webコンソールで確認可能ですが、今回は、oci cliを使ってiscsiadmツールを使用するコマンドを生成してみました。

# 前提条件

- Oracle Linux 8 で稼働するOCI Computeインスタンス
- Computeインスタンスにoci cliをインストールとセットアップ
- iSCSIでブロック・ボリュームをアタッチ

# ボリューム接続に必要な情報

ボリュームを接続するには、次の情報で、それらを oci cli で取得します

- iSCSI IPアドレス
- iSCSIポート番号
- CHAP資格証明(CHAPを有効にした場合)
- IQN

# 作業ステップ

1. ComputeインスタンスのOCIDの取得
1. インスタンスにアタッチされているブロック・ボリュームのOCIDを取得
1. ボリューム接続に必要な情報
1. iSCSIコマンド生成
1. /etc/fstab の通りにマウント

# Shell スクリプトの生成

```bash
#!/bin/bash

# コンパートメントOCIDのセット
COMPARTMENT_ID="ocid1.compartment.oc1..aaaaaaaa"
# ホスト名の取得
OCIHOST=$(hostname)

# 1. インスタンスのOCIDを取得
INSTANCE_OCID=$(oci compute instance list \
  --compartment-id $COMPARTMENT_ID \
  --display-name $OCIHOST \
  --lifecycle-state RUNNING \
  --profile default \
  --query "data[0].id" \
  --raw-output)

echo "Instance OCID: $INSTANCE_OCID"

# 2. インスタンスにアタッチされているBlock VolumeのOCIDを取得
# アタッチされているブロック・ボリュームの１つ目のみ対応

VOLUME_ATTACHMENT_OCID=$(oci compute volume-attachment list \
  --compartment-id $COMPARTMENT_ID \
  --instance-id $INSTANCE_OCID \
  --profile default \
  --query "data[0].id" \
  --raw-output)

echo "ATTACHMENT OCID: $VOLUME_ATTACHMENT_OCID"

# 3. ボリューム接続に必要な情報

ISCSI_IP=$(oci compute volume-attachment get \
  --volume-attachment-id $VOLUME_ATTACHMENT_OCID \
  --profile default \
  --query "data.ipv4" \
  --raw-output)

ISCSI_IQN=$(oci compute volume-attachment get \
  --volume-attachment-id $VOLUME_ATTACHMENT_OCID \
  --profile default \
  --query "data.iqn" \
  --raw-output)

ISCSI_PORT=$(oci compute volume-attachment get \
  --volume-attachment-id $VOLUME_ATTACHMENT_OCID \
  --profile default \
  --query "data.port" \
  --raw-output)

# 4. iSCSIコマンド生成
echo "sudo iscsiadm -m node -o new -T $ISCSI_IQN -p $ISCSI_IP:$ISCSI_PORT"
echo "sudo iscsiadm -m node -o update -T $ISCSI_IQN -n node.startup -v automatic"
echo "sudo iscsiadm -m node -T $ISCSI_IQN -p $ISCSI_IP:$ISCSI_PORT --login"
sudo iscsiadm -m node -o new -T $ISCSI_IQN -p $ISCSI_IP:$ISCSI_PORT
sudo iscsiadm -m node -o update -T $ISCSI_IQN -n node.startup -v automatic
sudo iscsiadm -m node -T $ISCSI_IQN -p $ISCSI_IP:$ISCSI_PORT --login"

# 5. ファイルシステムのマウント
sudo mount -a
```

# ボリュームからの切断
接続と同じように切断のコマンドも生成可能です。

```bash
#!/bin/bash

# コンパートメントOCIDのセット
COMPARTMENT_ID="ocid1.compartment.oc1..aaaaaaaa"
# ホスト名の取得
OCIHOST=$(hostname)

# 1. インスタンスのOCIDを取得
INSTANCE_OCID=$(oci compute instance list \
  --compartment-id $COMPARTMENT_ID \
  --display-name $OCIHOST \
  --lifecycle-state RUNNING \
  --profile default \
  --query "data[0].id" \
  --raw-output)

echo "Instance OCID: $INSTANCE_OCID"

# 2. インスタンスにアタッチされているBlock VolumeのOCIDを取得
# アタッチされているブロック・ボリュームの１つ目のみ対応

VOLUME_ATTACHMENT_OCID=$(oci compute volume-attachment list \
  --compartment-id $COMPARTMENT_ID \
  --instance-id $INSTANCE_OCID \
  --profile default \
  --query "data[0].id" \
  --raw-output)

echo "ATTACHMENT OCID: $VOLUME_ATTACHMENT_OCID"

# 3. ボリューム接続に必要な情報

ISCSI_IP=$(oci compute volume-attachment get \
  --volume-attachment-id $VOLUME_ATTACHMENT_OCID \
  --profile default \
  --query "data.ipv4" \
  --raw-output)

ISCSI_IQN=$(oci compute volume-attachment get \
  --volume-attachment-id $VOLUME_ATTACHMENT_OCID \
  --profile default \
  --query "data.iqn" \
  --raw-output)

ISCSI_PORT=$(oci compute volume-attachment get \
  --volume-attachment-id $VOLUME_ATTACHMENT_OCID \
  --profile default \
  --query "data.port" \
  --raw-output)

# 4. iSCSIコマンド生成
echo "iqn= $ISCSI_IQN -p $ISCSI_IP:$ISCSI_PORT"
echo "sudo iscsiadm -m node -T $ISCSI_IQN -p $ISCSI_IP:$ISCSI_PORT -u"
echo "sudo iscsiadm -m node -o delete -T $ISCSI_IQN -p $ISCSI_IP:$ISCSI_PORT"

# 5. ファイルシステムのアンマウントと切断コマンドの実行
sudo umount /mnt/bv1
sudo iscsiadm -m node -T $ISCSI_IQN -p $ISCSI_IP:$ISCSI_PORT -u
sudo iscsiadm -m node -o delete -T $ISCSI_IQN -p $ISCSI_IP:$ISCSI_PORT
```

# おわりに

Shellスクリプトでブロック・ボリュームへの接続操作ができるようになりました。

# 参考情報

- [iSCSIでアタッチされたブロック・ボリュームへの接続](https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/connectingtoavolume_topic-Connecting_to_iSCSIAttached_Volumes.htm#top)
- [ボリュームからの切断](https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/disconnectingfromavolume.htm)
- [Oracleチュートリアル ブロック・ボリュームをインスタンスにアタッチする](https://oracle-japan.github.io/ocitutorials/beginners/attaching-block-volume/)