Terraformメモ
検証用リポジトリ
provider
デフォルトリージョンやプロファイルの指定
これがないと都度リージョン指定を促される
code:default settings
provider "aws" {
profile = "default" # ~/.aws/config のプロファイル
region = "ap-northeast-1"
}
デフォルトVPCがないとapply時にエラーとなる
code:デフォルトVPCの作成
$ aws ec2 --region ap-northeast-1 create-default-vpc
plan/apply
マークの意味
+ マーク
新規作成
~ マーク
既存のリソースの設定を変更する
-/+ マーク
既存のリソースを削除して新しいリソースを作成する
リソースの削除を伴うため、ダウンタイムを許容できるか要検討
デバッグ
$ TF_LOG=debug TF_LOG_PATH=/tmp/terraform.log terraform apply
<trace, debug, info, warn, error>
特定の resource のみ apply する
$ terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
設計
環境分割
dev, staging, production など
変数
カレントディレクトリに terraform.tfvars が存在すると自動で読み込まれる
terraform のバージョンなど、変数を使えない一部の argument では値をハードコーディングする必要がある
コンポーネント分割
ネットワーク、ストレージ、DB、アプリケーションなどの単位で
tfstate が分かれることになる
terraform の apply 時間の短縮にもつながる
他のコンポーネント(e.g. ネットワークなど)の参照はタグベースにすれば tfstate を直接参照する必要がなくなる
例えば DB などのステートフルなリソースは隔離する
Terraformer
既存リソースのインポート
ある程度ベストプラクティスに近い構造で生成される?
ひとまず apply してみて、terraformer でインポートしたら構造をキレイにできる?
使ってみた感想
インポートするリソースを指定する必要がある
未対応のリソースはインポートできない
* ですべてのリソースを指定可能
作成していないリソース含めてインポートされるため非常に時間がかかる
リソースは明示的に指定して絞り込む方が無難
というかエラーとなり全リソースインポートはうまくいかなかった
リソース名がIDを基にした命名のためヒューマンリーダブルでない
lifecycle
create_before_destroy (bool)
true: リソースを作成してからリソースを削除する
false: リソースを削除してからリソースを作成する (default)
prevent_destroy (bool)
true であればリソースの削除を防止する
ignore_changes (list of attribute names)
無視したい属性があればリスト形式で指定する
ACM
aws_acm_certificateの apply と desttroy を繰り返していたところ次のエラーメッセージが表示された
you have reached your limit of 20 certificates in the last year.
文字通り年間のACM証明書作成上限を超過してしまったのが原因
ひとまずサポートセンターに問い合わせているがどうなるかは不明
回避策としては destroy 前に以下のように tfstate から除外するか、そもそも terraform で管理しないにようにするのが得策かと思われる
code:workaround
# list all resources
terraform state list
# remove that resource you don't want to destroy
# you can add more to be excluded if required
terraform state rm <resource_to_be_deleted>
# destroy the whole stack except above resource(s)
terraform destroy
参考
遭遇したエラー
code:error
Error: InvalidParameterException: The target group with targetGroupArn arn:aws:elasticloadbalancing:ap-northeast-1:878669185678:targetgroup/example/472210b6c64da215 does not have an associated load balancer. "example"
on ecs.tf line 44, in resource "aws_ecs_service" "example":
44: resource "aws_ecs_service" "example" {
workaround
原因は ALB に紐づくターゲットグループやリスナーの生成前に ECS のサービスを起動しようとしていたため
resoruce aws_ecs_service に depends_on = [aws_lb_target_group.example, aws_lb_listener_rule.example] を追記して回避
code:error
Error: This resource requires GitHub organization to be set on the provider.
on codepipeline.tf line 155, in resource "github_repository_webhook" "example":
155: resource "github_repository_webhook" "example" {
workaround
provider.github v2.9.2 時点で individual = true にしてもエラー内容は変わらず
暫定措置として、仮の organization を作成し repository を移譲して回避した
Related Issues
参考