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

news2024/11/19 0:45:37

目录

一、实验

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_key
  secret_key = var.secret_key
  region     = "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.name
  table_name                    = "tf_devops"
  time_to_live                  = -1
  max_version                   = 1
  deviation_cell_version_in_sec = 1

  primary_key {
    name = "LockID"
    type = "String"
  }
}

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

variables.tf

variable "access_key" {
  description = "access_key"

}

variable "secret_key" {
  description = "secret_key"
}

variable "region" {
  type        = string
  description = "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 fmt
 
terraform 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_block
  vsw_cidr_block = local.vsw_cidr_block
  vpc_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_id
  secgroup_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 nginx

netstat -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_key
  secret_key = var.secret_key
  region     = "cn-hangzhou"
}

provider "alicloud" {
  alias  = "nanjing"
  access_key = var.access_key
  secret_key = var.secret_key
  region     = "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.coloradmin.cn/o/1389909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

价值7500的在线授权网站源码支持IP+域名+双向授权全开源

PHP授权验证更新系统完整版,一键更新系统,一键卡密生成自助授权功能,域名ip双重验证功能等等 修复盗版检测,确保实时查看盗版 修复在线加密系统,一键加密 授权系统几乎所有的程序都能整合使用,包括您的app和计算机程序…

el-table右固定最后一列显示不全或者是倒数第二列无边框线

问题图片: 解决方式1: >>>.el-table__row td:not(.is-hidden):last-child { border-left:1px solid #EBEEF5; } >>>.el-table__header th:not(.is-hidden):last-child{ border-left:1px solid #EBEEF5; } >>>.el-table__head…

文件压缩完还是过大怎么办?这些参数你设置了吗?

不同的压缩算法对不同类型的文件可能有不同的效果。尝试使用不同的压缩算法、压缩模式、调整压缩工具的参数或者设置输出的文件格式等方法解决问题。下面以嗨格式压缩大师作为操作示范。 方法一:对文件进行分类压缩 将文件按照视频、图片、pdf、word、PPT分类压缩…

uni-app的项目创建和环境搭建

uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。 第一步…

Linux内核架构和工作原理详解(二)

Linux内核体系结构简析简析 图1 Linux系统层次结构 最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。GNU C Library (glibc)也在这里。它提供了连接内核…

游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用

Scenario是一个在线的AI驱动的工具,主要用于游戏艺术创作。它提供了一套全面的功能,旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力,允许用户根据独特的风格和艺术方向训…

Linux 内核被冬季风暴 “封印“

Linus Torvalds在内核邮件列表上宣布,由于他所在的美国俄勒冈州波特兰地区受到严重冬季风暴的影响,导致网络和电力中断。波特兰及其周边地区气温急降至零下 -10C,因此他不得不临时中断对Linux 6.8内核的合并窗口操作。 Linus于1月7日发布了Li…

最优订单执行算法相关论文介绍

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学,点击下方链接报名: 量化投资速成营(入门课程) Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

Resemble Enhance音频失真损坏修复AI工具:一个开源语音超分辨率AI模型

Resemble Enhance是一款强大的音频处理工具,可以将嘈杂的录音转化为清晰而有力的声音,为用户提供更优质的听觉体验。这个工具不仅可以有效去除录音中的各种噪声和杂音,还能够恢复音频失真并扩展音频带宽,使原本的声音听起来更加清…

迈向未来的求职征程:广州大学全职特聘讲师入职经历

迈向未来的求职征程:我的广州大学全职特聘讲师入职经历 2023博士毕业求职经验贴 在人生的职业旅程中,每一次求职都是一个新的冒险,而我最近的一次求职经历,是迈向教育领域的激动人心的一步。成为广州大学全职特聘讲师的入职之路…

QT 绘图与重绘事件

代码实现仪表盘 .cpp #include "widget.h" #include "ui_widget.h"#include <QPainter> #include <QPen> #include <QBrush>#include <QDebug> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->…

[ PyQt入门教程 ] Qt Designer工具的使用

Qt Designer是PyQt程序UI界面的实现工具&#xff0c;使用Qt Designer可以拖拽、点击完成GUI界面设计&#xff0c;并且设计完成的.ui程序可以转换成.py文件供python程序调用。本文主要通过用户登录需求描述Qt Designer工具开发界面的使用方法。 主要内容 1、Qt Designer程序主界…

【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.…

IIC学习之SHT30温湿度传感器(基于STM32)

简介 附上SHT30资料和逻辑分析仪源文件&#xff0c;点击下载 关于IIC的介绍网上已经非常详尽&#xff0c;这里只说重点&#xff1a; 双线&#xff08;SDA&#xff0c;SCL&#xff09;&#xff0c;半双工采用主从结构&#xff0c;支持一主多从&#xff0c;通过地址寻址&#…

最新的AIGC相关技术更新

1.腾讯发布PhotoMaker 《PhotoMaker: Customizing Realistic Human Photos via Stacked ID Embedding》 作者机构&#xff1a;南开大学&腾讯 PCG ARC 实验室&东京大学 相关链接 [Paper] [Code] [Demo] [Model Card] [BibTeX] 摘要 文本到图像生成的最新进展在根据给…

uniapp自带的选择日期的使用

年月日的下拉框 直接看代码 <view class"uni-title uni-common-pl">日期选择器</view><view class"uni-list"><view class"uni-list-cell"><view class"uni-list-cell-left">当前选择</view>&…

Linux第29步_安装“Notepad++”软件

STM32CubeProgrammer脚本文件的后缀为“.tsv”&#xff0c;ST公司官方也叫做FlashLayout。在烧写“TF-A固件”之前&#xff0c;我们需要用“Notepad”软件打开“后缀为.tsv”的脚本文件&#xff0c;根据需求决定哪些文件需要更新&#xff0c;设置好这个脚本文件。 在后期使用S…

书生·浦语大模型实战营第四节课笔记及作业

XTuner 大模型单卡低成本微调实战 1 Finetune简介 大语言模型LLM是在海量的文本内容基础上&#xff0c;以无监督或半监督方式进行训练的。海量的文本内容赋予了大模型各种各样的行业知识。但是如果直接把大模型的知识用于生产实践&#xff0c;会发现回答不大满意。微调的目的…

红队打靶练习:HOLYNIX: V1

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto whatweb 目录探测 1、gobuster 2、dirsearch 3、dirb 4、feroxbuster WEB sqlmap 1、爆库 2、爆表 3、爆列 4、爆字段 后台登录 1、文件上传 2、文件包含 3、越权漏洞 反弹shell 提权 总结 信息…

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

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