はじめに
AWSマネジメントコンソールでECS/Fargate構成でアプリをホストしていましたが
Terraformを使ってインフラをコード化できましたので
アプトプットとして、記事を投稿します。
当記事では、terraformのコードを書く前に行った
**セットアップ作業
**をまとめています。
AWSリソース生成に関わるterraformコードは別の記事でまとめています。
使用技術
- Terraform: 1.1.2
- MacOS: Catalina 10.15.7
セットアップ手順
- IAMユーザーの作成
- AWS CLIに2つの認証情報を設定する
- terraformのインストール
- git secretsのインストール
- VScode拡張機能を導入
- ディレクトリ作成と基本コードの記述
1. IAMユーザーの作成
はじめに、AWSマネジメントコンソールで
以下2つのIAMユーザーを作成します。
- 管理者用ユーザー
- Terraform用ユーザー
注意点ですが、
どちらのユーザーにもAdministratorAccessの権限を付与します。
以降では、すでに管理者用ユーザーは作成されている事とし、
Terraform用ユーザーのみ
AWSマネジメントコンソールで新しく作成しています。
では、IAM画面に移り、サイドバーからユーザー
を選択して
ユーザーを追加
を押します。
任意のユーザー名を入力して、認証情報タイプをアクセスキー
とします。
ユーザーには、AWS公式の権限を付与するため、既存のポリシーを直接アタッチ
を選び、
一番上に表示されているAdministratorAcces
をチェックして
次に進めます。
次の画面ではタグ名の設定がありますが、無視してそのまま次に進み
ユーザーの作成まで実行してください。
ユーザー作成完了後には、下記画面が表示されますので
アクセスキーID
シークレットアクセスキー
をテキストエディターなどに控えておきます。
- AWS CLIに2つの認証情報を設定する
続いて、各ユーザーをAWS CLIに登録していきます。
私の場合は、管理者用ユーザーは登録済みでしたので
登録されているIDとKeyが表示されていました。
Terraform用ユーザーには、profileオプションを付けて
識別できるterraformという名称を入れています。
なお、各種の質問には下記のように答えていきます。
# 管理者用ユーザー
% aws configure
# 既に登録済みであれば、IDやKeyが表示されます。
AWS Access Key ID [****************AAAA]:
AWS Secret Access Key [****************BBBB]:
Default region name [ap-northeast-1]:
Default output format [json]:
# Terraform用ユーザー
% aws configure --profile terraform
AWS Access Key ID [none]: アクセスキーIDをコピペ
AWS Secret Access Key [none]: シークレットアクセスキーをコピペ
Default region name [none]: ap-northeast-1
Default output format [none]: json
入力が完了したら、Finderから
/Users/ユーザー名/.aws/credentials
と辿っていき
登録できていることが確認します。
[default]
aws_access_key_id = AKI***************
aws_secret_access_key = ***********************
[terraform]
aws_access_key_id = AKI***************
aws_secret_access_key = ***********************
3. terraformのインストール
まず、Terraformのパッケージマネージャーであるtfenvをインストールします。
その後にTerraformのバージョンを指定した上で、インストールする流れです。
では、ターミナルで実行していきましょう。
# tfenvのインストール
% brew install tfenv
# tfenvがインストールできているか確認する
% tfenv -v
# インストール可能なterraformバージョンを表示させる
% tfenv list-remote
# terraformのバージョン1.1.2を指定してインストール
% tfenv install 1.1.2
# インストール済みのterraformから指定バージョンを選ぶ
% tfenv use 1.1.2
# 現在使用しているバージョンを確認する
% tfenv list
# Terraform自体のバージョンも念のため確認する
% terraform -v
4. git secretsのインストール
次は、AWSのクレデンシャル情報が外部に漏れないように
git secretsをインストールします。
これを導入することで、GitHub上に
AWSシークレットアクセスキー等の秘匿情報が公開されないように
git commitコマンドを制限されます。
Macの場合は、Homebrew経由でインストールできます。
# git-secretsをインストール
% brew install git-secrets
# AWS秘匿情報の流失を阻止する設定
% git init
% git secrets --install
% git secrets --register-aws
検証として、
.gitが存在するリポジトリ内に
偽のcredencialファイルを入れてみます。
# git secretsが機能しそうな情報を入れてみる
[default]
aws_access_key_id = AKIAAAAAAAAAAAAAAAAA
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
検証ファイルを保存後に、コミットをしてみるとエラーが発生し、
git secretsがAWS秘匿情報を含んでいることを知らせてくれます。
# 検証としてコミットまでしてみる
% git add .
% git commit -m "AWS秘匿情報が含まれている為、commitできない"
[ERROR] Matched one or more prohibited patterns
Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive
参考まで(任意)
Gitのinit時に、自動的にsecretをinstallさせる設定
# git initコマンドを実行すると、git secret --installコマンドも動作する
% git secrets --install ~/.git-templates/git-secrets
% git config --global init.templatedir '~/.git-templates/git-secrets'
5. VScode拡張機能を導入
テキストエディタのVScodeに、Hashicorp社公式の拡張機能を導入します。
6. ディレクトリ/ファイル作成
あとは、terraformコードを記述する前に
各ディレクトリ/ファイルを整理しておきます。
1. main.tf: terraform/プロバイダ/変数の設定
2. terraform.tfvars: 変数に入れる値を設定
3. .gitignore: Git履歴を無視する対象ファイルを設定
4. modules/各ディレクトリ/main.tf: IAMロール等の一部リソースは、モジュールで作成しやすくする
上記ディレクトリとファイルをterraform用ディレクトリの中に
作成します。
ディレクトリ構造を表すために
下記では、homebrew経由でtreeをインストールして
treeコマンドを実行しています。
# treeをインストール
% brew install tree
# 対象ディレクトリに対して、treeコマンドの実行
% tree terraform_directory
terraform_directory
├── main.tf
├── modules
│ ├── iam_role
│ │ └── main.tf
│ └── security_group
│ └── main.tf
└── terraform.tfvars
以上でterraformを実装する前の準備が完了です!
参考動画/書籍
終わりに
terraformでAWSリソース作っていると、削除する時もコマンドでまとめて削除できるし便利!
さすがに実務で自由に消したりはできないだろうけど、個人のポートフォリオには
無駄なAWSリソースを作らないためにも活用してる。
フロントにVue.jsを導入するなど、アプリ構成が複雑になると
terraformも編集が必要になるんだろうなー…