IaC基础设施即代码:Terraform 通过后端使用 alicloud的OSS 实现资源管理

目录

一、实验

1.环境

2.Windows创建Terraform后端项目

3.Windows实例化Terraform后端项目

3.Windows给Terraform项目添加alicloud阿里云OSS (实现代码与资源分离)

4.Windows给Terraform项目添加封装的模块

5.Terraform通过后端使用 alicloud阿里云OSS 实现资源管理

二、问题

1.后端存储的锁机制如何实现

2.Terraform申请资源失败(NotEnoughBalance)

3.Terraform申请资源失败(ResourceNotAvailable)

4.Terraform初始资源失败(Backend configuration changed)

5.Terraform初始资源失败(provider)

6.Terraform删除资源失败(the instance name )

7. Terraform申请资源失败(Exists)

8. 阿里云Tablestore未开通

9.Terraform申请资源失败(AccessDenied)

10.阿里云OSS未开通

11.Terraform删除资源失败


一、实验

1.环境

(1)主机

表1-1 主机

主机系统软件工具备注
jia

Windows 

Terraform 1.6.6VS Code、 PowerShell、 Chocolatey
pipepointLinuxTerraform 1.6.6SSH

2.Windows创建Terraform后端项目

(1)创建项目

terraform-backend-dev

(2)创建目录envirments存放实例的配置文件

查看目录

(3)创建实例的主配置文件

main.tf

# Configure the Alicloud Provider 默认供应商
provider "alicloud" {access_key = var.access_keysecret_key = var.secret_keyregion     = "cn-hangzhou"
}# OSS
resource "alicloud_oss_bucket" "bucket-backenddev" {bucket = "tf-backenddev"acl    = "private"
}#tablestore
resource "alicloud_ots_instance" "tftabledev" {name        = "tftabledev"description = "terraform tablestore"accessed_by = "Any"tags = {Created = "TF"For     = "Building table"}
}resource "alicloud_ots_table" "basic" {instance_name                 = alicloud_ots_instance.tftabledev.nametable_name                    = "tf_devops"time_to_live                  = -1max_version                   = 1deviation_cell_version_in_sec = 1primary_key {name = "LockID"type = "String"}
}

(3)创建实例的变量配置文件

variables.tf

variable "access_key" {description = "access_key"}variable "secret_key" {description = "secret_key"
}variable "region" {type        = stringdescription = "region name"default     = "cn-hangzhou"sensitive   = true
}

(4)创建实例的版本配置文件

terraform {required_version = "1.6.6"required_providers {alicloud = {source  = "hashicorp/alicloud"version = "1.214.1"}}
}

(5) 创建实例的输出配置文件

outputs.tf

output "bucket_name" {value = alicloud_oss_bucket.bucket-devops.bucket
}output "table_name" {value = alicloud_ots_table.default.table_name
}output "myecs_public_ip" {value = module.myecs.ecs_ip
}

(6)创建实例的密钥配置文件

terraform.tfvars

access_key = "XXXXX"
secret_key = "XXXXX"

3.Windows实例化Terraform后端项目

(1)初始化

terraform init

(2)格式化代码

terraform fmtterraform fmt -recursive

(3)验证代码

terraform validate 

(4)计划与预览

 terraform plan

(5)申请资源

terraform apply

输入yes

(6)展示资源

terraform show

(10)登录阿里云系统查看

①查看Bucket 列表

② 查看Tablestore

确认公网信息

数据表列表

3.Windows给Terraform项目添加alicloud阿里云OSS (实现代码与资源分离)

(1)创建实例的后端配置文件

backend.tf

(2)初始化

terraform init

yes,系统上传配置文件到阿里云OSS


 

(3)查看目录

(4)登录阿里云系统查看

①查看Bucket 列表

配置文件已上传

② 查看Tablestore

数据详情

详情

(6)删除项目配置文件

 (5)申请资源

terraform apply

无资源变化

4.Windows给Terraform项目添加封装的模块

(1)添加模块modules

查看目录

(2)模块内容

内容与本人上一篇博客基本相同(参考)

IaC基础设施即代码:Terraform 通过模块封装实现 alicloud 资源管理-CSDN博客

单独修改地域为 cn-hangzhou,修改可用区为cn-hangzhou-j 。

(3)给dev主配置文件添加内容

查看目录

修改main.tf,添加如下内容

locals {region         = "cn-hangzhou-j"vpc_cidr_block = "172.16.0.0/12"vsw_cidr_block = "172.16.0.0/21"vpc_name       = "myvpc"
}module "myvpc" {// 模块代码路径source         = "../../modules/vpc"vpc_cidr_block = local.vpc_cidr_blockvsw_cidr_block = local.vsw_cidr_blockvpc_name       = local.vpc_name
}module "mysecgroup" {source = "../../modules/secgroup"//引用VPC模块的输出变量vpc_id = module.myvpc.vpc_id
}module "myecs" {// 模块代码路径source = "../../modules/ecs"region = local.region//引用VPC模块的输出变量vsw_id      = module.myvpc.vsw_idsecgroup_id = module.mysecgroup.secgroup_id
}module "mydns" {source     = "../../modules/dns"dns_record = "maojing"ecs_ip     = module.myecs.ecs_ip
}

5.Terraform通过后端使用 alicloud阿里云OSS 实现资源管理

(1) 初始化

terraform init

(2)  计划与预览

 terraform plan

(3) 申请资源

terraform apply

yes

(4)登录阿里云系统查看

①查看ECS实例

②域名解析

③ 实例详情

④ 监控

⑤ 安全组

⑥云盘⑦弹性网卡

(5)远程登录实例

 ①  查看公网IP

② 远程连接

③ 立即登录

④ 登录实例

⑤ 登录成功

⑥查看IP

(12)远程操作实例

①  Linux主机远程连接实例

 ssh root@118.178.240.67

② 给实例安装nginx

yum -y install nginx

③ 给实例启动服务并监听端口

systemctl start nginxnetstat -anlpt | grep 80

④ 解析域名

 dig maojing.maojing.site

(13)浏览器访问

①公网地址访问

http://118.178.240.67/

② 查看解析设置

③ 域名访问

http://maojing.maojing.site/

(14)销毁资源

terraform destroy

输入yes

Tablestore资源删除比较慢 (释放中)

用时大约8分钟完成删除

(15)查看项目完整目录

(16)登录阿里云系统查看

ECS实例已删除

Tablestore实例已删除

二、问题

1.后端存储的锁机制如何实现

(1)原理

(2)测试

terraform生产资源时另开一台终端进行生成资源,出现报错 Error acquiring the state lock,说明锁机制生效,限制1人操作apply去生成资源,当lockID 不存在时,才会在后端存储OSS写入配置文件。操作完成,释放lockID。

PS C:\Gocode\src\terraform-backend-dev\envirments\dev> terraform apply
╷
│ Error: Error acquiring the state lock
│
│ Error message: invoking PutRow got an error: &tablestore.OtsError{Code:"OTSConditionCheckFail", Message:"Condition check failed.", RequestId:"00060f0d-9145-0e51-2d6e-280a01e05409"}
│ Lock Info:
│   ID:        734c1f77-fc30-20aa-7485-0961594e4829
│   Path:      tf-backenddev/dev/terraform-dev.tfstate
│   Operation: OperationTypeApply
│   Who:       DESKTOP-Q4AS5US\Jia@DESKTOP-Q4AS5US
│   Version:   1.6.6
│   Created:   2024-01-16 10:26:39.6694316 +0000 UTC
│   Info:
│
│
│ Terraform acquires a state lock to protect the state from being written
│ by multiple users at the same time. Please resolve the issue above and try
│ again. For most commands, you can disable locking with the "-lock=false"
│ flag, but this is not recommended.

2.Terraform申请资源失败(NotEnoughBalance)

(1)报错

│ Error: [ERROR] terraform-provider-alicloud/alicloud/resource_alicloud_instance.go:952: Resource alicloud_instance RunInstances Failed!!! [SDK alibaba-cloud-sdk-go ERROR]:
│ SDKError:
│    StatusCode: 403
│    Code: InvalidAccountStatus.NotEnoughBalance
│    Message: code: 403, Your account does not have enough balance. request id: 5835DFEE-E670-5993-8C32-7F5D90BD8D90
│    Data: {"Code":"InvalidAccountStatus.NotEnoughBalance","HostId":"ecs-unit-share.cn-hangzhou.aliyuncs.com","Message":"Your account does not have enough balance.","Recommend":"https://api.aliyun.com/troubleshoot?q=InvalidAccountStatus.NotEnoughBalance\u0026product=Ecs\u0026requestId=5835DFEE-E670-5993-8C32-7F5D90BD8D90","RequestId":"5835DFEE-E670-5993-8C32-7F5D90BD8D90"}
│
│
│   with module.myecs.alicloud_instance.myecs,
│   on ..\..\modules\ecs\main.tf line 17, in resource "alicloud_instance" "myecs":
│   17: resource "alicloud_instance" "myecs" {

(2)原因分析

https://api.aliyun.com/document/Ecs/2014-05-26/errorCode

(3)解决方法

① 通过计算最低成本补充余额

3.Terraform申请资源失败(ResourceNotAvailable)

(1)报错

│ Error: [ERROR] terraform-provider-alicloud/alicloud/resource_alicloud_vswitch.go:151: Resource alicloud_vswitch CreateVSwitch Failed!!! [SDK alibaba-cloud-sdk-go ERROR]:
│ SDKError:
│    StatusCode: 400
│    Code: ResourceNotAvailable
│    Message: code: 400, Resource you requested is not available in this region or zone. request id: B71C5B23-BC46-5A40-8958-75AE3A50F980
│    Data: {"Code":"ResourceNotAvailable","HostId":"vpc.aliyuncs.com","Message":"Resource you requested is not available in this region or zone.","Recommend":"https://api.aliyun.com/troubleshoot?q=ResourceNotAvailable\u0026product=Vpc\u0026requestId=B71C5B23-BC46-5A40-8958-75AE3A50F980","RequestId":"B71C5B23-BC46-5A40-8958-75AE3A50F980"}
│
│
│   with module.myvpc.alicloud_vswitch.vsw,
│   on ..\..\modules\vpc\main.tf line 8, in resource "alicloud_vswitch" "vsw":
│    8: resource "alicloud_vswitch" "vsw" {

(2)原因分析

选择的地域中,没有相应的VPC资源,即有可能这个地域中的VPC配置类型,没货或不存在。

(3)解决方法

因为Tablestore在杭州的region,所以查看杭州可用区(H 、I、J、K可用)

修改可用区为 hangzhou-j

4.Terraform初始资源失败(Backend configuration changed)

(1) 报错

│ Error: Backend configuration changed
│
│ A change in the backend configuration has been detected, which may require migrating existing state.
│
│ If you wish to attempt automatic migration of the state, use "terraform init -migrate-state".
│ If you wish to store the current configuration with no changes to the state, use "terraform init -reconfigure".

(2)原因分析

配置文件变更或移除

(3)解决方法

重新初始化

terraform init -reconfigure

5.Terraform初始资源失败(provider)

(1)报错

│ Error: Duplicate provider configuration
│
│   on main.tf line 40:
│   40: provider "alicloud" {
│
│ A default (non-aliased) provider configuration for "alicloud" was already given at main.tf:2,1-20. If multiple configurations are required, set the "alias" argument for alternative configurations.
╵

(2)原因分析

系统只能有1个默认的供应商provider,其他同名的需要起别名 "alias"

(3)解决方法

起别名。

# Configure the Alicloud Provider 默认供应商
provider "alicloud" {access_key = var.access_keysecret_key = var.secret_keyregion     = "cn-hangzhou"
}provider "alicloud" {alias  = "nanjing"access_key = var.access_keysecret_key = var.secret_keyregion     = "cn-nanjing"
}

6.Terraform删除资源失败(the instance name )

(1)报错

│ Error: the instance name must consist of a~z, A~Z, 0~9 and a hyphen (-), the first character must be a letter and the last character cannot be a hyphen (-), the legal length range is 3~16 bytes
│ 
│   with alicloud_ots_instance.terraform_table,
│   on main.tf line 15, in resource "alicloud_ots_instance" "terraform_table":
│   15: resource "alicloud_ots_instance" "terraform_table" {
│
╵
PS C:\Gocode\src\terraform-backend-demo\envirments\dev> terraform apply  
╷
│ Error: the instance name must consist of a~z, A~Z, 0~9 and a hyphen (-), the first character must be a letter and the last character cannot be a hyphen (-), the legal length range is 3~16 bytes
│
│   with alicloud_ots_instance.terraform_table,
│   on main.tf line 15, in resource "alicloud_ots_instance" "terraform_table":
│   15: resource "alicloud_ots_instance" "terraform_table" {

(2)原因分析

实例名称不规范

(3)解决方法

按规范,修改实例名称。

7. Terraform申请资源失败(Exists)

(1)报错

│ Error: [ERROR] terraform-provider-alicloud/alicloud/resource_alicloud_ots_instance.go:73:
│ [ERROR] terraform-provider-alicloud/alicloud/service_alicloud_ots.go:962: Resource tablestore /v2/openapi/createinstance Failed!!! [SDK alibaba-cloud-sdk-go ERROR]:
│ SDKError:
│    StatusCode: 409
│    Code: Exists
│    Message: code: 409, 资源已经存在 request id: 6763D7F0-BE22-5475-B92D-53D12798AA7A
│    Data: {"Code":"Exists","Message":"资源已经存在","RequestId":"6763D7F0-BE22-5475-B92D-53D12798AA7A","_headers":{"access-control-allow-origin":"*","access-control-expose-headers":"*","connection":"keep-alive","content-length":"99","content-type":"application/json;charset=utf-8","date":"Tue, 16 Jan 2024 05:50:35 GMT","keep-alive":"timeout=25","x-acs-request-id":"6763D7F0-BE22-5475-B92D-53D12798AA7A","x-acs-trace-id":"36ad93c4c65f1e4f12f6adcebdb4be3e"}}
│
│
│   with alicloud_ots_instance.tftable,
│   on main.tf line 15, in resource "alicloud_ots_instance" "tftable":
│   15: resource "alicloud_ots_instance" "tftable" {
│

(2)原因分析

"alicloud_ots_instance"  ots实例重名或名称不可用

(3)解决方法

修改ots实例名称。

8. 阿里云Tablestore未开通

(1)报错

(2)原因分析

需要开通服务。

(3)解决方法

开通服务

成功:

9.Terraform申请资源失败(AccessDenied)

(1)报错

(2)原因分析

官网:

如何通过RAM Policy为RAM用户授权_表格存储(Tablestore)-阿里云帮助中心 (aliyun.com)

RAM无OTS、OSS权限。

(3)解决方法

① RAM用户添加OTS、OSS权限。

搜索OTS

搜索OSS

授权成功

10.阿里云OSS未开通

(1)报错

(2)原因分析

需要开通服务。

(3)解决方法

开通服务

成功:

进入:

11.Terraform删除资源失败

(1)报错

│ Error: [ERROR] terraform-provider-alicloud/alicloud/resource_alicloud_oss_bucket.go:1703: Resource tf-backenddev DeleteBucket Failed!!! [SDK aliyun-oss-go-sdk ERROR]:
│ oss: service returned error: StatusCode=409, ErrorCode=BucketNotEmpty, ErrorMessage="The bucket has objects. Please delete them first.", RequestId=65A66A257CF84234346A2B88, Ec=0015-00000301
│
│
╵
╷
│ Error: Error releasing the state lock
│
│ Error message: failed to retrieve lock info: OTSAuthFailed The instance is not running. 00060f0e-a627-1dec-1c17-2a0a0222224d
│
│ Terraform acquires a lock when accessing your state to prevent others
│ running Terraform to potentially modify the state at the same time. An
│ error occurred while releasing this lock. This could mean that the lock
│ did or did not release properly. If the lock didn't release properly,
│ Terraform may not be able to run future commands since it'll appear as if
│ the lock is held.
│
│ In this scenario, please call the "force-unlock" command to unlock the
│ state manually. This is a very dangerous operation since if it is done
│ erroneously it could result in two people modifying state at the same time.
│ Only call this command if you're certain that the unlock above failed and
│ that no one else is holding a lock.

(2)原因分析

官网:

删除不再需要的存储空间以免产生额外费用_对象存储(OSS)-阿里云帮助中心 (aliyun.com)

未删除Bucket的所有文件(Object)

 (3)解决方法

① 删除所有文件(Object)

② 确定

③移除

④ 完成

⑤ 选中左侧列表最后的“删除Bucket”再点击右侧的“立即删除”

⑥ 确定删除

⑦ 删除成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/239382.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java数据结构与算法刷题-----LeetCode96. 不同的二叉搜索树

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只…

OceanBase 4.2特性解读:Show Trace全链路跟踪,助力快速问题定位与精准诊断

在分布式数据库环境下,慢 SQL 诊断是运维人员面临的一大挑战。在无法及时发现问题根本原因的情况下,可能会严重影响用户体验,甚至会导致业务服务不可用。相对于单机数据库,分布式数据库系统涉及多个节点、多组件的协同工作&#x…

推荐VSCODE插件:为`package.json`添加注释信息

众所周知,JSON文件是不支持注释的,除了JSON5/JSONC之外,我们在开发项目特别是前端项目时,大量会用到JSON文件,特别是在编写package.json中的scripts时,由于缺少注释,当有大量的命令脚本时,就有了…

【Docker】在容器中管理数据数据卷挂载以及宿主机目录挂载

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《【Docker】在容器中管理数据》。&#x1f3af…

Halcon提取亚像素轮廓edges_sub_pix算子

Halcon提取亚像素轮廓edges_sub_pix算子 最常用的提取亚像素轮廓的算子是edges_sub_pix算子,该算子同样提供了大量的提取方法,只需要在Filter 参数中设置方法的名字,就可以完成边缘的提取。该算子的输入是灰度图像,输出是XLD轮廓…

1491. 去掉最低工资和最高工资后的工资平均值

1491. 去掉最低工资和最高工资后的工资平均值 class Solution {public double average(int[] salary) {Arrays.sort(salary);salary[0] 0;for(int i 1;i < salary.length - 1;i){salary[0] salary[i];}return salary[0] * 1.0 / (salary.length - 2);} }

【C++】vector的使用及模拟实现

目录 一、vector的介绍及使用1.1 介绍vector1.2 vector的使用1.2.1 构造1.2.2 遍历访问1.2.3 容量空间1.2.4 增删查改 二、vector的模拟实现2.1 成员变量2.2 迭代器相关函数2.3 构造-析构-赋值重载2.3.1 无参构造2.3.2 有参构造12.3.3 有参构造22.3.4 拷贝构造2.3.5 赋值重载2.…

Docker部署Jira、Confluence、Bitbucket、Bamboo、Crowd,Atlassian全家桶

文章目录 省流&#xff1a;注意&#xff1a;解决方案&#xff1a; 1.docker-compose文件2.其他服务都正常启动&#xff0c;唯独Bitbucket不行。日志错误刚启动时候重启后查询分析原因再针对第一点排查看样子是安装的bitbucket和系统环境有冲突问题&#xff1f; 结论&#xff1a…

Ovtio不同版本下载

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩&#xff01; 主要专栏内容包括&#xff1a; †《LAMMPS小技巧》&#xff1a; ‾ \textbf…

VTK开发调试环境下载(VTK开发环境一步到位直接开发,无需自己配置编译 VS2017+Qt5.12.10+VTK)

一、无与伦比的优势 直接下载代码就可以调试的VTK代码仓库。 二、资源制作原理 这个资源根据VTK源码 编译出动态库文件 pdb lib dll 文件&#xff08; x64 debug &#xff09; 并将这两者同时放在一个代码仓库里&#xff0c;下载就能用。 三、使用方法&#xff08;vtk-so…

武理多媒体信息共享平台的架构设计与实现

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Mantle: A Programmable Metadata Load Balancer for the Ceph File System——论文泛读

SC 2015 Paper 元数据论文阅读汇总 问题 优化Ceph的元数据局部性和负载平衡。 现有方法 提高元数据服务性能的最常见技术是在专用的元数据服务器&#xff08;MDS&#xff09;节点之间平衡负载 [16, 25, 26, 21, 28]。常见的方法是鼓励独立增长并减少通信&#xff0c;使用诸…

使用 Picocli 开发 Java 命令行,5 分钟上手

大家好&#xff0c;我是鱼皮&#xff0c;对不会前端的同学来说&#xff0c;开发 命令行工具 是一种不错的展示系统功能的方式。在 Java 中开发命令行工具也很简单&#xff0c;使用框架&#xff0c;几分钟就能学会啦~ Picocli 入门 Picocli 是 Java 中个人认为功能最完善、最简单…

NAS入门(学习笔记)

文章目录 AutoMLNAS初期NAS当前NAS框架One-Shot NAS权重共享策略 Zero-Shot NASZen-NASNASWOTEPENAS 参考资料 AutoML 深度学习使特征学习自动化 AutoML 使深度学习自动化 自动化机器学习 (automated machine learning) 是一种自动化的数据驱动方法, 并做出一系列决策。 按…

【Docker】网络模式➕自定义网络

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一.Docker网络模式的介绍 二. 网桥模…

Server/PC 稳定性测试(Windows)

Server/PC 稳定性测试 1. CPU - 中央处理器1.1 CPU稳定性1.2 CPU温度 2. Memory - 内存2.1 内存性能 3. DISK - 硬盘3.1 HDD - 机械硬盘机械硬盘转速详解监测工具 3.2 SSD - 固态硬盘监测工具 4. 使用时长cpu能用多久&#xff1f;主板能用多久&#xff1f;内存能用多久&#xf…

博后期间各种计划

博后期间各种计划&#xff1a; &#xff08;1&#xff09;国家自然科学基金&#xff08;青年项目&#xff09;、&#xff08;2&#xff09;博士后创新人才支持计划&#xff08;23年新改革&#xff1a;28w*2生活补助经费8w科研启动经费&#xff1b;每年资助400多人&#xff1b;…

Ansible-剧本与变量

对于运维小伙伴来讲&#xff0c;Ansible并不陌生&#xff0c;配置简单&#xff0c;上手容易&#xff0c;只要掌握几个基本的模块就可以解决好多运维中重复的事&#xff0c;但是对于处理更为高级的功能和更大、更复杂的项目时&#xff0c;管理和维护Ansible Playbook或高效使用将…

解决MPICH的GPU初始化失败:一次深入探索

今天来分享“MPICH&#xff1a;MPII_Init_thread(222): gpu_init failed”这个问题的解决方式 文章目录 前言问题原因解决方案 前言 如果在安装MPICH的时候没有注意要一些选项&#xff0c;那么当使用mpicxx mpi_send.cpp -o send && mpirun -n 2 ./send进行编译输出的…

C++ 之LeetCode刷题记录(十一)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 向耗时0s前进。 67. 二进制求和 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入…