{OCI コンピュート} L7ロードバランサー+オートスケーリング

前提: セキュリティリストで80番ポート許可したVCN作成済み


★Cloud-initスクリプト
→ Terraformの場合と同様にCLIの場合もcloud-config形式で記述する必要がある

 


-- 1. コンピュートインスタンス作成(OL9)

oci compute image list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--all \
--query 'data.{"operating-system":"operating-system","operating-system-version":"operating-system-version","display-name":"display-name"}' \
--output=table


oci compute image list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--all \
--query 'data[?"display-name"==`'Oracle-Linux-9.2-2023.12.08-0'`].id | [0]' \
--raw-output

oci compute shape list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--image-id ocid1.image.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--query 'sort_by(data, &"ocpus").{"shape":"shape","ocpus":"ocpus","memory-in-gbs":"memory-in-gbs"}' \
--output=table

 

cat <<-'EOF' > a.yaml
#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.utf8
package_update: true
packages:
  - httpd
runcmd:
  - setenforce 0
  - sed -i -e 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  - systemctl stop firewalld
  - systemctl disable firewalld
  - systemctl start httpd
  - systemctl enable httpd
  - echo $(hostname) > /var/www/html/index.html

EOF


oci compute instance launch \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--availability-domain OEIw:US-ASHBURN-AD-1 \
--subnet-id ocid1.subnet.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--assign-public-ip true \
--boot-volume-size-in-gbs 50 \
--display-name vm01 \
--fault-domain FAULT-DOMAIN-1 \
--image-id ocid1.image.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--shape VM.Standard.E2.1 \
--ssh-authorized-keys-file "$HOME/.ssh/id_rsa.pub" \
--user-data-file "./a.yaml" 

 


oci compute instance list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--query 'data.{"display-name":"display-name","id":"id","lifecycle-state":"lifecycle-state"}' \
--output table

 

oci compute instance terminate \
--instance-id ocid1.instance.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--force

 

-- 2. インスタンス構成の作成


oci compute-management instance-configuration create-from-instance \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--instance-id ocid1.instance.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--display-name ic01 

 

oci compute-management instance-configuration list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--query 'data.{"display-name":"display-name","id":"id","lifecycle-state":"lifecycle-state"}' \
--output table

oci compute-management instance-configuration get \
--instance-configuration-id ocid1.instanceconfiguration.oc1.iad.000000000000000000000000000000000000000000000000000000000000 

 


oci compute-management instance-configuration delete \
--instance-configuration-id ocid1.instanceconfiguration.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--force 

 


-- 3. インスタンス・プールの作成

 

oci compute-management instance-pool create \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--instance-configuration-id ocid1.instanceconfiguration.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--placement-configurations '[
  {
    "availability-domain": "OEIw:US-ASHBURN-AD-1",
    "fault-domains": null,
    "primary-subnet-id": null,
    "primary-vnic-subnets": {
      "ipv6-address-ipv6-subnet-cidr-pair-details": null,
      "is-assign-ipv6-ip": null,
      "subnet-id": "ocid1.subnet.oc1.iad.000000000000000000000000000000000000000000000000000000000000"
    },
    "secondary-vnic-subnets": null
  }
]' \
--size 0 \
--display-name ip01 \
--instance-display-name-formatter 'ip01insntace${launchCount}' \
--instance-hostname-formatter 'ip01insntace${launchCount}' 

 


oci compute-management instance-pool list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--query 'data.{"display-name":"display-name","id":"id","lifecycle-state":"lifecycle-state"}' \
--output table

oci compute-management instance-pool get \
--instance-pool-id ocid1.instancepool.oc1.iad.000000000000000000000000000000000000000000000000000000000000 

 


oci compute-management instance-pool terminate \
--instance-pool-id ocid1.instancepool.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--force 


-- 4. 自動スケーリング構成の作成

 

oci autoscaling configuration create \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--policies '[
  {
    "capacity": {
      "initial": 1,
      "max": 2,
      "min": 1
    },
    "display-name": "asp01",
    "is-enabled": true,
    "policy-type": "threshold",
    "rules": [
      {
        "action": {
          "type": "CHANGE_COUNT_BY",
          "value": -1
        },
        "display-name": "asp0101",
        "metric": {
          "metric-type": "CPU_UTILIZATION",
          "threshold": {
            "operator": "LT",
            "value": 30
          }
        }
      },
      {
        "action": {
          "type": "CHANGE_COUNT_BY",
          "value": 1
        },
        "display-name": "asp0102",
        "metric": {
          "metric-type": "CPU_UTILIZATION",
          "threshold": {
            "operator": "GT",
            "value": 70
          }
        }
      }
    ]
  }
]' \
--resource '{
  "id": "ocid1.instancepool.oc1.iad.000000000000000000000000000000000000000000000000000000000000",
  "type": "instancePool"
}' \
--cool-down-in-seconds 300 \
--display-name asc01 \
--is-enabled true 

 


oci autoscaling configuration list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--query 'data.{"display-name":"display-name","id":"id","lifecycle-state":"lifecycle-state"}' \
--output table

oci autoscaling configuration get \
--auto-scaling-configuration-id ocid1.autoscalingconfiguration.oc1.iad.000000000000000000000000000000000000000000000000000000000000 

 

oci autoscaling configuration delete \
--auto-scaling-configuration-id ocid1.autoscalingconfiguration.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--force 


-- 5. Load Balancer作成

oci lb shape list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 

oci lb load-balancer list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 

 

oci lb load-balancer create \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--display-name lb01 \
--shape-name flexible \
--subnet-ids '[
"ocid1.subnet.oc1.iad.000000000000000000000000000000000000000000000000000000000000"
]' \
--ip-mode IPV4 \
--is-private false \
--shape-details '{
"maximumBandwidthInMbps": 10,
"minimumBandwidthInMbps": 10
}' 

 

oci lb load-balancer list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 \
--query 'data[].{"display-name":"display-name","id":"id","lifecycle-state":"lifecycle-state"}' \
--output table


oci lb load-balancer delete \
--load-balancer-id ocid1.loadbalancer.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--force

 


-- 6. バックエンドセット作成

oci lb backend-set list \
--load-balancer-id ocid1.loadbalancer.oc1.iad.000000000000000000000000000000000000000000000000000000000000 

oci lb policy list \
--compartment-id ocid1.compartment.oc1..000000000000000000000000000000000000000000000000000000000000 

 

oci lb backend-set create \
--health-checker-protocol HTTP \
--load-balancer-id ocid1.loadbalancer.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--name bs01 \
--policy ROUND_ROBIN \
--health-checker-interval-in-ms 100000 \
--health-checker-port 80 \
--health-checker-retries 3 \
--health-checker-return-code 200 \
--health-checker-timeout-in-ms 3000 \
--health-checker-url-path "/" 


oci lb backend-set list \
--load-balancer-id ocid1.loadbalancer.oc1.iad.000000000000000000000000000000000000000000000000000000000000 

oci lb backend-set delete \
--load-balancer-id ocid1.loadbalancer.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--backend-set-name bs01 \
--force

 

-- 7. リスナー作成


oci lb listener create \
--default-backend-set-name bs01 \
--load-balancer-id ocid1.loadbalancer.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--name lis01 \
--port 80 \
--protocol HTTP

 

oci lb listener delete \
--load-balancer-id ocid1.loadbalancer.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--listener-name lis01 \
--force

 

-- 8. バックエンドセットへのインスタンス・プールのアタッチ

 

oci compute-management instance-pool attach-lb \
--backend-set-name bs01 \
--instance-pool-id ocid1.instancepool.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--load-balancer-id ocid1.loadbalancer.oc1.iad.000000000000000000000000000000000000000000000000000000000000 \
--port 80 \
--vnic-selection PrimaryVnic 

 

-- 9. 動作確認

while true; do 
curl http://192.0.2.1
sleep 1;
done

 


ssh -i $HOME/.ssh/id_rsa opc@192.0.2.2


sudo dnf repolist all | grep -i epel
sudo yum-config-manager --enable ol9_developer_EPEL
sudo dnf -y install stress

stress -c 2 &
top -c

pkill stress