#chiroito ’s blog

Java を中心とした趣味の技術について

Oracle Cloud Infrastructure で Terraform へ入門してみた

Oracle Cloud Infrastructure (OCI) で Terraform へ入門するため準備とその確認を以下の手順でしていきます。

Oracle Cloud Infrastructure の Terraform プロバイダは、初期化時に自動的にダウンロードされるようになりました。そのため、自分でバイナリをダウンロードしてくる必要はなくなりました。

Terraform のダウンロード

Terraform はこちらからダウンロードします。

Download Terraform - Terraform by HashiCorp

OCI を使った Terraform ファイルを作成

OCI を使った Terraform ファイルは以下の 2 行を oci_test.tf として保存します。

provider "oci" {
}

Terraform の初期化

oci_test.tfファイルがあるディレクトリで terraform initを実行します。

> terraform init

Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "oci" (3.11.0)...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.oci: version = "~> 3.11"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

OCI プロバイダの実行

terraform apply で OCI プロバイダが使えるかを試してみます。以下のようになれば成功です。

> terraform apply

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

電車情報を使ったIoTリアルタイムストリーム処理

この記事はOracle Cloud Advent Calendar 2018 - Adventar」の12月22日の記事として書かれています。

今回やること

これまで仕事で散々 IoT やストリーム処理をしてきたので簡単に作ってみたいと思います。

作ってみたシステムは下図のように東京メトロさんの電車を GoogleMap に表示して、電車が今どこを走っているのかを見られるようにしてみましょう。

f:id:chiroito:20181223004925p:plain

今回、このシステムで使用する情報は電車の情報、駅の情報、路線の情報、行き先の情報です。電車の情報には、電車がどの駅とどの駅の間を走っているか、またどの駅に止まっているかが含まれていますが、電車が今いる座標は分かりません。電車から得られた情報をただ単に表示するだけでは芸が無いので、複数の情報を結合してみます。

システムの構成

システムの全体像は以下のとおりです。今回のシステムはOracleクラウドサービスである Oracle Cloud を使用して開発しています。左側がデバイスからのデータが投入される入口で、右側はユーザが情報を見る入口になります。

f:id:chiroito:20181223005552p:plain

OracleOSS

システムの全体像を見ていただくと、OSSが目に入ると思います。Oracle は昔からたくさんの OSS やそのコミュニティに対してスポンサーやコントリビュートをしており、Oracle Cloud が提供しているサービスの大半はこれらの OSS をベースにエンタープライズレベルでも使用可能なクラウドサービスを開発しています。

Data Source Layer

今回のシステムでは、電車の情報を自分のシステムに投入してもらうのは無理なので、東京メトロさんが公開している API から電車の情報を取って自分のシステムに投げるアプリを作っています(App1)。このアプリケーションは Kubernates のクラウドサービスである Oracle Container for Kubernates 上で動かします。

Ingestion Layer, Speed Layer, Storage Layer

電車の情報は、Kafka のクラウドサービスである Oracle Event Hub によって受け取ります。受け取った情報は、Hadoopクラウドサービスである Oracle Big Data Cloud Service - Compute Edtion 上で動いている Apache Spark のアプリケーションが処理します(App2) 。このアプリケーションは、電車がどの駅間を走っているかと各駅の座標情報から電車の座標を算出しています。今回は出発した駅と向かっている駅の中間点を算出してます。算出された情報は Oracle Coherence がベースとなっている Java Cloud Service 上に保存します。

このアプリケーションは GUI で Spark アプリケーションを開発できる Oracle Stream Analytics (OSA)を使って開発しました(後述)。OSAを使って開発することで、データのキャッシュや永続化などを自動的にインメモリ分散データキャッシュである Oracle Coherence へ格納・読み込みできるようになりエンタープライズなどで要求される高速なデータアクセスなどが可能となります。

Serving Layer, Visualization Layer

最後に電車を表示する側です。 Google Map のアプリケーションは定期的に電車の情報を取得して、得られた電車の情報を表示します。このアプリケーションの取得先として、時間を指定するとその時間に走っていた全ての電車の情報を先ほどの Oracle Coherence へ取りにいくアプリケーションがあります(App3)。このアプリケーションも Kubernates のクラウドサービスである Oracle Container for Kubernates 上で動きます。

Speed Layer の詳細

Spark アプリケーションの開発は Oracle Stream Analytics (OSA)を使って開発します。OSAでは、下図のような GUI を使って開発します。

f:id:chiroito:20181223011407p:plain

この図では、入力となる電車の生データに「丸ノ内線や銀座線」などの路線の情報、「荻窪行きや渋谷行き」などの行き先の情報、「西新宿駅外苑前駅の座標情報」などの駅情報を結合していきます。これらの情報は1度目はRDBMS である Exadata ベースの Autonomous Transaction Processing から読込まれますが、2度目からは Oracle Coherence から高速に読込まれます。

この例では、結合された情報を使って「稼働中の電車数」「各電車の座標」「遅延している電車数」を算出しています。これらの中で、「各電車の座標」を Oracle Coherence へ格納し、JavaScript のアプリケーションから App3 経由で情報を取りだしてGoogle Map 上に表示しています。

Oracle Cloud Infrastructure でインターネットからの通信を許可する

この記事は「Oracle Cloud その2 Advent Calendar 2018」の12月10日の記事として書かれています。

セキュリティ・リストで入力方向の通信を設定をします。

変更することは滅多に無いものの、設定画面までの遷移が非常に長いのでいざ変更しようと思うと大変です。

まずはじめに、Oracle Cloud InfrastructureのMENUからNetworking - Virtual Cloud Networksを選択します。

f:id:chiroito:20181201193744p:plain
OCI Top

次に、Virtual Cloud Network (VCN)一覧画面で、任意のVCNを選ぶと選んだVCNの詳細ページへ遷移します。

最後に、左下にあるResources内にある Security Lists を選択すると、右側にセキュリティ・リストの一覧が表示されるため、任意のセキュリティリストを選択します。

セキュリティ・リストの下の方に、クラウドへ入力方向の通信で許可する一覧が表示されます。 デフォルトでは SSH (TCP:22) と ICMP のうち限定された通信だけを許可します。

f:id:chiroito:20181201194354p:plain
Security List - Ingress Rules

ここにインターネットからTCP:9080への通信を許可するようにします。

同じ画面の↑の方にある Edit All Rulesを選択します。

f:id:chiroito:20181201194708p:plain
Security List

Edit Security List Rule のダイアログが表示されます。既に設定されているルールの下側に + Another Ingress Rule というボタンを選択し、新しいルールを入力できるようにします。

f:id:chiroito:20181201194814p:plain
Edit All Rules

ボタンを押すと、新しく 4 番目のルールの入力フォームが追加されます。以下のように全てのIP(0.0.0.0/0)からTCP:9080への通信を許可します。 入力完了後は一番下にある Save Security List Rules を選択します。

f:id:chiroito:20181201194844p:plain
Another Ingress Rule

追加した内容が以下のように一覧に反映されます。

f:id:chiroito:20181201194907p:plain
Security List