【Terraform】尝试使用terraform import

首先

由于以前在工作中使用了terraform import命令来导入AWS现有的基础设施,为了加深知识的牢固程度,我想把这个经验写成文章。

“Terraform import” 是什么意思?

这是一个将现有基础设施置于Terraform管理之下的命令。

在使用AWS上对内容进行修改后,需要将其反映到Terraform上。

前提

这次我们使用了事先准备的Terraform代码。

 

本文介绍的代码与此处所提及的相同。

 

Terraform的版本信息如下。

% terraform --version
Terraform v1.1.8
on darwin_amd64
+ provider registry.terraform.io/hashicorp/aws v4.22.0

Your version of Terraform is out of date! The latest version
is 1.2.5. You can update by downloading from https://www.terraform.io/downloads.html
%

进行terraform import的步骤

我计划为本次考试创建一个AWS S3并尝试导入文件。

创建S3

我会在AWS手动创建以下配置的S3。
※关于如何创建S3的方法和说明将不在此讨论范围。

設定項目内容備考BucketNametestbucket0717設定AWS Regionap-northeast-1デフォルトObject OwnershipACLs disabledデフォルトBlock Public Access settings for this bucketBlock all public accessデフォルトBucket VersioningDisabledデフォルトTagsKey:Name
Value:testbucket設定Default encryptionDisableデフォルト

创建s3.tf文件

在作業目录(ec2_create_code)下创建一个名为s3.tf的文件,内容留空。

# ----------------------------------
# S3
# ----------------------------------
resource "aws_s3_bucket" "s3" {
}

执行terraform import

执行以下命令。

terraform import aws_s3_bucket.s3 バケット名

成功导入!如果输出出现“无问题”,即可。

% terraform import aws_s3_bucket.s3 testbucket0717
aws_s3_bucket.s3: Importing from ID "testbucket0717"...
aws_s3_bucket.s3: Import prepared!
  Prepared aws_s3_bucket for import
aws_s3_bucket.s3: Refreshing state... [id=testbucket0717]

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.tfstate文件将在工作目录中创建。
※terraform.tfstate文件用于保存管理目标基础架构和配置的状态。

{
  "version": 4,
  "terraform_version": "1.1.8",
  "serial": 70,
  "lineage": "*****************************",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "aws_s3_bucket",
      "name": "s3",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "acceleration_status": "",
            "acl": null,
            "arn": "arn:aws:s3:::testbucket0717",
            "bucket": "testbucket0717",
            "bucket_domain_name": "testbucket0717.s3.amazonaws.com",
            "bucket_prefix": null,

执行terraform plan。

执行terraform plan命令,确保已反映已导入的内容。
* 由于该命令用于在对资源进行更改之前进行确认,因此可以随时执行,不会有任何问题。

  # aws_s3_bucket.s3 will be updated in-place
  ~ resource "aws_s3_bucket" "s3" {
      + force_destroy               = false
        id                          = "testbucket0717"
      ~ tags                        = {
          - "Name" = "testbucket" -> null
        }
      ~ tags_all                    = {
          - "Name" = "testbucket"
        } -> (known after apply)
        # (8 unchanged attributes hidden)


        # (2 unchanged blocks hidden)
    }
由于s3.tf文件未被修改,如果继续执行apply,则资源将被删除。即使执行terraform import,tf文件本身也不会被更改。

修正s3.tf。

在查看terraform.tfstate文件的同时,对s3.tf进行修改。

# ----------------------------------
# S3
# ----------------------------------
resource "aws_s3_bucket" "s3" {
  bucket = "testbucket0717"

  tags = {
    Name = "testbucket"
  }

  tags_all = {
    Name = "testbucket"
  }
}

再次执行terraform plan。

再次执行terraform plan命令,确认没有任何变更。

如果在执行结果中显示“没有变化”,那就没有问题。

No changes. Your infrastructure matches the configuration.

请引用以下内容:

 

广告
将在 10 秒后关闭
bannerAds