🛕

これだけ押さえる!Terraformで一時的にリソースを管理対象外にする手順

2024/06/26に公開

概要

Terraformで一時的に特定のリソースを管理対象外にし、予期せぬ変更の適用を除外するための手順。
terraform state と terraform import を使用します。

for_each版は、これだけ押さえる!Terraformで一時的にリソースを管理対象外にする手順(for_each版)に書いています。

手順

今回、Slackチャンネル構成のリソース・スキーマであるawscc_chatbot_slack_channel_configuration(ローカル名: notification_slack_channel)を例に操作していきます。

(1) 初期化

まず、作業ディレクトリを初期化して、リモートの変更等を取り込みます。

実行コマンド
terraform init

(2) 管理対象外としたいリソースのstateを検索

まずは、管理対象外としたいリソースのstateを検索します。
出力結果は(3)以降で使うので、しっかりメモしておきましょう。

実行コマンド
# state全て
terraform state list
# リソース・タイプで絞り込む場合
terraform state list | grep awscc_chatbot_slack_channel_configuration

※以下、コンソール出力結果(resourceで絞り込んだ場合)

コンソール出力結果
module.system.awscc_chatbot_slack_channel_configuration.notification_slack_channel

(3) stateの詳細確認 → ARNのメモ

(2) の出力結果を用いて、管理対象外とするstateの詳細を確認します。

実行コマンド
terraform state show module.system.awscc_chatbot_slack_channel_configuration.notification_slack_channel

以下のように、リソースブロックが出力されるので、ARN(以下の結果だと、arn:aws:chatbot::123456789012:chat-configuration/slack-channel/hoge-fuga-piyo-notification-channel)を控えておきます。

※以下、コンソール出力結果

コンソール出力結果
# module.system.awscc_chatbot_slack_channel_configuration.notification_slack_channel:
resource "awscc_chatbot_slack_channel_configuration" "notification_slack_channel" {
    arn                = "arn:aws:chatbot::123456789012:chat-configuration/slack-channel/hoge-fuga-piyo-notification-channel"
    configuration_name = "hoge-fuga-piyo-notification-channel"
    guardrail_policies = [
        "arn:aws:iam::123456789012:policy/hoge-fuga-piyo-notification-chatbot-channel-policy",
    ]
    iam_role_arn       = "arn:aws:iam::123456789012:role/hoge-fuga-piyo-notification-chatbot-channel-role"
    id                 = "arn:aws:chatbot::123456789012:chat-configuration/slack-channel/hoge-fuga-piyo-notification-channel"
    logging_level      = "INFO"
    slack_channel_id   = "X00XXXX0XX0"
    slack_workspace_id = "XXXXX0XXX"
    sns_topic_arns     = [
        "arn:aws:sns:ap-northeast-1:123456789012:hoge-fuga-piyo-aaa-pipeline-notification",
        "arn:aws:sns:ap-northeast-1:123456789012:hoge-fuga-piyo-bbb-pipeline-notification",
        "arn:aws:sns:ap-northeast-1:123456789012:hoge-fuga-piyo-ccc-layer-pipeline-notification",
    ]
    user_role_required = false
}

(4) 当該stateを管理対象外に

(2) の出力結果を用いて、stateを削除します

実行コマンド
terraform state rm module.system.awscc_chatbot_slack_channel_configuration.notification_slack_channel

※以下、コンソール出力結果

コンソール出力結果
Removed module.system.awscc_chatbot_slack_channel_configuration.notification_slack_channel
Successfully removed 1 resource instance(s).

(5) resourceブロックをコメントアウト

tfファイルのresourceブロックの対象箇所を選択&「Ctrl + /」でコメントアウトした後、保存。
※ソースコードをGit管理していて上記でコメントアウトできない場合は、当該箇所を削除の上保存。

(6) terraform コマンドの実行

以下のコマンドを順に実行して適用したい変更を反映させます

実行コマンド
# 差分確認
terraform plan
# 適用
terraform apply -auto-approve

※ちなみに、差分がない場合は下数行に以下のように出る

コンソール出力結果
No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

(7) コメントアウトの戻し

変更適用後、(4) で作成したコメントアウトを戻します
tfファイルのresourceブロックの対象箇所を選択&「Ctrl + /」でコメントアウトを外したら、保存。

※ソースコードをGit管理していて、(4) で対象箇所を削除した場合は以下のコマンドを実行して戻す

実行コマンド
git checkout .

(8) 削除したリソースのインポート

(4) で管理対象外としたリソースをインポートして戻します。

実行コマンド
terraform import module.system.awscc_chatbot_slack_channel_configuration.notification_slack_channel arn:aws:chatbot::123456789012:chat-configuration/slack-channel/hoge-fuga-piyo-notification-channel

ここで、terraform importの引き数について、

  • 第1引数: (2) の出力結果
  • 第2引数: (3) で控えたARN

となります。
(3) でARNを控え忘れた場合は、AWSコンソール等から確認しましょう。

経緯

今回の手順に至った経緯です。
ある日、terraformコマンドでAWS環境に変更を反映しようとしたところ、身に覚えのない以下の差分が出てしまいました、、

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following
symbols:
  ~ update in-place

Terraform will perform the following actions:

  # module.system.awscc_chatbot_slack_channel_configuration.notification_slack_channel will be updated in-place
  ~ resource "awscc_chatbot_slack_channel_configuration" "notification_slack_channel" {
        id                 = "arn:aws:chatbot::123456789012:chat-configuration/slack-channel/hoge-fuga-piyo-notification-channel"
      + tags               = (known after apply)
        # (9 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

タグの追加だから変更適用すればいいか、と実行したものの時間がかかりすぎてダメ(そもそもアクセス権自体なさそうだった)

以下のように、変更を無視するための記述を追加して、タグに対する変更を適用対象外としてもダメ

resource "awscc_chatbot_slack_channel_configuration" "xxxxx" {
  (省略)
  lifecycle {
    ignore_changes = [
      tags,
    ]
  }
}

やむを得ないので、手順のようにterraform stateで当該リソースを管理対象外とし、終わった後に戻す、という処置をとりました。

参考

公式

その他

Discussion