[OCI] リソース・マネージャにOracle Cloud Development Kitがプリインストールされたサンプルが提供されたのでデプロイしてみた


# はじめに
リソース・マネージャにOCI CLI、各種SDK（Java、Python、Go）を含むOracle Cloud Development Kitがプリインストールされたサンプルが提供されたので、そちらをつかって開発環境をデプロイしてみました。

何から伝えればいいのかわからないまま時が流れてしまいましたが、どのようなコンポーネントが作成されるのか、どのようなモジュールがインストールされるのかを確認しました。

# 作業の流れ
1. リソース・マネージャのスタックの作成
2. リソース・マネージャのスタックからデプロイ
3. 作成されたコンポーネントの確認
4. インストールされているモジュールの確認

# 1. リソース・マネージャのスタックの作成
「コンソール・メニュー」→「リソース・マネージャ」→「スタック」

「スタックの作成」をクリックします。
![スクリーンショット 2020-11-16 11.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/be7b5fa1-3c9c-f485-d2e2-cc8ed661491f.png)
「サンプル・ソリューション」を選択し、「スタック構成」欄の「ソリューションの選択」をクリックします。
![スクリーンショット 2020-11-16 11.08.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5cd4efc3-a0d2-401c-c0f2-ae4df509f898.png)
「アーキテクチャ」タブの「Oracle Cloud Development Kit」を選択し、「ソリューションの選択」をクリックします。
![スクリーンショット 2020-11-16 11.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0de2cfee-7adf-8027-c36f-34ee2fe65fa7.png)
任意の名前を入力し、「次」をクリックします。
![スクリーンショット 2020-11-16 11.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6d71e069-1741-dcb6-8a46-72e60522c4ad.png)
任意のインスタンスシェイプを選択し、「次」をクリックします。
「コンピュート・インスタンスですべてのリソースにテナンシ・レベルでアクセス」のチェックをオンにしておくと、インスタンス・プリンシパルのための動的グループとポリシーが自動的に作成されます。
![スクリーンショット 2020-11-16 11.09.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/67b1f3e6-6376-c482-6eb5-89cd8d9ca3d7.png)
確認画面の内容を確認し、内容に問題がなければ「作成」をクリックします。
![スクリーンショット 2020-11-16 11.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6f808321-e6db-1a26-c41e-1f7b686f05d6.png)
スタックが作成されました。
![スクリーンショット 2020-11-16 11.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d9ad3b82-79f4-20bb-2b52-eb0df977c545.png)


# 2. リソース・マネージャのスタックからデプロイ
スタックが作成できたので、こちらを適用してデプロイします。
「Terraformアクション」内の「適用」をクリックします。
![スクリーンショット 2020-11-16 11.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/cd48f318-f056-e402-7995-4654f66a54e1.png)
ウィザードが表示されるので、任意の適用ジョブ名を入力し、「適用」をクリックします、
![スクリーンショット 2020-11-16 11.10.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f1e4f3b7-7a11-acf2-dc38-90db3fabb6ac.png)
ジョブの実行中は処理が進むごとにログが表示され、実行状況を確認できます。
成功と表示されれば、デプロイは完了です。
![スクリーンショット 2020-11-16 11.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/543f5d32-41db-ffcc-588a-3a23a94ab219.png)


# 3. 作成されたコンポーネントの確認

スタックで作成されたコンポーネントを確認するために、ジョブのログの内容を確認します。
（わかりやすくするために、一部順番を入れ替えています。）

Terraformの初期化

```
Initializing modules...
- compute in modules/compute
- network in modules/network
Initializing provider plugins...
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.null: version = "~> 2.1"
*provider.oci: version = "~> 4.3"
*provider.tls: version = "~> 2.0"
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.
module.compute.data.oci_identity_availability_domains.ads: Refreshing state...
module.compute.data.oci_core_images.this: Refreshing state...
module.compute.data.oci_identity_compartment.this: Refreshing state...
```
キーペアの作成

```
module.compute.tls_private_key.ssh_keypair: Creating...
module.compute.tls_private_key.ssh_keypair: Creation complete after 0s [id=56f04974edef1b1778a73eec7f5acb923fa1cf9f]
```
VCNの作成

```
module.network.oci_core_vcn.this: Creating...
module.network.oci_core_vcn.this: Creation complete after 0s [id=ocid1.vcn.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
```
インターネット・ゲートウェイの作成

```
module.network.oci_core_internet_gateway.ig: Creating...
module.network.oci_core_internet_gateway.ig: Creation complete after 1s [id=ocid1.internetgateway.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
```
セキュリティ・リストの作成

```
module.network.oci_core_security_list.sl: Creating...
module.network.oci_core_security_list.sl: Creation complete after 1s [id=ocid1.securitylist.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
```
ネットワーク・セキュリティ・グループの作成

```
module.compute.oci_core_network_security_group.nsg: Creating...
module.compute.oci_core_network_security_group.nsg: Creation complete after 1s [id=ocid1.networksecuritygroup.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
```
ルート表の作成

```
module.network.oci_core_route_table.rt: Creating...
module.network.oci_core_route_table.rt: Creation complete after 0s [id=ocid1.routetable.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
```
ネットワーク・セキュリティ・グループへのセキュリティ・ルールの追加

```
module.compute.oci_core_network_security_group_security_rule.ingress_icmp_3_4: Creating...
module.compute.oci_core_network_security_group_security_rule.ingress_icmp_3_4: Creation complete after 0s [id=9A1305]
module.compute.oci_core_network_security_group_security_rule.ingress_icmp_3: Creating...
module.compute.oci_core_network_security_group_security_rule.ingress_icmp_3: Creation complete after 1s [id=00400E]
module.compute.oci_core_network_security_group_security_rule.ingress_ssh: Creating...
module.compute.oci_core_network_security_group_security_rule.ingress_ssh: Creation complete after 0s [id=BB030A]
module.compute.oci_core_network_security_group_security_rule.egress: Creating...
module.compute.oci_core_network_security_group_security_rule.egress: Creation complete after 0s [id=8B5001]
```
サブネットの作成

```
module.network.oci_core_subnet.regional_sn: Creating...
module.network.oci_core_subnet.regional_sn: Creation complete after 4s [id=ocid1.subnet.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
```
コンピュート・インスタンスの作成

```
module.compute.oci_core_instance.dev_tools: Creating...
module.compute.oci_core_instance.dev_tools: Still creating... [10s elapsed]
module.compute.oci_core_instance.dev_tools: Still creating... [20s elapsed]
module.compute.oci_core_instance.dev_tools: Still creating... [30s elapsed]
module.compute.oci_core_instance.dev_tools: Still creating... [40s elapsed]
module.compute.oci_core_instance.dev_tools: Still creating... [50s elapsed]
module.compute.oci_core_instance.dev_tools: Still creating... [1m0s elapsed]
module.compute.oci_core_instance.dev_tools: Creation complete after 1m7s [id=ocid1.instance.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
```
動的グループの作成

```
module.compute.oci_identity_dynamic_group.for_instance: Creating...
module.compute.oci_identity_dynamic_group.for_instance: Creation complete after 0s [id=ocid1.dynamicgroup.oc1..aXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
```
ポリシーの作成

```
module.compute.oci_identity_policy.dg_manage_all: Creating...
module.compute.oci_identity_policy.dg_manage_all: Creation complete after 0s [id=ocid1.policy.oc1..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
```
SSHでの接続確認

```
module.compute.null_resource.remote-exec: Creating...
module.compute.null_resource.remote-exec: Provisioning with 'remote-exec'...
module.compute.null_resource.remote-exec (remote-exec): Connecting to remote host via SSH...
module.compute.null_resource.remote-exec (remote-exec):   Host: xxx.xxx.xxx.xxx
module.compute.null_resource.remote-exec (remote-exec):   User: opc
module.compute.null_resource.remote-exec (remote-exec):   Password: false
module.compute.null_resource.remote-exec (remote-exec):   Private key: true
module.compute.null_resource.remote-exec (remote-exec):   Certificate: false
module.compute.null_resource.remote-exec (remote-exec):   SSH Agent: false
module.compute.null_resource.remote-exec (remote-exec):   Checking Host Key: false
module.compute.null_resource.remote-exec (remote-exec): Connecting to remote host via SSH...
module.compute.null_resource.remote-exec (remote-exec):   Host: xxx.xxx.xxx.xxx
module.compute.null_resource.remote-exec (remote-exec):   User: opc
module.compute.null_resource.remote-exec (remote-exec):   Password: false
module.compute.null_resource.remote-exec (remote-exec):   Private key: true
module.compute.null_resource.remote-exec (remote-exec):   Certificate: false
module.compute.null_resource.remote-exec (remote-exec):   SSH Agent: false
module.compute.null_resource.remote-exec (remote-exec):   Checking Host Key: false
module.compute.null_resource.remote-exec: Still creating... [10s elapsed]
module.compute.null_resource.remote-exec (remote-exec): Connecting to remote host via SSH...
module.compute.null_resource.remote-exec (remote-exec):   Host: xxx.xxx.xxx.xxx
module.compute.null_resource.remote-exec (remote-exec):   User: opc
module.compute.null_resource.remote-exec (remote-exec):   Password: false
module.compute.null_resource.remote-exec (remote-exec):   Private key: true
module.compute.null_resource.remote-exec (remote-exec):   Certificate: false
module.compute.null_resource.remote-exec (remote-exec):   SSH Agent: false
module.compute.null_resource.remote-exec (remote-exec):   Checking Host Key: false
module.compute.null_resource.remote-exec (remote-exec): Connecting to remote host via SSH...
module.compute.null_resource.remote-exec (remote-exec):   Host: xxx.xxx.xxx.xxx
module.compute.null_resource.remote-exec (remote-exec):   User: opc
module.compute.null_resource.remote-exec (remote-exec):   Password: false
module.compute.null_resource.remote-exec (remote-exec):   Private key: true
module.compute.null_resource.remote-exec (remote-exec):   Certificate: false
module.compute.null_resource.remote-exec (remote-exec):   SSH Agent: false
module.compute.null_resource.remote-exec (remote-exec):   Checking Host Key: false
module.compute.null_resource.remote-exec: Still creating... [20s elapsed]
module.compute.null_resource.remote-exec (remote-exec): Connecting to remote host via SSH...
module.compute.null_resource.remote-exec (remote-exec):   Host: xxx.xxx.xxx.xxx
module.compute.null_resource.remote-exec (remote-exec):   User: opc
module.compute.null_resource.remote-exec (remote-exec):   Password: false
module.compute.null_resource.remote-exec (remote-exec):   Private key: true
module.compute.null_resource.remote-exec (remote-exec):   Certificate: false
module.compute.null_resource.remote-exec (remote-exec):   SSH Agent: false
module.compute.null_resource.remote-exec (remote-exec):   Checking Host Key: false
module.compute.null_resource.remote-exec (remote-exec): Connected!
module.compute.null_resource.remote-exec: Creation complete after 23s [id=6499544683093114641]
```
デプロイの完了

```
Apply complete! Resources: 15 added, 0 changed, 0 destroyed.
Outputs:
compartment_id = ocid1.compartment.oc1..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
compute_instance_public_ip = xxx.xxx.xxx.xxx
generated_instance_ssh_private_key = -----BEGIN RSA PRIVATE KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
　　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　・
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ==
-----END RSA PRIVATE KEY----- 
```
次にコンパートメント・エクスプローラで確認してみます。
ログに表示されていたコンポーネントのうち、動的グループとポリシー以外が表示されています。
![スクリーンショット 2020-11-16 13.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/bcf8f34e-c746-bcc5-f456-7ed513a1b2f6.png)

動的グループとポリシーはコンパートメント・エクスプローラでは確認できませんので、個別に確認します。

・動的グループ
「コンソール・メニュー」→「アイデンティティ」→「動的グループ」
![スクリーンショット 2020-11-16 13.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6e0b4057-126c-947b-3699-b92be118f0b9.png)
スタックで作成されたインスタンスのOCIDを含むルールが設定されています。
![スクリーンショット 2020-11-16 13.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/c01cc762-e33b-b645-cd18-a146d31e44dc.png)

・ポリシー
「コンソール・メニュー」→「アイデンティティ」→「ポリシー」
テナントレベルのポリシーになりますので、rootコンパートメントのポリシーを確認します。
![スクリーンショット 2020-11-16 13.31.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1a9f782d-ba02-a3c4-857d-f55c4bdda4c4.png)
動的グループに対して、テナント内のすべてのリソースの管理を許可しています。
これにより、動的グループに含まれるインスタンスからは、テナント内のすべてのリソースを操作することが可能になります（インスタンス・プリンシパル）。
![スクリーンショット 2020-11-16 13.31.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/87520d7a-8ebb-4d46-dc07-15d72398699a.png)
コンパートメント・エクスプローラに表示されている各コンポーネントについて確認してみます。
**・仮想クラウド・ネットワーク（VCN）**
oci-dev-tools-vcnという名前のVCNがCIDR 10.0.0.0/16で作成されています。
![スクリーンショット 2020-11-16 13.38.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/bb179fc6-abb0-677c-7b28-50857ba5789c.png)
**・インターネット・ゲートウェイ**
oci-dev-tools-internet-gatewayという名前のインターネット・ゲートウェイが作成されています。
![スクリーンショット 2020-11-16 13.38.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/01d478d6-7b89-ed60-e4f9-4ce9aeb5eced.png)
**・ルート表**
oci-dev-tools-route-tableという名前のルート表が作成され、0.0.0.0/0宛のトラフィックをインターネット・ゲートウェイにルーティングするルート・ルールが設定されています。
なお、VCNのデフォルトのルート表にはルート・ルールが設定されていません。
![スクリーンショット 2020-11-16 13.39.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d3b3dda4-2ca2-724c-aaf0-5cca792117dd.png)
![スクリーンショット 2020-11-16 13.39.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f6e1e8e3-486f-f7fb-55aa-10bae1e41330.png)
**・セキュリティ・リスト**
oci-dev-tools-security-listにはルールが何も設定されていません。
![スクリーンショット 2020-11-16 13.40.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9acbed03-8a16-8ab0-a9df-a11db0b4da8c.png)
![スクリーンショット 2020-11-16 13.42.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6cd62071-c652-1a45-7e9e-bfb50c10cce8.png)
VCNのデフォルトのセキュリティ・リストにTCP 22番ポート（SSH）へのアクセス、ICMPレスポンスに関するセキュリティ・ルールが設定されていますが、こちらはサブネットにアタッチされていません。
![スクリーンショット 2020-11-16 13.42.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/db785e36-6220-117b-d299-240f900a6fe4.png)
![スクリーンショット 2020-11-16 13.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1a3bc14d-0f52-66f0-1a62-ab37ca8023be.png)
![スクリーンショット 2020-11-16 13.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/4681ccf6-bc47-d7b1-2068-946f71ccd5f4.png)
**・ネットワーク・セキュリティ・グループ**
VCNのデフォルトのセキュリティ・リストと同様の設定となっています。
![スクリーンショット 2020-11-16 13.39.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/c3e154c9-44ee-2514-6834-55d18f8f13d6.png)
![スクリーンショット 2020-11-16 13.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9ee5c3aa-17e5-1544-c92d-e4665366c9bc.png)
![スクリーンショット 2020-11-16 13.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f5d7ddfe-6efb-7f48-c918-faab588e6b5f.png)
**・サブネット**
oci_dev_tools_subnetという名前のサブネットがCIDRブロック10.0.1.0/24で作成されていることが確認できます。
ルート表としてoci-dev-tools-route-tableが適用されています。
セキュリティ・リストとしてoci-dev-tools-security-listが割り当てられていますが、oci-dev-tools-security-listは何もルールが設定されていませんので、アクセスが許可されていません。
![スクリーンショット 2020-11-16 14.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/55a8b531-db62-5496-eccd-acef78d15a5f.png)
![スクリーンショット 2020-11-16 14.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6f839cf5-5ed5-100e-fd28-9bdcfcf6f475.png)
**・コンピュート・インスタンス**
![スクリーンショット 2020-11-16 14.03.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/929809ac-0f62-6ce5-168b-9546fe53c2b0.png)
ネットワーク・セキュリティ・グループが適用されています。
こちらネットワーク・セキュリティ・グループでTCP 22番ポートへのをアクセスを許可しているので、インターネット側からSSH接続ができるようになっています。
![スクリーンショット 2020-11-16 14.03.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/8a7bce62-73f9-5ff7-3ad7-f2fcb9af7847.png)

# 4. インストールされているモジュールの確認
ログに表示された秘密鍵を使用して、opcユーザでログインすると、ホームディレクトリにinstall-oci-dev-kit.logというDevelopment Kitのインストールログがあります。

こちらの内容を確認すると、

```
Packages to install python36-oci-cli terraform terraform-provider-oci oci-ansible-collection python36-oci-sdk.x86_64 oracle-golang-release-el7.x86_64 golang go-oci-sdk.x86_64 java-oci-sdk.x86_64 git-1.8.3.1-23.el7_8.x86_64
```
との記載がありますので、
**・Git
・Terraform
・Oracle Cloud Infrastructure Terraformプロバイダ 
・Oracle Cloud Infrastructure Ansibleコレクション
・OCI CLI
・Python SDK
・Go言語
・Go SDK
・SDK for Java **
の各モジュールと、依存関係のあるモジュールがインストールされたことがわかります。

# まとめ
リソースマネージャのOracle Cloud Development Kitがプリインストールされたサンプルをデプロイして、作成されるコンポーネントを確認してみました。

インスタンス・プリンシパルを利用するための動的グループ、ポリシーまで作成してくれるのはとても便利ですが、テナントレベルですべてのリソースの管理を許可する設定となっているので、必要に応じてポリシーを変更して特定のコンパートメントレベルにするなどした方が安全かもしれませんね。

**＜コンパートメント・エクスプローラで確認できるもの＞**
・仮想クラウド・ネットワーク（VCN）
　・デフォルトのセキュリティ・リスト
　・デフォルトのルート表
　・デフォルトのDHCPオプション
・インターネット・ゲートウェイ
・ルート表
・セキュリティ・リスト
・ネットワークセキュリティ・グループ
・サブネット
・コンピュート・インスタンス
　・ブート・ボリューム
　・vNIC
　・プライベートIP
　・パブリックIP

**＜その他＞**
・SSHキーペア
・動的グループ
・ポリシー