AWS
Terraform
ECS
Fargate
iRidgeDay 23

terraformでECS環境(Fargate)をぶち上げる

月初のre:InventでFargateが発表されてECSを使ってみたい欲が高まったので、terraformでFargateを利用したECS環境の構築をしてみました。

使うもの

  • terraform 0.11.1
  • terraform-provider-aws 1.6
  • awsアカウント

コード

githubにあげてみました。(手元で動作確認して動いたんですが、動かなかったらすみません、、)
https://github.com/yukkyun/terraform-ecs-sample

実行方法

  1. main.tfのprofileを自分の環境のaws profile名に書き換えてください。
  2. あとは普通にterraformを実行

    $ terraform init
    $ terraform plan
    $ terraform apply
    
  3. 終わったら下記コマンドでalbのDNS名を取得

    $ terraform state show aws_lb.alb
    
  4. 3.で取得したDNS名にブラウザでアクセス、Nginxのデフォルトページが表示されたら成功!

ハマった箇所

logging driver awsを使う場合、ロググループを先に作っておく必要がある

logging driver awsを利用する場合はタスク定義でログの出力先に指定したロググループを事前に作っておく必要があるようです。
タスクに対してAmazonECSTaskExecutionRolePolicyみたいなpolicyを割り当てたRoleを適用していたのですが、このpolicyだとcloudwatchlogsのロググループは作成してくれないようで(そもそも作成してくれるのかはわからないが、、、)、延々タスクが作成されてはストップされるという挙動を繰り返しました。。サンプルで作成したterraformではcloudwatchlogsのロググループを事前に作成するようにしています。

ENIにpublicIPを持たせない場合、NATが無いとpullに失敗して、taskが立ち上がらない

タスク作成時にpublicIPの自動付与という設定があるのですが、こいつを無効にしているとdocker pullに失敗しタスクが立ち上がりません。ロググループの時と同様、延々タスクが作成されてはストップという挙動を繰り返しました。。無効にする場合はNATゲートウェイを作成するようにしましょう。

タスクが立ち上がらない場合のデバッグ方法がわからなかった

↑に書いたように、タスクがうまく立ち上がらないと謎にストップスタートを繰り返します。ECSの管理画面は機能のタブが色々有り、どこのログを見てデバッグすればいいかがわかりにくかったです。AWSの公式ドキュメントにはちゃんと書いてあったので、すぐ調べれば良かったなーと思いました、、

まとめ

terraformでECS環境を作ってみることでいろいろ勉強になりました。今後はオートスケールとかblue-green deploymentとかにもチャレンジしてみたいですね。