「AWS無料相談会」をオンラインで開催中

AWSリソースをTerraform管理下から外す・追加する

筈井です。

田舎暮らし×リモートワーク を実践して1ヶ月が経ちました。

豊かな自然が織りなす美しい風景に癒やされながら日々仕事をしています。

さて、MMMでは運用するAWSアーキテクチャの構成管理にTerraformを採用しています。

運用の中で、手動で作成したインフラをTerraformのコード管理下に合流させたり、
逆に管理下から外したりする場面もあるのですが、今回はこちらの方法について解説していきます。

AWSリソースを管理するTerraformの状態を確認

Terraformで作成したAWSリソースに関する構成管理情報は terraform.tfstate というファイルに記録されています。

この構成管理情報を参照するには terraform state list コマンドを実行します。下記実行例です。

# 一覧表示
$ terraform state list

data.aws_acm_certificate.sample
aws_ecs_cluster.sample
aws_ecs_service.sample
aws_ecs_task_definition.sample
・
・
・
aws_vpc.sample

terraform destroy でリソースを削除していた場合、 terraform state list コマンドの実行結果には表示されません

ちなみに terraform state show <リソースタイプ>.<リソース名> と実行すると、
特定のリソースの詳細を確認することが出来ます。

<リソースタイプ>.<リソース名> の箇所は terraform state list コマンドの出力結果をそのまま使用すればOKです。

例えば aws_ecs_cluster.sample の場合、aws_ecs_cluster<リソースタイプ> に、
sample<リソース名> に相当します。

下記実行例です。

# 状態確認
$ terraform state show aws_ecs_cluster.stg

# aws_ecs_cluster.sample:
resource "aws_ecs_cluster" "sample" {
    arn                = "arn:aws:ecs:ap-northeast-1:************:cluster/sample-cluster"
    capacity_providers = []
    id                 = "arn:aws:ecs:ap-northeast-1:************:cluster/sample-cluster"
    name               = "sample-cluster"
    tags               = {}

    setting {
        name  = "containerInsights"
        value = "disabled"
    }
}

Terraform管理下から特定のリソースを外す

作成済みのAWSリソース・削除済みのAWSリソースを、Terraform管理下から外す場合、 terraform state rm コマンドを使用します。

$ terraform state rm <リソースタイプ>.<リソース名>

下記実行例です。

$ terraform state rm aws_ecs_cluster.sample

Removed aws_ecs_cluster.sample
Successfully removed 1 resource instance(s).

Terraform管理下に既存のAWSリソースを追加する

Terraformの管理外で作成したAWSリソースを、Terraform管理下に追加したい場合、
terraform import コマンドを使用します。

まずはTerraformコードにリソースブロックを記述し、Terraformが人気する名前を設定してください。

たとえばセキュリティグループを追加したい場合は下記のように記述します。

resource "aws_security_group" "sample" {
  # ...instance configuration...
}

次にインポートを実行します。AWSコンソールから対象リソースのIDを確認し、
下記のように実行します。

$ terraform import aws_security_group.sample sg-0eed97aa6********

aws_security_group.sample: Importing from ID "sg-0eed97aa6********"...
aws_security_group.sample: Import prepared!
  Prepared aws_security_group for import
  Prepared aws_security_group_rule for import
  Prepared aws_security_group_rule for import
aws_security_group_rule.sample: Refreshing state... [id=sgrule-**********]
aws_security_group.sample: Refreshing state... [id=sg-0eed97aa6********]
aws_security_group_rule.sample-1: Refreshing state... [id=sgrule-**********]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

terraform state コマンドを実行すると、aws_security_group.sample がリストに追加されているかと思います。

まとめ

AWSリソースをTerraformの管理下に追加・削除する方法について解説しました。

上記の手法を駆使すると、AWSコンソール上で手動作成した既存インフラをTerraformによるコード管理に合流させることができます。
また、1つのシステムの本番稼働環境と検証用環境を、別々のTerraformコードリポジトリで管理するような変更を加えることも可能です。

以上、なにかの参考になれば幸いです。