はじめに
前回、AWS CDKでDeployまでの簡単な例として「IAMユーザを作る」のを記事にしました。
今回は同じことを、Terraformでやってみました。
参考
以下のサイトを参考にしました。
用意するもの
- Cloud9
- t3.smallで作りました
- デフォルトVPC上
- Terraform用、IAMユーザ
手順
tfenvインストール
Terraformはバージョンがよく変わるようなので、バージョン管理できるtfenvを入れました。
git clone https://github.com/tfutils/tfenv.git ~/.tfenv
sudo ln -s ~/.tfenv/bin/* /usr/local/bin
# シンボリックリンクができているか確認
ll /usr/local/bin/terraform
ll /usr/local/bin/tfenv
Terraformインストール
# 使用可能バージョン一覧
tfenv list-remote
# 後日TFLintを入れることを想定して、下記バージョン(今回はTFLintはインストールしない)
tfenv install 1.1.0
tfenv use 1.1.0
tfenv list
実行の流れ
プロジェクト用ディレクトリ作成
mkdir test-terraform
cd test-terraform/
コード記述
# アクセスキーとシークレットキーを扱う変数
# 今回は、環境変数で与える
variable "access_key" {}
variable "secret_key" {}
terraform {
# AWSプロバイダーのバージョン
required_providers {
aws = {
source = "hashicorp/aws"
version = "~>4.8.0"
}
}
}
# AWSプロバイダを定義
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "ap-northeast-1"
}
# IAMユーザ作成
resource "aws_iam_user" "lb" {
name = "Komichi-Akebi"
}
フォルダ構成は以下のようになります。
この後のコマンドで色々ファイルが生成されますが、今の時点ではこれだけになります。
test-terraform
└── main.tf
実行
# 環境変数にアクセスキーとシークレットキーを代入
# Terraformの変数として扱う場合は、"TF_VAR_"という接頭辞を付ける
export TF_VAR_access_key="<<aws_access_key_id>>"
export TF_VAR_secret_key="<<aws_secret_access_key>>"
# 初期化
terraform init
# コードをフォーマットし、見栄えを揃える
terraform fmt -recursive
terraform fmt -recursive -check
# 構文エラーを確認
terraform validate
# 実行計画確認
terraform plan
# 作成
terraform apply
terraform apply
を実行すると、以下のように確認を求められるので、yesを入力。
AWS CDKとは異なり、CloudFormation上には該当のスタックはありませんでした。
構成の変更
コードを修正してterraform plan
を実行します。
以下のように差分が表示されます。
問題なければ、terraform apply
を実行し変更します。
以下のようにユーザ名が変更されました。
構成の削除
削除する場合は以下のコマンドになります。
terraform destroy
applyの時と同様に確認が求められるので、yesを入力します。
作成したリソースが削除されます。
余談
Cloud9は、コンソールログインユーザと同等の権限を持つ仕組みがあります。
Terraformのプロバイダに指定したIAMユーザの代わりに、この仕組みで生成されるキーを使うことができないか試してみました。
キーの情報はcat ~/.aws/credentials
で見れます。(ですがこの情報、ある程度時間が経つと別のキーに置き換わります。この時点でうまくいかなさそう...)
それらを環境変数に指定してterraform plan
を実行すると、(案の定)エラーとなり、以下のようなメッセージが表示されました。
╷
│ Error: error configuring Terraform AWS Provider: error validating provider credentials: error calling sts:GetCallerIdentity: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, api error InvalidClientTokenId: The security token included in the request is invalid.
│
│ with provider["registry.terraform.io/hashicorp/aws"],
│ on main.tf line 14, in provider "aws":
│ 14: provider "aws" {
│
╵
Cloud9用のキーのためか、Terraformでは使えませんでした。
説明した際に用いたような、専用のIAMユーザを作る必要がありそうです。
おわりに
今回はTerraformで簡単な構成作成例をまとめてみました。
今までTerraformはとっつきにくそうだな、というイメージがあったのですが、実際使ってみるとそうでもありませんでした。
Terraformをこれから触る方は参考にしていただければ幸いです。
参考:TerraformのAWS Providerのリファレンス
いつか使う機会があった場合のメモとして。