TerraformでAWSリソース作成環境を構築する(aws-vault, Docker Compose)
今回はTerraformでAWSリソースが作成できる環境をaws-vault, Docker Composeを使って構築していきます。
AWSアカウントを作成済みであること、Docker Composeをインストール済みであることを前提とします。
IAMユーザー作成
IAM → Users → Create Userをクリックします。
任意の名前を入力して、Nextをクリックします。
Attach plicies directlyを選択してAdministratorAccessにチェックを付けNextをクリックします。
必要に応じてタグを追加し、Create userをクリックしてユーザーを作成します。
作成したユーザーの詳細画面に移動し、Security credentials(セキュリティ認証情報)→Access keysのCreate access keyをクリックします。
Command Line Interface (CLI)を選択、Confirmationにチェックをして、Nextをクリックします。
必要に応じてDescription tag value(説明タグ)を追加して、アクセスキーを作成します。
アクセスキー、シークレットアクセスキーが発行されるので、csvファイルをダウンロードするか、値を控えておきます。
最後にMulti-factor authentication (MFA)から、Google Authenticatorなどで2段階認証の設定を追加して完了です。
aws-vaultのインストール
aws-vaultとは
aws-vaultとはAWSのアクセスキー、シークレットキーをOSのパスワード管理システムに保管して利用することができるツールです。
macOSの場合はデフォルトではKeychainに保管するようになっています。
https://github.com/99designs/aws-vault
インストール
macOSでhomebrewを使っている場合、以下のコマンドでインストールを行います。
brew install --cask aws-vault
認証情報を設定する
先ほど作成したIAMユーザーの認証情報を登録します。
ターミナルから以下のコマンドでユーザーを追加します。
控えておいたアクセスキー、シークレットアクセスキーを求められるので入力します。
$ aws-vault add terraform-test
Enter Access Key ID: XXXXXXXXXXXXXXXXXXX
Enter Secret Access Key: ****************************************
MFA(2段階認証)を設定する
~/.aws/config
のprofile
に追記をすることでMFA(2段階認証)の設定を行います。
viコマンドで~/.aws/config
の中身を確認します。
vi ~/.aws/config
先ほど追加したterraform-test
というprofile
が追加されています。
[default]
region=ap-northeast-1
output=json
[profile terraform-test]
i
キーを押してインサートモードに切り替え、以下のように編集後、esc
+ :wq
で保存します。mfa_serial
の箇所はMFA(2段階認証)のIdentifier
の値を設定します。
[default]
region=ap-northeast-1
output=json
[profile terraform-test]
region=ap-northeast-1
output=json
mfa_serial=arn:aws:iam::xxxxxxxxxxxx:mfa/aws-iam-terraform-test
接続確認
exec
コマンドを使って登録した認証情報に接続できるか確認します。
$ aws-vault exec terraform-test
Macの場合Keychain(キーチェーン)のパスワードを求められるので入力します。
その後、2段階認証のコードの入力を行います。
$ aws-vault exec terraform-test
Enter MFA code for arn:aws:iam::146401978774:mfa/terraform-test:
入力が完了したら以下のように接続が完了します。
Starting subshell /bin/zsh, use `exit` to exit the subshell
Docker Composeで環境構築
compose.yamlファイルの作成
任意のフォルダに以下の内容でcompose.yaml
ファイルを作成します。
services:
terraform:
image: hashicorp/terraform:1.9.3
volumes:
- .:/terraform
working_dir: /terraform
environment:
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
- AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}
image
にhashicorp/terraform:1.9.3
を使用しています。
environment
の環境変数にはaws-vault exec
を実行時に値が設定されます。
動作確認
compose.yaml
ファイルと同じ階層にmain.tf
ファイルを作成します。Terraform
公式のaws providerのドキュメントを参考にプロバイダーの設定・VPC
作成の設定を行います。
terraform {
required_version = "1.9.3"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# Configure the AWS Provider
provider "aws" {
region = "ap-northeast-1"
}
# Create a VPC
resource "aws_vpc" "example" {
cidr_block = "10.0.0.0/16"
}
Terraform
の初期化を行います。
docker compose run --rm terraform init
以下のような出力がされ、.terraform
フォルダ、.terraform.lock.hcl
ファイルが作成されると初期化は完了です。
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 plan
を実行し、作成予定のリソースを確認します。
docker compose run --rm terraform plan
実行結果からVPC
が作成予定であることが確認できます。
# aws_vpc.example will be created
+ resource "aws_vpc" "example" {
+ arn = (known after apply)
+ cidr_block = "10.0.0.0/16"
+ default_network_acl_id = (known after apply)
+ default_route_table_id = (known after apply)
+ default_security_group_id = (known after apply)
+ dhcp_options_id = (known after apply)
+ enable_dns_hostnames = (known after apply)
+ enable_dns_support = true
+ enable_network_address_usage_metrics = (known after apply)
+ id = (known after apply)
+ instance_tenancy = "default"
+ ipv6_association_id = (known after apply)
+ ipv6_cidr_block = (known after apply)
+ ipv6_cidr_block_network_border_group = (known after apply)
+ main_route_table_id = (known after apply)
+ owner_id = (known after apply)
+ tags_all = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
terraform apply
を実行して変更を反映させます。Enter a value:
と表示されるのでyes
と入力します。
以下の出力がされたら作成は完了です。
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
コンソールからVCP
が新規で作成されたことが確認できます。
最後にterraform destroy
でVPC
を削除します。
docker compose run --rm terraform destroy
以下の出力がされたら削除は完了です。
Destroy complete! Resources: 1 destroyed.
これでTerraform実行環境の構築・動作確認は完了です。
次回はtfstate
ファイルをs3
で管理する手順について解説します。
参考
https://zenn.dev/himekoh/books/202210261312
https://zenn.dev/ryoh/articles/1f7edb4dc6b6b5
https://github.com/99designs/aws-vault