こんにちは!エンジニアの君島です。
ギークフィードでもInfrastructure as Code(IaC)の波がきました。
AWS CloudFormationの記事もアップされましたね。
今回はAWS CloudShellの特徴を考慮しつつ、Terraformをお手軽に始められる環境を整えてみました。
併せて、開発しやすくする設定や注意する点も紹介していきますのでお好みに合わせてお読みください。
目次
Terraformとは
Terraformは、HashiCorp社で開発したオープンソースのIaCを実現するためのツールです。構築ができる対象はAWSだけでなく、GCPやAzureと様々なProviderが用意されています。
AWS CloudShellとは
AWS CloudShellはブラウザベースの事前認証済みシェルです。マネジメントコンソールからは上部の赤枠のアイコンからも実行できます。
以下のような特徴があります。
- 権限はマネジメントコンソールにアクセスするIAMユーザーの権限
- 実行環境はAmazon Linux2
- 1GBのストレージがある
- ただし、/home以下のみ
- 永続させたいファイルはここに置くか、初期設定用のスクリプトを置くなどしよう
- 最後のセッションから120日間永続する
- dfで確認してみた
- ただし、/home以下のみ
- セッション永続性
- 2,30分放置でセッションが切れてしまう
- 数秒~数十秒待てば再接続できる
- 2,30分放置でセッションが切れてしまう
-
- アクティブでも12時間継続しているセッションも切れます
- 同時shell数10
- プロセス自体は10以上いけた
TerraformをAWS CloudShellで開発することを考える
Terraformを開発、実行できる環境というといくつか考えられます。ローカルPC、EC2、Cloud9等々あります。
そこにAWS CloudShellを追加して考えてみます。
AWS CloudShellを使った場合に以下のようなメリットがあります。
- AWSアカウント、リージョン、マネジメントコンソールに認証するユーザーごとにshellが立ち上がるので、実行環境自体を管理する工数は少ない
- クレデンシャル情報をコードに書く必要がない
- 料金無料
- Amazon Linux2インスタンス相当の初期設定が既に用意されている
- マネジメントコンソール上なので、実行結果の確認がすぐできる
一方で以下のような懸念もあると思いますが、以下のように仕様だと割り切って小さく始める上では問題無いと判断しました。
懸念点 | 検討結果 |
自由に使えるストレージが1GB | 十分大きい。 |
2,30分でセッションが切れて、
ホームディレクトリ以外はリサイクルされる |
環境がどこであろうと、コードはgit管理しよう。
永続させたいバイナリや設定はホームディレクトリに置き、セッションが切れたらパス通す。 あるいは初期設定をスクリプト化すれば。 |
120日アクセスしないとホームディレクトリもリサイクルされる | そこまで放置するなら本当に使わないでしょう。
上に書いたが、コードはgit管理。 |
同時実行の上限が10 | Terraform実行は排他的に行うし、10人以上で使うならリージョン分けたりアカウント分けたりもできるのであまり問題視しない。 |
ローカルのエディタ使いたい | ローカルでどうぞ。コードはgit管理。 |
では、実際に環境を整えていきましょう。
TerraformをAWS CloudShellで開発する環境を整える
Terraformのインストール
yumよりtfenv経由の方がホームディレクトリにバイナリが残ったり、バージョン切り替えも容易なのでお勧めです。
1 2 3 4 5 |
git clone https://github.com/tfutils/tfenv.git ~/.tfenv sudo ln -s ~/.tfenv/bin/* /usr/local/bin tfenv list-remote tfenv install 1.1.8 tfenv use 1.1.8 |
shellのセッションが切れても、パスかシンボリックリンクを設定すれば再インストールは必要有りません。
例えば、以下のコマンドを実行すればOKです。
1 |
sudo ln -s ~/.tfenv/bin/* /usr/local/bin |
Vimのプラグイン追加
私はエディタはvim派なので、vim-terraformを使用します。カラースキームと自動整形は便利だと思います。こちらも初回のみの実行でOKです。
1 2 |
git clone https://github.com/hashivim/vim-terraform.git ~/.vim/pack/plugins/start/vim-terraform echo "let g:terraform_fmt_on_save=1" >> ~/.vimrc |
以上で、AWS CloudShell上での環境整備ができました。
以降は、Terraformのベストプラクティスと呼ばれるようなポイントであり、注意した方が良いポイントをまとめておきます。
ベストプラクティスかつチェックポイント
Terraformバージョンを固定する
1 2 3 |
terraform { required_version = "1.1.8" } |
プロバイダバージョンを固定する
1 2 3 |
provider "aws" { version = "4.0.0" } |
削除操作を抑止する
リソースブロックに以下を入れると削除を抑止できる。
1 2 3 |
lifecycle { prevent_destroy = true } |
コードフォーマットをかける
vim-terraformを入れていれば使用しないかもしれませんが、一括でも実行できますので、記載しておきます。
- コードフォーマット
1 |
terraform fmt -recursive |
- フォーマット済みチェック(未フォーマットは0以外)
1 |
terraform fmt -recursive -check |
バリデーションをかける
変数の未セットや構文エラーチェック。スニペットです。
1 |
find . -type f -name '*.tf' -exec dirname {} \\l; | sort -u | xargs -I {} terraform validate {} |
オートコンプリートを有効にする
以下コマンドを打ってshell再起動で有効化します。.bashrcに設定が書かれますので1回実行すればOK。
1 |
terraform -install-autocomplete |
プラグインキャッシュを有効にする
init時のプロバイダファイルの都度ダウンロードをキャッシュすることができます。時間削減になります。
ホームディレクトリで以下を実行します。
1 2 3 |
cat << EOF > .terraformrc plugin_cache_dir = "$HOME/.terraform.d/plugin-cache" EOF |
保存先も作成しておきます。
1 |
mkdir -p "$HOME/.terraform.d/plugin-cache" |
TFLintで不正なコードを検出する
- インストールの仕方は、macでないとこちら。
1 |
curl <https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh> | bash |
- チェックする
1 |
tflint |
tfsecでセキュリティ上問題のあるコードを検出する
- インストール(version 1.18の場合)
1 2 |
wget -q -O tfsec https://github.com/aquasecurity/tfsec/releases/download/v1.18.0/tfsec-linux-amd64 chmod +x ./tfsec |
- セッション切れてもパスかシンボリックリンクの設定すればOK
1 |
sudo ln -s ~/tfsec /usr/local/bin |
tfstateファイルの管理の仕方
- リモート管理すること(git管理ではない)
- チーム開発するならばDynamoDBでステートロックをかけること
- 本番、開発など環境ごとに作ること
まとめ
AWS CloudShellの特徴を考慮しつつ、Terraform開発をする環境を考えてまとめてみました。
これで、セッションが切れても継続的にお手軽にTerraform開発ができると思います。
宣伝
ギークフィードではAWSエンジニアを募集しています。
技術力に自信がある方も、一緒にAWSを利用したサービスを開発したい、AWSでの構築をIaCで実践したいという方も募集しています。
興味がある方はこちらからエントリーをお願いします!
- CLIでAmazon S3にあるファイル内の文字列検索をしてみる - 2024-02-01
- 不完全なマルチパートアップロードをCLIで確認してS3の無駄コストを無くそう - 2024-01-29
- AlmaLinux9.3にPHP8.3を入れてLaravel9から10にバージョンアップする - 2024-01-12
- AWS CloudShellの表現力を確認してみよう - 2024-01-01
- AWSのアーキテクチャーを学べるAWS Card Clash攻略Wiki - 2023-12-26