Oracle Cloud Infrastructure の OCI CLI を使って Always Free のインスタンスを作ってみた


私個人の考え方として、OCI に Always Free という無料枠がある事は知っていても、使ってみない事には知っている事にはならないと思っています。そこで実際に何がどうなっているのか OCI CLI を通してインスタンスを作成し OCI の仕組みを勉強してみました。

まずは https://oracle-japan.github.io/ocitutorials/intermediates/using-cli/ を参考に OCI CLI が設定済みの前提から始めます。

OCI CLI のバージョンを確認します。

$ oci --version
3.22.1

OCI で作成するリソースの表示名の先頭を prefix 変数としてセットし、プレフィックス文字列として使用します。

prefix=mnrst

仮想クラウド・ネットワークを作成します。

vcnid=$(oci network vcn create 
  --cidr-block 172.16.0.0/16 
  --display-name ${prefix}-vcn 
  --query data.id 
  --raw-output)

インターネット・ゲートウェイを作成します。

igwid=$(oci network internet-gateway create 
  --is-enabled true 
  --vcn-id $vcnid 
  --display-name ${prefix}-igw 
  --query data.id 
  --raw-output)

ルートテーブルの ID を取得します。

rtid=$(oci network vcn get 
  --vcn-id $vcnid 
  --query 'data."default-route-table-id"' 
  --raw-output)

ルートテーブルにインターネット・ゲートウェイを設定します。

oci network route-table update 
  --rt-id $rtid 
  --force 
  --route-rules '[
    {
      "cidrBlock":"0.0.0.0/0",
      "networkEntityId":"'$igwid'"
    }
  ]'

セキュリティリストの ID を取得します。

slid=$(oci network vcn get 
  --vcn-id $vcnid 
  --query 'data."default-security-list-id"' 
  --raw-output)

セキュリティリストに自分のパブリック IP アドレスからの SSH 接続とプライベート IP アドレス内の通信を全て許可する設定を追加します。

oci network security-list update 
  --security-list-id $slid 
  --force 
  --ingress-security-rules '[
    {
      "description": null,
      "icmp-options": null,
      "is-stateless": false,
      "protocol": "6",
      "source": "'$(curl -s inet-ip.info)'/32",
      "source-type": "CIDR_BLOCK",
      "tcp-options": {
        "destination-port-range": {
          "max": 22,
          "min": 22
        },
        "source-port-range": null
      },
      "udp-options": null
    },
    {
      "description": null,
      "icmp-options": {
        "code": 4,
        "type": 3
      },
      "is-stateless": false,
      "protocol": "1",
      "source": "0.0.0.0/0",
      "source-type": "CIDR_BLOCK",
      "tcp-options": null,
      "udp-options": null
    },
    {
      "description": null,
      "icmp-options": {
        "code": null,
        "type": 3
      },
      "is-stateless": false,
      "protocol": "1",
      "source": "172.16.0.0/16",
      "source-type": "CIDR_BLOCK",
      "tcp-options": null,
      "udp-options": null
    },
    {
      "description": null,
      "icmp-options": null,
      "is-stateless": false,
      "protocol": "all",
      "source": "172.16.0.0/16",
      "source-type": "CIDR_BLOCK",
      "tcp-options": null,
      "udp-options": null
    }
  ]'

仮想クラウド・ネットワークにサブネットを追加します。

subnetid=$(oci network subnet create 
  --cidr-block 172.16.0.0/24 
  --vcn-id $vcnid 
  --display-name ${prefix}-subnet 
  --query data.id 
  --raw-output)

OS イメージを探します。

oci compute image list 
  --all 
  --query 'data[*].{"operating-system":"operating-system","operating-system-version":"operating-system-version","display-name":"display-name"}' 
  --output=table

OS イメージ名から ID を取得します。

imageid=$(oci compute image list 
  --display-name Canonical-Ubuntu-22.04-Minimal-2022.11.05-0 
  --query data[0].id 
  --raw-output)

インスタンスのシェイプ(仮想マシンの種類のようなもの)を探します。

oci compute shape list 
  --image-id $imageid 
  --query data[].shape

可用性ドメインを取得します。

adname=$(oci iam availability-domain list 
  --query data[0].name 
  --raw-output)

インスタンスを作成します。

instanceid=$(oci compute instance launch 
  --display-name ${prefix}-vm1 
  --availability-domain $adname 
  --image-id $imageid 
  --shape VM.Standard.E2.1.Micro 
  --ssh-authorized-keys-file "$HOME/.ssh/id_rsa.pub" 
  --subnet-id $subnetid 
  --assign-public-ip true 
  --query data.id 
  --raw-output)

インスタンスのパブリック IP アドレスを取得します。

publicip=$(oci compute instance list-vnics 
  --instance-id $instanceid 
  --query 'data[0]."public-ip"' 
  --raw-output)

インスタンスに SSH 接続します。

ssh ubuntu@$publicip
まとめると、

  • 仮想クラウド・ネットワーク作成
  • インターネット・ゲートウェイ作成
  • ルートテーブルにインターネット・ゲートウェイを追加
  • セキュリティリストの SSH が全世界にフルオープンなので自分の接続元 IP アドレスに変更
  • 仮想クラウド・ネットワークにサブネットを追加
  • インスタンスの OS イメージとシェイプと可用性ドメインを指定して作成
  • インスタンスのパブリック IP アドレスを取得して SSH 接続
  • という流れでした。

    ブログを読んで頂きありがとうございます。誰かの何かの参考になれば幸いです。

    タグ: ,