尝试使用Terraform导入S3资源:① Terraform导入编辑
我想做的事情
我想用Terraform管理手动创建的S3资源?这次是在这里。
我想将事先写好的3个存储桶策略整体导入到tf文件中(AWS)。
前提是需要有一种理论或前提条件,以便理解或进行后续的讨论、分析或探讨。
・AWS账号已创建
・已创建AWS IAM用户,并已发行访问键和秘密键
・已安装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”权限,因为与“阻止公开访问”有关,最好避免使用它…
– 此次选择与“阻止公开访问(桶设置)”无关的“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的导入功能。
如果您在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"
},
最后,让我们通过terraform确认是否可以删除资源。
terraform destroy
资源已被删除,这是在说!
Destroy complete! Resources: 2 destroyed.
结束
辛苦了!這次想做的事情終於完成了!
– 我想用Terraform管理手動創建的S3資源,可以使用?terraform import來實現!
– 我想將之前在AWS上編寫的S3存儲桶策略完整地引入到tf文件中,可以在下次做。?
参考网站
多亏了这个网站,我学到了很多!非常感谢!