尝试使用Terraform导入S3资源:① Terraform导入编辑

我想做的事情

我想用Terraform管理手动创建的S3资源?这次是在这里。

我想将事先写好的3个存储桶策略整体导入到tf文件中(AWS)。

 

前提是需要有一种理论或前提条件,以便理解或进行后续的讨论、分析或探讨。

・AWS账号已创建
・已创建AWS IAM用户,并已发行访问键和秘密键
・已安装Terraform
・已安装AWS CLI
・已安装VSCODE
(可使用你喜欢的编辑器)

在AWS上,已经手动创建了S3存储桶和其策略
(除了存储桶策略之外的设置,全部都已经完成)。

image.png
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::terraform-test-import-20230828/*"
            ],
            "Condition": {
              "IpAddress": {"aws:SourceIp": "設定したいIP"},
              "NotIpAddress": {"aws:SourceIp": "設定したいIP"}
            }
        }
    ]
}
POLICY
}
※補充
– 由于“桶策略”并非此次的重点,因此无论内容如何都可以。但在某些情况下,可能会出现无法正确设置的“阻止公开访问(桶设置)”问题。
– 特别是关于“s3:GetObject”权限,因为与“阻止公开访问”有关,最好避免使用它…
– 此次选择与“阻止公开访问(桶设置)”无关的“IP地址访问”策略。

环境

$ terraform -v 
Terraform v1.5.5
on windows_amd64
+ provider registry.terraform.io/hashicorp/aws v5.13.1

目录结构

root       
  ┣━ main.tf
  ┣━ variables.tf
  ┣━ terraform.tfstate(Terraform実行により作成されたやつ)
  ┣━ terraform.tfstate.backup(Terraform実行により作成されたやつ)
  ┗━ import.tf (importのお試し)

源代码的内容

主.tf

主要的.tf文件通常用于编写整体共享的重要配置,例如” AWS提供商的配置”。

# AWS プロバイダの設定
provider "aws" {
  access_key = var.access_key
  secret_key = var.secret_key
  region     = var.region
}

变量.tf

・在variables.tf文件中编写适用于所有源代码的变量
・将区域设置为东京,但可以根据需要进行更改
・使用事先生成的访问密钥和秘密密钥

variable "region" {
  default = "ap-northeast-1"
}

variable "access_key" {
  default = "自分のaccess_key"
}

variable "secret_key" {
  default = "自分のsecret_key"
}

导入 import.tf

・用于尝试Terraform导入的文件
・由于想要在进行Terraform导入后进行编辑,所以一开始只需要准备aws_s3_bucket和aws_s3_bucket_policy资源的框架即可
(先写下资源名称,并将内容完全清空也可以)

resource "aws_s3_bucket" "s3" {
  bucket = "terraform-test-import-20230828"
}

resource "aws_s3_bucket_policy" "s3" {
  bucket = aws_s3_bucket.s3.id
#   policy = <<POLICY
# {
# }
# POLICY
}
在这种状态下运行terraform plan通常会被指责说没有策略!!但是这次不是通过terraform plan,而是想要进行terraform import,所以注释掉策略是可行的(将其设置为空是必要的)。

让我们尝试使用Terraform的导入功能。

如果您在AWS上已经有资源,但想要以IaaS方式管理手动创建的资源,该怎么做呢?

到了 Terraform import 的时候了!!!

首先,在本地准备好 import.tf 文件,然后执行 terraform import 命令。

terraform import aws_s3_bucket.s3 terraform-test-import-20230828

如果这个出现了,那就是成功了。

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文件中写入一些内容。

{
  "version": 4,
  "terraform_version": "1.5.5",
  "serial": 1482,
  "lineage": "ccde992e-debb-97f0-c5bd-458b5945bd4e",
  "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:::terraform-test-import-20230828",
            "bucket": "terraform-test-import-20230828",
            "bucket_domain_name": "terraform-test-import-20230828.s3.amazonaws.com",
            "bucket_prefix": "",
            "bucket_regional_domain_name": "terraform-test-import-20230828.s3.ap-northeast-1.amazonaws.com",
            "cors_rule": [],
            "force_destroy": null,
            "grant": [
              {
                "id": "2078aa226b78698297fd9aaff292740e1c8f3ce3d6ee33fcc33cd14e0ddea4aa",
                "permissions": [
                  "FULL_CONTROL"
                ],
                "type": "CanonicalUser",
                "uri": ""
              }
            ],
            "hosted_zone_id": "Z2M4EHUR26P7ZW",
            "id": "terraform-test-import-20230828",
            "lifecycle_rule": [],
            "logging": [],
            "object_lock_configuration": [],
            "object_lock_enabled": false,
            "policy": "{\"Statement\":[{\"Action\":\"s3:*\",\"Condition\":{\"IpAddress\":{\"aws:SourceIp\":\"設定したいIP"},\"NotIpAddress\":{\"aws:SourceIp\":\"設定したいIP"}},\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::terraform-test-import-20230828/*\",\"Sid\":\"\"}],\"Version\":\"2012-10-17\"}",
            "region": "ap-northeast-1",
            "replication_configuration": [],
            "request_payer": "BucketOwner",
            "server_side_encryption_configuration": [
              {
                "rule": [
                  {
                    "apply_server_side_encryption_by_default": [
                      {
                        "kms_master_key_id": "",
                        "sse_algorithm": "AES256"
                      }
                    ],
                    "bucket_key_enabled": true
                  }
                ]
              }
            ],
            "tags": {},
            "tags_all": {},
            "timeouts": null,
            "versioning": [
              {
                "enabled": false,
                "mfa_delete": false
              }
            ],
            "website": [],
            "website_domain": null,
            "website_endpoint": null
          },
          "sensitive_attributes": [],
          "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjM2MDAwMDAwMDAwMDAsInJlYWQiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMCJ9"
        }
      ]
    }
  ],
  "check_results": null
}

在执行terraform import之前,terraform.tfstate文件几乎为空。

当执行该命令时,S3被导入并且由Terraform进行管理!

仔细观察↓↓↓,桶名称和策略等(因为本次只设置了这两个),S3的状态和元数据被写入了terraform.tfstate文件!

"bucket": "terraform-test-import-20230828"

"policy": "{\"Statement\":[{\"Action\":\"s3:*\",\"Condition\":{\"IpAddress\":{\"aws:SourceIp\":\"設定したいIP"},\"NotIpAddress\":{\"aws:SourceIp\":\"設定したいIP"}},\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::terraform-test-import-20230828/*\",\"Sid\":\"\"}],\"Version\":\"2012-10-17\"}"
※補足
terraform.tfstate是一个文件,记录了Terraform所管理资源的当前状态(terraform的执行计划)
当初次执行terraform plan时,terraform.tfstate会在本地创建,并自动写入资源的状态
之后执行terraform destroy,terraform.tfstate会被清空,但文件本身不会消失
如果从未执行过terraform plan或terraform import,那么terraform.tfstate文件应该不存在于本地。

然而,由于我对是否真正使Terraform控制下感到不安,我打算手动更改几乎空白的import.tf文件,并调整S3的设置进行尝试。

resource "aws_s3_bucket" "s3" {
  bucket = "terraform-test-import-20230828"

 #タグをいれてみる
  tags = {
    Name = "test"
  }
}

resource "aws_s3_bucket_policy" "s3" {
  bucket = aws_s3_bucket.s3.id
 #バケットポリシを手動で張り付け、AllowをDenyへ変更
 policy = <<POLICY
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::terraform-test-import-20230828/*"
            ],
            "Condition": {
              "IpAddress": {"aws:SourceIp": "設定したいIP"},
              "NotIpAddress": {"aws:SourceIp": "設定したいIP"}
            }
        }
    ]
}
POLICY
}

就这样,我添加了一个标签,并将桶策略从允许变为拒绝试试看~

为了修改Terraform的执行计划,现在执行Terraform计划命令吧。

terraform plan

这样的感觉是,当结果出来时就是成功。
添加:我说“将新的tf文件内容添加到执行计划中了”。
修改:我说“在tf文件中写的S3资源已经通过之前的导入进入terraform管理,但有一些修正。”

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

接下来,将变更部分部署到AWS端。

terraform apply

好像成功了

Apply complete! Resources: 1 added, 1 changed, 0 destroyed.

再次检查terraform.tfstate文件时,确保变更部分已正确记录在管理文件中!

"policy": "{\"Statement\":[{\"Action\":\"s3:*\",\"Condition\":{\"IpAddress\":{\"aws:SourceIp\":\"54.240.143.0/24\"},\"NotIpAddress\":{\"aws:SourceIp\":\"54.240.143.188/32\"}},\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::terraform-test-import-20230828/*\",\"Sid\":\"\"}],\"Version\":\"2012-10-17\"}",
"tags": {
              "Name": "test"
            },
image.png

最后,让我们通过terraform确认是否可以删除资源。

terraform destroy

资源已被删除,这是在说!

Destroy complete! Resources: 2 destroyed.
image.png

结束

辛苦了!這次想做的事情終於完成了!
– 我想用Terraform管理手動創建的S3資源,可以使用?terraform import來實現!
– 我想將之前在AWS上編寫的S3存儲桶策略完整地引入到tf文件中,可以在下次做。?

 

参考网站

多亏了这个网站,我学到了很多!非常感谢!

 

广告
将在 10 秒后关闭
bannerAds