【Terraform】 ECS/IAM作成手順まとめ

4 min read読了の目安(約4100字

参考文献

Terraformインストール手順

◆ 最新バージョンの確認

◆ インストールコマンド

$ sudo yum install wget unzip
$ wget https://releases.hashicorp.com/terraform/0.12.25/terraform_0.12.25_linux_amd64.zip
$ sudo unzip ./terraform_0.12.25_linux_amd64.zip -d /usr/local/bin/
$ terraform -v

◆ tfenvを利用したバージョン管理

  • tfenv:Terraformのバージョン管理に特化したツール
//git clone 〜 パス設定
$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
$ echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

//tfenvインストール
$ tfenv install latest
$ tfenv use latest
$ tfenv list

terraform用語

用語 意味
State Terraformで管理するリソースの状態。.tfstateのこと
tf.state ローカルにtfstateファイルが生成されるが、S3で管理するのが基本
Backend Stateの保存先。 ※S3など
Resource Terraformで管理する対象の基本単位
Module Resourceを再利用するためにまとめたTerraformのコード

初期設定

◆ terraform.tfvars定義

$ cat >> ./terraform.tfvars  << FIN
access_key = "*****************"
secret_key = "*****************"
db_user = "XXXXX"
db_pass = "XXXXXXXXX"
FIN

◆ terraform workspace作成

$ terraform workspace new development
$ terraform workspace select development

◆ S3用のprofile作成 ※tfstate格納用

$ aws configure --profile s3-profile

main.tf

// 変数を定義 ※terraform.tfvars参照
variable "access_key" {}
variable "secret_key" {}
variable "token" {}
variable "db_user" {}
variable "db_pass" {}
variable "region" { default = "ap-northeast-1"}

// S3にtfstateを格納
terraform {
  backend "s3" {
    bucket = "sample-project"
    key    = "sample-project.terraform.tfstate"
    region     = "ap-northeast-1"
    profile = "sample-profile"
  }
}

// プロバイダ設定  ※上記変数参照
provider "aws" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region     = "${var.region}"
}

// modulesのソースを指定
module "base" {
  region                            = "${var.region}"
  db_user                           = "${var.db_user}"
  db_pass                           = "${var.db_pass}"
  source = "./modules"
}

ecs.tf

resource "aws_ecs_cluster" "ecs_cluster" {
  name = "sample-cluster"
}

IAM Policy / IAM Role作成

data "aws_iam_policy_document" "samplepolicy" {
  statement {
    actions = [
      "s3:PutObject",
      "s3:GetObject",
    ]

    resources = [
      "arn:aws:s3:::foo-bucket/*",
    ]
  }
}

resource "aws_iam_policy" "samplepolicy" {
  name        = "samplepolicy"
  path        = "/"
  description = ""
  policy      = data.aws_iam_policy_document.samplepolicy.json
}

data "aws_iam_policy_document" "samplerole_assume_policy" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ecs-tasks.amazonaws.com"]
    }
  }
}

resource "aws_iam_role" "samplerole" {
  name               = "samplerole"
  assume_role_policy = data.aws_iam_policy_document.samplerole_assume_policy.json
}

resource "aws_iam_role_policy_attachment" "samplerole_attachement" {
  role       = aws_iam_role.samplerole.name
  policy_arn = aws_iam_policy.samplepolicy.arn
}