Cloud9での各種アプリ(Terraform関連)インストールとCodeCommit(git)

備忘兼メモ。

Cloud9でのTerraform環境整備とCodeCommitリポジトリ作成については、こちらを参考に行いました（素晴らしいまとめです）。brewとtfenvもインストールできる。

[Cloud9 + CodeCommitでサクッとterraform実行環境を作成する](https://qiita.com/d_e_n/items/1539623175e2370a60cd)

IAMロールの設定、TFLint/tfsec/AWS CLIのインストールについて、以下を参考にさせていただきました。こちらもまた素晴らしい記事です。
[Cloud9にTerraform環境を作ってみる](https://anikitech.com/cloud9-terraform/)
AdministratorAccessを指定しているが、要件に応じて調整。ただし、AWSで開発するとなるとこれぐらいの権限は必要だと感じる。

ほぼ上記リンクを見れば作成できますが、いったん自身の手順をまとめるために記載する。

# 各手順

## 初期設定、インストール関連
Cloud9インスタンスのパスワード変更の実施。任意パスワードに変更する。
```shell-session:Cloud9コンソール
$ sudo passwd ec2-user
```

### brewインストール。
```shell-session:Cloud9コンソール
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```
<br>

- brewにpathを通す
```shell-session:Cloud9コンソール
$ test -d ~/.linuxbrew && PATH="$HOME/.linuxbrew/bin:$HOME/.linuxbrew/sbin:$PATH"
$ test -d /home/linuxbrew/.linuxbrew && PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH"
$ test -r ~/.bash_profile && echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.bash_profile
$ echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.profile
$ brew
```

### credentialの設定
[4. .aws/credentialの設定をする](https://qiita.com/d_e_n/items/1539623175e2370a60cd#4-awscredential%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B)
　に記載のとおり、自動認証機能を無効にする（セキュリティ上の観点から）。

### IAMロール
[神記事](https://anikitech.com/cloud9-terraform/)記載の通り。

### terraform関連インストール
- tfenvインストール。
```shell-session:Cloud9コンソール
$ brew install tfenv
$ tfenv list-remote
$ tfenv install x.xx.x #指定バージョンのterraformをinstall
```

- tfenvによるTerraformバージョン指定、インストール確認。
```shell-session:Cloud9コンソール
$ tfenv use 1.2.4
$ terraform --version
$ tfenv list
```
<br>

- tflintのインストール
構文解析ツール。かなり使う。planでは問題なかったのに、applyできないような状況が格段に減ります。
```shell-session:Cloud9コンソール
$ curl -s https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh | bash
$ tflint --version
```
<br>

- tfsecインストール
セキュリティに問題がありそうなコードを検知してくれるツール。パブリックIPなどの外部公開がある部分などを危険と通知してくれたりする。外部公開が前提だとちょっと過剰に見えるが、あるとヒヤリハットの意味で有用。
```shell-session:Cloud9コンソール
$ curl -L https://github.com/aquasecurity/tfsec/releases/download/v0.63.1/tfsec-linux-amd64 --output tfsec
$ chmod +x tfsec
$ sudo mv tfsec /usr/local/bin/
$ ll /usr/local/bin/tfsec
$ tfsec -v
```
<br>

- aws cliのインストール。
```shell-session:Cloud9コンソール
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version
```
<br>

- Cloud9でAWSの認証を通す
先のIAMユーザー情報を使って操作を行うため、Cloud9に認証を通す。
Cloud9内部にシークレットを残したくないため、[AWS公式手順](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html)に従って、シェルセッションが終わるまでの一時的なクレデンシャルとする。
IAMユーザーから払い出したアクセスキーとシークレットアクセスキー、利用リージョン名を環境変数に入れる。ダブルクォーテーションはそのまま。
```shell-session:Cloud9コンソール
$ export AWS_ACCESS_KEY_ID="アクセスキー"
$ export AWS_SECRET_ACCESS_KEY="シークレットアクセスキー"
$ export AWS_DEFAULT_REGION="リージョン名"
```
<br>

終わったら、「aws configure」で認証情報として環境変数を指定。
```shell-session:Cloud9コンソール
$ aws configure
AWS Access Key ID [None]: ${AWS_ACCESS_KEY_ID}
AWS Secret Access Key [None]: ${AWS_SECRET_ACCESS_KEY}
Default region name [None]: ${AWS_DEFAULT_REGION}
Default output format [None]: json
```
<br>

AWSへの認証が通ったか、確認する。
```shell-session:Cloud9コンソール
$ aws sts get-caller-identity
```

次回以降、「Cloud9でAWSの認証を通す」の手順を最初に実施することで、セキュアに認証情報を扱うことができる。
<br>

### IAMユーザ
個別にCloud9専用ユーザーを作り、CLIアクセスのみにしてセキュリティを担保するか、自身のユーザーは多要素認証も入れてそこで担保するのかは、個々の好みやセキュリティ要件に依存する。個人的にはユーザーを増やして管理の手間を増やしたくないので、自身がいま使ってるIAMユーザーにしたうえで、多要素認証をかけてからキーを払い出すようにしている。
ネットに情報があるので詳しくは書かないが、ここでIAMユーザーからシークレットキーを払い出す。

### Terraform初期設定
Terraformをのソースを格納するディレクトリを作成。prodはproduction（本番、実運用環境）を意味する。よしなにフォルダ名は決める。以下は作成したフォルダにカレントを移動している。
```shell-session:Cloud9コンソール
$ mkdir /home/ec2-user/environment/tfm/prod
$ cd /home/ec2-user/environment/tfm/prod
$ pwd 
```

移動したらそこでterraform initする。
```shell-session:Cloud9コンソール
prod $ terraform init
```
prodはカレントディレクトリが「/home/ec2-user/environment/tfm/prod」であることを意味する。

ここまででTerraform実行環境の整備が終わった。

## CodeCommit＋IAM
インフラ屋さんなので、あまりGitなどに慣れ親しんでいない（今回初めて導入した）が、ファイルなどのバージョン管理などをフォルダ名年月日でコピーして、という運用に嫌気がさしていた。そのことから、今回Gitを導入にチャレンジしてみた。

マネジメントコンソールよりCodeCommitを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/0651a457-da4c-94d9-b899-13f3439482bf.png)

リポジトリを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/68c8b740-693b-248f-5485-ba116977a828.png)

任意名前を決めてリポジトリを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/a1712b18-2320-b2f2-a9da-47193b9fb7bf.png)

作成したらIAMに移動し、Cloud9で利用するIAMユーザーを選択し、認証情報タブを選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/fee759fe-c059-07ef-d1f1-2780a1ab42a0.png)

AWS CodeCommitのHTTPS Git 認証情報にて、認証情報を生成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/d2b78283-beb9-0a90-ab7d-2cbff668fe63.png)

HTTPS Git 認証情報はメモ等しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/cf785809-f99f-2c8b-32de-b3dd402e1d41.png)

## Git 初期設定、ローカルリポジトリ設定、リモートプッシュ
Gitを使うために（Commitするために）、初回はお約束の作業とのこと。ユーザー名やEメールは実在しないものでもよいらしい。USERNAMEとMYEMAILADDRESSの部分を、任意値に変更する。
```shell-session:Cloud9コンソール
$ git config --global user.name USERNAME
$ git config --global user.email MYEMAILADDRESS
```

バージョン管理したいディレクトリに移動する。今回は先ほどのディレクトリをGit管理対象とする。
```shell-session:Cloud9コンソール
$ cd /home/ec2-user/environment/tfm/prod
prod $ git init
prod(master) $ 
```

git initするとプロンプトがmasterとなり、masterブランチが切られたことがわかる。
続いて、ローカルリポジトリにadd、commitする。-mでcommit内容にコメントをつけている。
```shell-session:Cloud9コンソール
prod(master) $ git add /home/ec2-user/environment/tfm/prod
prod(master) $ git commit -m 'first commit'
```

ローカルリポジトリにadd、commitできたら、CodeCommitリポジトリに対して、ローカルリポジトリのmasterブランチをプッシュする。ユーザー名とパスワード入力を求められるため、AWS CodeCommitのHTTPS Git 認証情報で取得した値を入力する。
```shell-session:Cloud9コンソール
prod(master) $ sudo git push --set-upstream https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/CodeCommitリポジトリ名 master
>AWS CodeCommitのHTTPS Git 認証情報のユーザー名を入力
>AWS CodeCommitのHTTPS Git 認証情報のパスワードを入力
```

上記で、初回リモートリポジトリのpushの際、エラーが出たため、-set-upstreamオプションをつけている。[こちら](https://qiita.com/kat_log/items/450ce1f740d4646c8870)に記載の通り、-uオプションだけでもいいのかもしれない。

初回以降のリモートリポジトリへのmasterブランチのpushはこのように実施。
```shell-session:Cloud9コンソール
prod(master) $ git push https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/CodeCommitリポジトリ名 master
```

これで一通りCloud9＋CodeCommitを利用できる環境が整いました。
あとはTerraform等でバリバリ書いていくのみ。

## 余談
インフラ系やExcel管理が多い環境だったため、なかなかGitなどに触れる機会がなかったが、今回触ってみてかなり勉強になった。覚えることも多かったが、今後はGitをもっと使っていきたい。

# 参考
Cloud9にTerraform環境を作ってみる
https://anikitech.com/cloud9-terraform/

Cloud9 + CodeCommitでサクッとterraform実行環境を作成する
https://qiita.com/d_e_n/items/1539623175e2370a60cd