尝试使用Terraform导入S3资源:② 使用Terraform import block版

我想做的事情 (Wǒ zuò de

我想用terraform来管理手动创建的S3资源,上一次已经成功了。

 

我想将事先编写的3个存储桶策略完整地导入到tf文件中,这次是在这个位置上。

前提 tí)

・已创建AWS账户
・已创建AWS IAM用户,并已分发access_key和secret_key
・已安装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”的allow权限相关的,最好避免与阻止公共访问有关的问题。
·此次选择与阻止公共访问(存储桶设置)无关的“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_block.tf(import blockのお試し)
  ┗━ s3.tf(import blockお試しにより作成されたやつ)

请用汉语将以下内容转述一次:

源代码内容

主要.tf

在main.tf文件中,通常会写入一些整个项目共享的重要设置,比如”AWS提供商的设置”。

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

variables.tf变量。

・在variables.tf中编写适用于所有资源的变量
・已将区域设置为东京,但可以根据需要进行更改
・使用事先生成的access_key和secret_key

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

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

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

导入模块 “import_block.tf”。

・尝试使用Terraform import block的测试文件。

import {
  id = "terraform-test-import-20230828" # リソースの識別子
  to = aws_s3_bucket.bucket             # ローカルのimport先
}

import {
  id = "terraform-test-import-20230828" # リソースの識別子
  to = aws_s3_bucket_policy.s3          # ローカルのimport先
}

尝试使用Terraform的import块。

上一次,通过terraform import我已经能够将AWS的S3资源导入本地并进行管理了!

然而,还有一个问题存在。。。

导入的S3资源的内容只会自动写入terraform.tfstate文件中,而tf文件则一直为空状态。。。

如果想要更改在AWS端设置的存储桶策略,
需要手动从terraform.tfstate文件中将存储桶策略内容复制并粘贴到tf文件中进行编辑,或者从头开始将存储桶策略写入tf文件中…有些麻烦…

导入时,有没有办法将数据写入terraform.tfstate文件和tf文件两个文件中?

该轮到Terraform的import模块上场了!!!

首先,确保在AWS上存在S3存储桶及其桶策略~ (由于上次在最后使用terraform destroy删除了资源,请不要忘记重新创建)

※注意
若在AWS端没有资源的情况下进行操作,导入时可能会出现以下错误,请注意。
Error: Cannot import non-existent remote object

在本地,准备好 import_block.tf 文件,然后执行 terraform plan 命令。

在这里,希望你注意的是,不再需要执行terraform import,反而只需要执行terraform plan就可以了。

terraform plan -generate-config-out='s3.tf'

当在命令行中使用”generate-config-out=’s3.tf'”时,Terraform会将S3资源的导入语句写入import_block.tf并将其本地导入。

据说可以将S3的状态写入到terraform.tfstate,并创建名为s3.tf的tf文件,并为我们创建资源!

注意:只需要执行terraform plan就可以了,不需要执行terraform import。

以下结果显示导入成功!

Plan: 2 to import, 0 to add, 0 to change, 0 to destroy.

当我检查VSCODE时,我发现terraform.tfstate已经被写入并且s3.tf也被自动创建了!!

# __generated__ by Terraform
# Please review these resources and move them into your main configuration files.

# __generated__ by Terraform from "terraform-test-import-20230828"
resource "aws_s3_bucket_policy" "s3" {
  bucket = "terraform-test-import-20230828"
  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\"}"
}

# __generated__ by Terraform from "terraform-test-import-20230828"
resource "aws_s3_bucket" "bucket" {
  bucket              = "terraform-test-import-20230828"
  bucket_prefix       = null
  force_destroy       = null
  object_lock_enabled = false
  tags                = {}
  tags_all            = {}
}

这样,资源会自动写入桶和桶策略,非常方便!!

然后,与前半部分相同,将标签放入存储桶,并将存储桶策略从Allow更改为Deny,尝试操纵AWS的S3资源吧~

# __generated__ by Terraform
# Please review these resources and move them into your main configuration files.

# __generated__ by Terraform from "terraform-test-import-20230828"
resource "aws_s3_bucket_policy" "s3" {
  bucket = "terraform-test-import-20230828"
 #見づらいけど、Allow→Deny
  policy = "{\"Statement\":[{\"Action\":\"s3:*\",\"Condition\":{\"IpAddress\":{\"aws:SourceIp\":\"54.240.143.0/24\"},\"NotIpAddress\":{\"aws:SourceIp\":\"54.240.143.188/32\"}},\"Effect\":\"Deny\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::terraform-test-import-20230828/*\",\"Sid\":\"\"}],\"Version\":\"2012-10-17\"}"
}

# __generated__ by Terraform from "terraform-test-import-20230828"
resource "aws_s3_bucket" "bucket" {
  bucket              = "terraform-test-import-20230828"
  bucket_prefix       = null
  force_destroy       = null
  object_lock_enabled = false
  tags                = { Name = "test" } #ここでタグを追加
  tags_all            = {}
}

这次只需要计划,不需要生成配置文件。

terraform plan 

如果看到以下的内容,就代表成功。

Plan: 2 to import, 0 to add, 2 to change, 0 to destroy.

然后,将它部署到AWS上

terraform apply 
Apply complete! Resources: 2 imported, 0 added, 2 changed, 0 destroyed.
image.png

结束

辛苦了!我成功完成了这次想做的事情!
– 我想在terraform中管理手动创建的S3资源。
⇒ ?我上次通过terraform import成功了!

 

如果想要将事先编写的S3存储桶策略完整地引入tf文件,你可以使用?import block,它会自动生成tf文件并将S3存储桶策略的内容引入其中!

请参考以下网站

 

广告
将在 10 秒后关闭
bannerAds