尝试使用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存储桶以及其策略
(除了存储桶策略外,所有其他设置都已经完成)。
{
"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文件,并为我们创建资源!
以下结果显示导入成功!
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.
结束
辛苦了!我成功完成了这次想做的事情!
– 我想在terraform中管理手动创建的S3资源。
⇒ ?我上次通过terraform import成功了!
如果想要将事先编写的S3存储桶策略完整地引入tf文件,你可以使用?import block,它会自动生成tf文件并将S3存储桶策略的内容引入其中!
请参考以下网站