LoginSignup
0
0

AWS Cloud9にTerraformの実行環境をつくる

Posted at

この記事を書いた経緯

ローカル環境からTerraformコマンドでAWSリソースを作成して遊んでいたら、急に反応がなくなってしまった...
Pluginがどうこうというエラーが出たり何も出なかったりで行き詰まってしまったので、Cloud9にTerraform実行環境を作ってみることに。
同じような症状で解決されている方がいたら、ぜひコメントで教えてください!

必要なもの

AWS アカウント
IAMユーザ(Terraform実行のためにはAdministratorAccessをポリシーに追加しておきます)

私の環境

OS:macOS Ventura 13.2.1

AWSのリソース作成により料金が発生する場合があります。自己責任でお願いします。

Cloud9にTerraform実行環境を構築

まずCloud9環境を作成します。
AWSのマネジメントコーソールからcloud9と検索 → 環境を作成。

Cloud9の設定
  • name:terraform
  • Environment typeInfo:New EC2 instance
  • Instance typeInfo:t2.micro (1 GiB RAM + 1 vCPU)
  • platform:Amazon Linux 2
  • Connection:AWS Systems Manager (SSM)
  • VPC:デフォルト
  • Subnet:パブリックサブネット

デフォルトVPCがない場合は、VPC → アクション → デフォルトVPCを作成できます。

Cloud9にデフォルトで入っているAWS CLIのバージョンがv1だったので、公式のガイドに従ってv2にアップデートしておきます。

AWS CLI v2のパッケージをダウンロード → 解凍 → インストール → パスを通す。

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc

source ~/.bashrcで変更適用を忘れずに!


次に、Terraformのインストールです。
まずはtfenv(Terraformのバージョン管理ツール)をインストールしてパスを通します。

$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
$ sudo ln -s ~/.tfenv/bin/* /usr/local/bin

tfenv -vでバージョンが表示されればOKです。

tfenv list-remoteでインストール可能なバージョンの一覧を確認し、最新のものをインストールしましょう。
今回は1.4.6をインストールします。

$ tfenv install 1.4.6
$ tfenv use 1.4.6
$ terraform version
Terraform v1.4.6
on linux_amd64

インストールされていることが確認できました。

EC2インスタンスの起動

AWSクレデンシャルの読み込み

まずはIAMユーザのクレデンシャルをterraformから参照できるようにします。
※profileを指定せずに実行すると、Cloud9に設定されているデフォルトユーザ(AMTC)で実行されるみたいです(こちらを参照)

こちらで紹介されているようにいくつか方法があるみたいです。
今回は一番手軽そうな.tfvarsにprofileを書き込むやり方でいきます。

Terraformの作業ディレクトリとしてterraformディレクトリを作成して、terraform.tfvarsを作成します。
AWSマネジメントコンソールで、IAM → 作成したユーザ → セキュリティ認証情報 → アクセスキーを作成でアクセスキーを作成します
アクセスキーの値は一度表示を消すと二度と見れなくなるので、csvファイルをダウンロードするのを忘れずに!

以下のようにterraform.tfvarsに認証情報を書き込みます。

terraform.tfvars
access_key = "***********"
secret_key = "*******************"

このファイルはgithubにアップロードしないように.gitignoreファイルに記載しておきましょう。

.gitignoreファイルはこちらからterraformと入力して簡単に作成することができます。

こんな感じになります。
.gitignore
# Created by https://www.toptal.com/developers/gitignore/api/terraform
# Edit at https://www.toptal.com/developers/gitignore?templates=terraform

### Terraform ###
# Local .terraform directories
**/.terraform/*

# .tfstate files
*.tfstate
*.tfstate.*

# Crash log files
crash.log
crash.*.log

# Exclude all .tfvars files, which are likely to contain sensitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
*.tfvars
*.tfvars.json

# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json

# Include override files you do wish to add to version control using negated pattern
# !example_override.tf

# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*

# Ignore CLI configuration files
.terraformrc
terraform.rc

# End of https://www.toptal.com/developers/gitignore/api/terraform

EC2インスタンス作成

次にmain.tfを作成し、コードを実行するprofileの設定、変数の定義を記述します。

main.tf
provider "aws" {
  region     = "ap-northeast-1"
  access_key = var.access_key
  secret_key = var.secret_key
}

variable "access_key" {
  type = string
}

variable "secret_key" {
  type = string
}

terraform initを実行して、Terraform has been successfully initialized!と表示されればOKです。

やっとEC2インスタンスの作成です。
main.tfに以下のように追記します。

main.tf
resource "aws_instance" "TF_C9" {
  ami           = "ami-0ce107ae7af2e92b5"
  instance_type = "t2.micro"
  tags = {
    Name = "TF_C9"
  }
}

terraform planterraform apply -auto-approveで実行します。

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.と表示されればOKです。
マネジメントコンソールからもEC2インスタンスが確認できるはずです。

これで、Cloud9からTerraformを実行することができました!!

作成したEC2インスタンスはterraform destroyしておきましょう

おまけ

ここからはオマケですが、ソースコードをCloud9からGithubにアップロードします。
Cloud9でSSHキーを生成 → githubに登録 → リポジトリにpush という流れです。

SSHキーを生成します
cd ~/.ssh
ssh-keygen

いくつか質問が出てきますが、とりあえず全てエンターで鍵を生成します。
/.ssh/id_rsa.pubにある公開鍵の中身をGithubのsettings → SSH keysで登録します。

リポジトリを作成し、Cloud9からリポジトリのSSHのURLを登録してpushします。

おまけのおまけ

さらにおまけになりますが最後に、AWSクレデンシャルがGithubの公開リポジトリにリークする事故を防ぐためのツール、git secretsを導入します。

Cloud9にgit secretsをインストールします。
git clone https://github.com/awslabs/git-secrets.git
cd git-secrets
sudo make install

terraformディレクトリでawsのアクセスキーのパターンを認識するオプションを設定します(--globalオプションでglobalに設定しても良いです)
git secrets --register-aws

プロジェクトディレクトリでgit initを実行し、git secrets --installで対象のリポジトリに対して有効化しようとすると、以下のようなエラーが...

/usr/local/bin/git-secrets: line 208: say: command not found
/usr/local/bin/git-secrets: line 208: say: command not found
/usr/local/bin/git-secrets: line 208: say: command not found

sayはmacOSで使われる読み上げのコマンドらしく、今回使用しているAmazon Linux 2では使えないみたいです。
該当ファイルを開き、208行目の say を echo に書きかえます。
sudo vi /usr/local/bin/git-secrets

git-secrets
 ...
  chmod +x "${dest}"
  echo "$(tput setaf 2)✓$(tput sgr 0) Installed ${hook} hook to ${dest}" # ここを変更
}

なんでここだけsayになってるのかは謎です...

適当なテキストファイルにawsのアクセスキーを書き込み、commitしてみます。
以下のようにエラーが表示され、コミットが拒否されるはずです。

test.txt:1:access_key = "***********"
test.txt:2:secret_key = "******************"

[ERROR] Matched one or more prohibited patterns

git logでコミットされていないことが確認できます。

これでおっちょこちょいなワタシも安心!!

さらに詳しく知りたい方はこちらが参考になります。
https://zenn.dev/kkk777/articles/8f55db1e9678f2

最後に

初めて記事を書いてみました。4時間くらいかかりました。もう書きません。
自分用メモとは違い、全体の流れ、それぞれの操作をなんのためにやっているのか、ちゃんと言葉にして書くことで勉強になりました。

参考にさせていただいた記事

https://dev.classmethod.jp/articles/cloud9-terraform/
https://dev.classmethod.jp/articles/aws-cloud9-aws-managed-temporary-credentials/
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
https://kosuke-space.com/cloud9-github
https://qiita.com/Hikosaburou/items/1d3765d85d5398e3763f

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0