はじめに
近年、プラットフォームエンジニアリングという考え方が注目を集めています。これは、開発者が自律的かつ効率的にアプリケーションをデリバリーできるよう、共通基盤やツール群を整備し、セルフサービス型の開発体験を提供する取り組みです。AzureではAzure Deployment Environmentsというサービスを利用することで実現できます。
本記事では、Oracle Cloud Infrastructure(OCI)で同様の開発者向けのセルフサービス基盤を構築する方法を紹介します。
類似サービス
Azure Deployment Environmentsはプラットフォームチームが標準化した環境をカタログ化し、開発者がセルフサービスで利用できる仕組みを提供しています。
開発者にざっくり以下の手順で、カタログ化した環境をデプロイすることができます。
- カタログ選択
- 変数値の入力フォーム
- デプロイ
Oracle Cloud Stack
Oracle Cloud Stackを使用することで、さきほどの開発者の手順を満たすことができます。
また、開発者の権限に基づいてデプロイ先を選択可能なので、セキュリティ面で良いです。
カタログ選択
リポジトリは公開できないですが、以下のようなディレクトリ構成でterraformを組んでいます。
|-terraform/VMInfra
| |-Base # 仮想ネットワーク、NSG、ASG、Key Vault、Bastionなどの共有リソース
| |-Ubuntu # Base に接続する Ubuntu 仮想マシン
| |-Proxy # Base に接続する Ubuntu 仮想マシンによるリバースプロキシ
このリポジトリ構成をOracle Cloud Stackの「ソース・コード制御システム」という機能で同期させると、スタック作成の画面で以下のように選択が可能になります。
ソース・コード制御システムによるリポジトリ同期にはPATが必須です。
公式ドキュメントにはPersonal access tokens (classic)
の方法しか記載がないです。
Fine-grained personal access tokens
では、Contents
とDeployments
に対するRead-onlyで設定してください。また、リポジトリを制限できます。セキュリティ的にもFine-grained personal access tokens
を推奨します。
変数値の入力フォーム
Oracle Cloud Stackでは、main.tf
と同階層にschema.yaml
を配置することで入力フォームを柔軟にカスタマイズ可能です。
以下のフォームがサポートされているので、ほぼ困らないと思います。
- descriptionにURLを埋め込み
- コンパートメント
- VMイメージ
- VCN
- VCN指定後に、VCN内に配置されたサブネットを選択可能
- SSHキーのアップロード
Ubuntuの入力フォームのschema.yaml
title: "Ubuntu Virtual Machine Stack"
description: "Ubuntu VM deployment using VMInfra Base Stack outputs for networking"
stackDescription: "Creates an Ubuntu virtual machine in Oracle Cloud Infrastructure using pre-existing network infrastructure from VMInfra Base Stack."
schemaVersion: 1.1.0
version: "1.0.0"
locale: "ja"
variableGroups:
- title: "基本設定"
description: "基本設定"
variables:
- parent_compartment_id
- title: "VM設定"
description: "仮想マシンのハードウェア仕様"
variables:
- vm_name
- vm_image
- vm_shape
- vm_ocpus
- vm_memory_in_gbs
- vm_boot_volume_size_in_gbs
- title: "ネットワーク設定"
description: "ネットワーク設定"
variables:
- vcn_id
- subnet_id
- assign_public_ip
- admin_public_key
variables:
parent_compartment_id:
type: oci:identity:compartment:id
title: "親コンパートメント"
description: "親コンパートメント"
required: true
vcn_id:
type: oci:core:vcn:id
title: "VCN"
description: "対象VCNを選択"
required: true
dependsOn:
compartmentId: ${parent_compartment_id}
subnet_id:
type: oci:core:subnet:id
title: "サブネット"
description: "VM を配置するサブネット"
required: true
dependsOn:
compartmentId: ${parent_compartment_id}
vcnId: ${vcn_id}
vm_name:
type: string
title: "仮想マシン名"
description: "作成する仮想マシンの表示名"
default: "vm1"
required: true
minLength: 1
maxLength: 50
pattern: "^[a-zA-Z0-9\\-_]+$"
vm_image:
title: Image
description: "イメージ名 (<a href='https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/images.htm'>イメージについて</a>)"
type: oci:core:image:id
required: true
default: "ocid1.image.oc1.ap-tokyo-1.aaaaaaaap4f3vyddg7bznwpbxtbkwzmtcdzqnid2qwclsw2txormdozrixwa"
dependsOn:
compartmentId: ${parent_compartment_id}
operatingSystem: "Canonical Ubuntu"
operatingSystemVersion: "22.04" # 22.04に制限が可能
vm_shape:
title: Shape
description: "シェイプ名 (<a href='https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm'>シェイプについて</a>)"
type: oci:core:instanceshape:name
required: true
default: "VM.Standard.E5.Flex"
dependsOn:
compartmentId: ${parent_compartment_id}
imageId: ${vm_image}
vm_ocpus:
type: integer
title: "OCPU数"
description: "Flex Shape用のOCPU数 (1-64)"
default: 1
required: true
minimum: 1
maximum: 64
vm_memory_in_gbs:
type: integer
title: "メモリ (GB)"
description: "Flex Shape用のメモリサイズ (1-1024 GB)"
default: 2
required: true
minimum: 1
maximum: 1024
vm_boot_volume_size_in_gbs:
type: integer
title: "ブートボリュームサイズ (GB)"
description: "VMのブートボリュームサイズ (50-32768 GB)"
default: 50
required: true
minimum: 50
maximum: 32768
admin_public_key:
type: oci:core:ssh:publickey
title: "SSH 公開鍵"
description: "VM アクセス用のSSH公開鍵"
required: true
additionalProps:
allowMultiple: true
assign_public_ip:
type: boolean
title: "パブリック IP 割り当て"
description: "VMにパブリックIPアドレスを割り当てるかどうか"
default: false
required: false
primaryOutputButton: instance_private_ip
outputs:
instance_id:
type: ocid
title: "インスタンス OCID"
description: "作成されたVM インスタンスのOCID"
instance_private_ip:
type: string
title: "プライベート IP"
description: "VMのプライベートIPアドレス"
instance_public_ip:
type: string
title: "パブリック IP"
description: "VMのパブリックIPアドレス(割り当て時のみ)"
visible: ${assign_public_ip}
boot_volume_id:
type: ocid
title: "ブートボリューム OCID"
description: "VMのブートボリュームOCID"
デプロイ
前述の工程でスタックを作成すると以下の画面になります。
日本語でOCIコンソールを開けているので単語に違和感がありますが、Terraformのplanやapplyを実行するボタンがあります。
OCIコンソール(日本語) | Terraform |
---|---|
計画 | terraform plan |
適用 | terraform apply |
破棄 | terraform destroy |
適用が成功すると、デプロイしたリソースを確認することができます。また、tfstateはスタックが保持してくれるのでObject Storage等での管理は不要です。
まさに、Terraformのコマンドを実行することができる画面です。Terraform同様、デプロイが失敗した時のロールバックはありません。
まとめ
Oracle Cloud Stackを活用することで開発者はOCIの知識に成熟していなくても実現したい構成をカタログから選択し迅速にデプロイできるセルフサービスな基盤を構築できます。
また、schema.yamlによるUIカスタマイズで、入力ミスを防ぎ、ガイド付きのデプロイ体験を提供できる点も大きなメリットです。
プラットフォームチームにとっては、カタログ化による標準化とセキュリティ担保を両立できるため、開発者体験を向上させる有効な手段となります。
Terraformの操作に近いUIなので使ったことない方にとっては少々直感的でない部分はありますが、エンジニアを前提とする画面としては十分です。