HomeBlogGitHub

Một case terraform import state hơi lạ mình đã gặp

14 May, 2023 - 2 min read

Tổng quan

Như một ngày bình thường mình nhận task từ leader. Nhiệm vụ của mình là import 1 AWS cognito user được tạo bằng tay trên AWS console vào terraform để quản lý bằng IAC.

Ban đầu mình nghĩ nó cũng chỉ là 1 case import khá là bình thường và mình vào docs của terraform aws_cognito_user để xem.

Sau khi viết tf code mình thực hiện import state

Cú pháp import rất đơn giản:

terraform import aws_cognito_user.user user_pool_id/name

Mình apply ngay với case của mình:

terraform import aws_cognito_user.org_user user_pool_id/org/name

Thì tuyệt vời lỗi đập ngay vào mặt mình

error importing Cognito User. Must specify user_pool_id/username

Câu chuyện bắt đầu

Solutions

Mình nhận thấy user của mình hơi đặc biệt 1 chút. User name là: org/name có 1 dấu / dẫn tới khi import cú pháp của mình có 2 dấu /.

Mình đoán rằng terraform nó không tách biệt được userpoolid và user_name để thực hiện import.

Mình mò vào github và search đoạn code import của terraform.

Quả nhiên điều mình đoán đã đúng. Code hiện tại của terraform-provider-aws không support để import user có dấu /.

Mình quyết định tìm hướng giải quyết khác:

  • tạo pull request để support case này vào terraform-provider-aws
  • kéo terraform state từ s3 về local, sửa lại và push force lên S3

Sau khi căn nhắc mình quyết định giải quyết theo solution 2. Lý do là mình lười =)) và không biết nếu tạo PR thì bao giờ code của mình được merge, lúc đó lại phát sinh các vấn đề về update version của aws provider.

Và dưới đây là script mình đã viết để handle issue trên:

#!/bin/bash
teraform state pull > current.tfstate

jq '.resources[.resources| length] |= . + {
    "mode": "managed",
    "type": "aws_cognito_user",
    "name": "cognito_user",
    "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
    "instances": [
      {
        "schema_version": 0,
        "attributes": {
          "enabled": true,
          "force_alias_creation": null,
          "id": "user_pool_id/org/name",
          "status": "FORCE_CHANGE_PASSWORD",
          "sub": "1f152319-4321-4507-b315-54e34ba4cded",
          "temporary_password": null,
          "user_pool_id": "user_pool_id",
          "username": "org/name",
          "validation_data": null
        },
        "sensitive_attributes": [],
        "private": "bnVsbA==",
        "dependencies": []
      }
    ]
  }' current.tfstate > new.tfstate

terraform state push -force new.tfstate

Đến đây mình chạy lại terraform apply để cho các attributes của nó được match với terraform state.

Vậy là xong cho 1 ticket ngày hôm nay...

© 2023, Built with

Gatsby