Windows端末(PC) に Terraform をインストールして OCI(Oracle Cloud Infrastructure) で動作させるための準備

Windows端末(PC) に Terraform をインストールして OCI(Oracle Cloud Infrastructure) で動作させるための準備等をメモしておくやで。
彡(ﾟ)(ﾟ)

# 1. Terraformのダウンロード＆解凍＆環境変数(Path)設定

Terraform をダウンロード＆適当なディレクトリに解凍します。

> Download Terraform
> https://www.terraform.io/downloads.html

Windows 64bit版 をダウンロードして適当なディレクトリで解凍、パス(Path)を通しておきます。

![01_path.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/2ab98952-807b-b7a1-31ae-e9d375cb1298.jpeg)

コマンドプロンプト(or PowerShell) で実行してバージョンを出してみます。

```powershell
> terraform -v
Terraform v0.12.24
```
# 2. OpenSSL で API Key用  の キーペア を 作成

下記サイト等から openssl の Windows用バイナリをダウンロードしてインストールします。パス(Path)も通しときましょう。

> Win32/Win64 OpenSSL
> https://slproweb.com/products/Win32OpenSSL.html

コマンドプロンプト(or PowerShell) で 秘密鍵ファイル を作成します。

```powershell
> openssl genrsa -out oci-terraform.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.......+++++
...................+++++
e is 65537 (0x010001)
```
秘密鍵 から 公開鍵 を作成します。

```powershell
> openssl rsa -pubout -in oci-terraform.pem -out oci-terraform_pub.pem
writing RSA key
```

# 3. OCI Console から Compartment, IAM User, IAM Group, IAM Policy を作成

細かい手順はすっ飛ばしてスクショを貼っておきます。
![05_Compartment.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/c144e450-7e12-ce5d-4a4c-5b08438af096.jpeg)
![02_iam_user.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/3e263095-5ae0-8de4-ee30-d351fcb7d4ae.jpeg)
![03_iam_group.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/70dd3a58-ae28-861e-e313-d7d3bd873c9c.jpeg)
![04_iam_policy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/96fc3749-2abf-053b-2162-945040853186.jpeg)


作成した Policy に付与した権限(Policy Statement) は以下の通り、Compartmentの管理権限を付与しています。Terraform の実行権限はここのポリシーに依存するので、必要な権限(Policy)を付与して下さい。

```
ALLOW GROUP ays-iam-group01 TO manage all-resources IN compartment ays-compartment01
```

# 4. IAM User に 公開鍵をアップロードして APIキー を発行

下記を実施して IAM User に公開鍵をアップロードします。

> OCI Console の Identity ⇒ User ⇒ 上記3. で作成した IAM User ⇒ Add Public Key ⇒ 2. で作成した公開鍵をアップロード


成功すると下記のように APIキーが発行されて 公開鍵 の Fingerprint が表示されます。

![06_API_Fingerprint.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/6a3aa877-c142-42ac-4018-7bc0ae2c5fbf.jpeg)

# 5. Terraform の定義ファイル(*.tf)サンプルのダウンロード

下記にTerraform定義ファイル(*.tf)のサンプルをアップロードしています。Avilability Domain の一覧を表示するだけの簡単なサンプルです。任意のディレクトリに git clone するか Download して下さい。

> https://github.com/gonsuke777/terraform/tree/master/oci_init

```git
git clone https://github.com/gonsuke777/terraform
```

# 6. 変数定義ファイル(vars.tf) の 編集 と 秘密鍵ファイルのコピー

vars.tf に変数を集約しています。下記の通り編集して下さい。

| 変数名 | 説明　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 |
|---|---|
| tenancy_ocid | Tenant の OCID を記述して下さい。OCI Console右上の人型アイコンから遷移して参照できます。 |
| iam_user_ocid | 3. で作成した IAM User の OCID を記述して下さい。 |
| iam_user_fingerprint | 4. の Fingerprint を記述して下さい。 |
| iam_user_private_key_path | 2. で作成した秘密鍵ファイルをコピーして、絶対or相対パスで記述して下さい。 |
| bucket_namespace | Object Storage の namespace を記述して下さい。OCI Console右上の人型アイコンから遷移して参照できます。 |
| region | Terraform を実行する Region の英語名を記述して下さい。例：ap-tokyo-1, us-ashburn-1, us-phoenix-1 |
| compartment_ocid | 3. で作成した Compartment の OCID を記述して下さい。 |

# 7. terraform の実行(init, plan, apply)

terraform を実行します。下記のコマンドをコマンドプロンプト(or PowerShell)から実行します。

```terraform
cd ＜tfファイルを格納したディレクトリ＞
terraform init
terraform plan
terraform apply
```

実行結果は下記の通りです。上手くいったやで彡(^)(^)

```terraform
> terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "oci" (hashicorp/oci) 3.73.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.73"

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.
```

```terraform
> terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

data.oci_identity_availability_domains.ads: Refreshing state...

------------------------------------------------------------------------

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.
```

```terraform
> terraform apply
data.oci_identity_availability_domains.ads: Refreshing state...

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

Outputs:

show-ads = [
  {
    "compartment_id" = "ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    "id" = "ocid1.availabilitydomain.oc1..aaaaaaaaaijs56nfsz2usbwsr6k6t5b3do7hns6ib2day6le5scrvvjpeceq"
    "name" = "xCoU:AP-TOKYO-1-AD-1"
  },
]
```

3AD の Phoenix Region で apply すると下記のような結果になります。

```terraform
> terraform apply
:
Outputs:

show-ads = [
  {
    "compartment_id" = "ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    "id" = "ocid1.availabilitydomain.oc1..aaaaaaaaupx7ga46w4xbb3fnkoh7rtyumacyb3ek6bw7bt3qff3mgt3mbrlq"
    "name" = "xCoU:PHX-AD-1"
  },
  {
    "compartment_id" = "ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    "id" = "ocid1.availabilitydomain.oc1..aaaaaaaac7uydq54rcymamzauv5pd23qk2g2vqlrfu5jd3y6i6qxpvvzkf7a"
    "name" = "xCoU:PHX-AD-2"
  },
  {
    "compartment_id" = "ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    "id" = "ocid1.availabilitydomain.oc1..aaaaaaaakemzo4ywaynz573sk4jpvwuqi7vmcuxajxfv4jjj2pthez3j2hbq"
    "name" = "xCoU:PHX-AD-3"
  },
]
```

# 8. 参考ドキュメント／記事

> Terraformプロバイダ
> https://docs.oracle.com/cd/E97706_01/Content/API/SDKDocs/terraform.htm
> 
> Oracle Cloud Infrastructure Provider
> https://www.terraform.io/docs/providers/oci/index.html
> 
> 必要なキーとOCID
> https://docs.oracle.com/cd/E97706_01/Content/API/Concepts/apisigningkey.htm
> 
> 【OCI】oracle cloud -Terraformで環境構築-
> https://qiita.com/manaki/items/068e15f143d2bdbaae69
> 
> Oracle Cloudで始めるTerraform　自動化の真骨頂
> https://qiita.com/Brutus/items/ed2ddb74fa8a13369d9f

# 9. まとめ

本当は[前回更新した環境](https://qiita.com/ora_gonsuke777/items/08e4781af8c4f7e114ff)を  Terraform で構築するところまで行きたかったんやけど、準備で思いのほか手間が掛かったので独立した記事にしたった。

次回こそ Terraform で環境構築や！彡(ﾟ)(ﾟ)

# Appendix. おまけ
(2020/7/30追記) こちらの Terrafrom で確認できる xxxx:PHX-AD-3 の Avilability Domain名の xxxx部分 は、テナント毎に異なります。マジか！
彡(ﾟ)(ﾟ)

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/6cceee37-a5a8-8b49-dc90-f6deabb816d9.png)
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/50305c3e-dfc6-afe8-a2cf-94c3a1dccaeb.png)

マニュアル記述は下記
> https://docs.cloud.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm
> ... Oracle Cloud Infrastructure uses tenancy-specific prefixes for the availability domain names. 
> For example: the availability domains for your tenancy are something like Uocm:PHX-AD-1, Uocm:PHX-AD-2, and so on.