terraform import手順

簡単な例でS3バケットのimportをしてみる。 先に書いておくと、terraform importは現状のAWSリソースの情報をいい感じにterraformのtfファイルに書き起こしてくれるわけではなく、tfstateファイルにリソース情報を記録してくれるだけ。 あとはterraformのドキュメントとtfstateファイルを参考にtfファイルを手書きする感じとなる。

1. importしたいリソースをmain.tfに記載

resource (リソースタイプ) (リソース名) の形式で記載する。 ※リソース名はterraform内の識別名

resource "aws_s3_bucket" "test" {
}

2. terraform importコマンドでterraform.tfstateファイルに状態を保存

terraform import (リソースタイプ).(リソース名) (importするリソースID)の形式でコマンドを実行する。 ※S3バケットの場合importするリソースIDはバケット名

terraform import aws_s3_bucket.test tomohiko.io

※もしエラーが出たらterraform initを実行してAWSプラグインをインストールする

3. terraform.tfstateファイルからmain.tfファイルに必要なパラメータを抜き出しmain.tfファイルに記載

terraform.tfstateファイルにimportしたリソースの状態が記録されるので、その情報とterraformのドキュメントを参考にmain.tfファイルを完成させる。

※デフォルト設定のS3を作成するだけならbucketの指定だけで大丈夫です。

resource "aws_s3_bucket" "test" {
  bucket = "tomohiko.io"
}

個人的ハマりポイント

IAM Role

IAM Roleを定義するためには下記3つのresourceと1つのdataを定義する必要がある。

policy

  • aws_iam_role
  • aws_iam_policy_document
  • aws_iam_role_policy

data

  • aws_iam_policy_document

自分の書いたコードの一部を抜粋するとこんな感じ。

resource "aws_iam_role" "IAMロール名" {
  name               = "IAMロール名"
  assume_role_policy = "${data.aws_iam_policy_document.IAMロール名.json}"
}

data "aws_iam_policy_document" "IAMロール名" {
  statement {
    actions = ["sts:AssumeRole"]

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

resource "aws_iam_role_policy" "IAMロール名" {
  name   = "IAMロール名"
  role   = "${aws_iam_role.IAMロール名.id}"
  policy = "${data.aws_iam_policy_document.IAMロール名-policy.json}"
}

data "aws_iam_policy_document" "IAMロール名-policy" {
  statement {
    actions = [
        "s3:*"
    ]
    resources = [ "*" ]
  }
}

ECS

コンテナ起動時にこんな感じのエラーが出る

CannotPullContainerError: API error (500): Get https://111122223333.dkr.ecr.us-east-1.amazonaws.com/v2/: net/http: request canceled while waiting for connection"

AWSのドキュメントに全て書いてあるが、パブリックサブネット+パブリックIP自動割当じゃないとインターネットに接続できず、コンテナイメージをプルできないため。 (もしくはIP自動割当OFF+NATゲートウェイを設置&ルーティング設定)

コンテナイメージをプルできないエラー - Amazon Elastic Container Service