tkcashgame_v4/pkg/ali/tkecs/client.go

173 lines
5.2 KiB
Go
Raw Normal View History

2025-10-22 10:01:11 +00:00
package tkecs
import (
"fmt"
"net/http"
"sandc/pkg/ali"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v3/client"
)
type InstanceStatus string
const (
InstanceStatusPending InstanceStatus = "Pending"
InstanceStatusRunning InstanceStatus = "Running"
InstanceStatusStarting InstanceStatus = "Starting"
InstanceStatusStopping InstanceStatus = "Stopping"
InstanceStatusStopped InstanceStatus = "Stopped"
)
type Client struct {
ecs *ecs20140526.Client
regionId string
}
func NewClient(accessKeyID, accessKeySecret, regionId string) (*Client, error) {
config := &openapi.Config{
// 必填,您的 AccessKey ID
AccessKeyId: ali.String(accessKeyID),
// 必填,您的 AccessKey Secret
AccessKeySecret: ali.String(accessKeySecret),
}
// 访问的域名
config.Endpoint = ali.String(ali.GetEcsEndpointByRegionId(regionId))
ecsClient, err := ecs20140526.NewClient(config)
if err != nil {
return nil, err
}
return &Client{
ecs: ecsClient,
regionId: regionId,
}, nil
}
// CreateProxyInstance 创建阿里云代理实例
func (c *Client) CreateProxyInstance(name string) (*string, error) {
systemDisk := &ecs20140526.CreateInstanceRequestSystemDisk{
Size: ali.Int32(20), //20G
}
createInstanceRequest := &ecs20140526.CreateInstanceRequest{
RegionId: ali.String(c.regionId),
InstanceType: ali.String("ecs.t5-lc2m1.nano"),
ResourceGroupId: ali.String("rg-aek26d4tdurjdui"),
ImageId: ali.String("m-t4nfwmalijh9zhfflt5i"),
InternetMaxBandwidthOut: ali.Int32(10),
InternetMaxBandwidthIn: ali.Int32(10),
SystemDisk: systemDisk,
InstanceChargeType: ali.String("PrePaid"),
PeriodUnit: ali.String("Month"),
Period: ali.Int32(1),
SecurityGroupId: ali.String("sg-t4nazifybjirx7tepv28"),
InstanceName: ali.String(name),
VSwitchId: ali.String("vsw-t4n1mlcjic25hzki9b6nc"),
InternetChargeType: ali.String("PayByTraffic"),
AutoRenew: ali.Bool(true),
AutoRenewPeriod: ali.Int32(1),
}
res, err := c.ecs.CreateInstance(createInstanceRequest)
if err != nil {
return nil, err
}
if ali.Int32Value(res.StatusCode) != http.StatusOK {
return nil, fmt.Errorf("CreateProxyInstance status failed: %d", http.StatusOK)
}
fmt.Println("res: ", res, err)
return res.Body.InstanceId, nil
}
// AllocatePublicIpAddress 为一台ECS实例分配一个固定公网IP地址
func (c *Client) AllocatePublicIpAddress(instanceId string) (*string, error) {
allocatePublicIpAddressRequest := &ecs20140526.AllocatePublicIpAddressRequest{
InstanceId: ali.String(instanceId),
}
res, err := c.ecs.AllocatePublicIpAddress(allocatePublicIpAddressRequest)
if err != nil {
return nil, err
}
if ali.Int32Value(res.StatusCode) != http.StatusOK {
return nil, fmt.Errorf("AllocatePublicIpAddress status failed: %d", http.StatusOK)
}
return res.Body.IpAddress, nil
}
// ConvertNatPublicIpToEip
func (c *Client) ConvertNatPublicIpToEip(instanceId string) error {
convertNatPublicIpToEipRequest := &ecs20140526.ConvertNatPublicIpToEipRequest{
InstanceId: ali.String(instanceId),
RegionId: ali.String(c.regionId),
}
res, err := c.ecs.ConvertNatPublicIpToEip(convertNatPublicIpToEipRequest)
if err != nil {
return err
}
if ali.Int32Value(res.StatusCode) != http.StatusOK {
return fmt.Errorf("ConvertNatPublicIpToEip status failed: %d", ali.Int32Value(res.StatusCode))
}
return nil
}
// StartInstance 启动一台ECS实例接口调用成功后实例进入启动中状态
func (c *Client) StartInstance(instanceId string) error {
startInstanceRequest := &ecs20140526.StartInstanceRequest{
InstanceId: ali.String(instanceId),
}
res, err := c.ecs.StartInstance(startInstanceRequest)
if err != nil {
return err
}
if ali.Int32Value(res.StatusCode) != http.StatusOK {
return fmt.Errorf("StartInstance status failed: %d", ali.Int32Value(res.StatusCode))
}
return nil
}
// CheckInstanceStatusActive 判断实例是否运行中
func (c *Client) CheckInstanceStatusActive(instanceId string) (*bool, error) {
describeInstanceAttributeRequest := &ecs20140526.DescribeInstanceAttributeRequest{
InstanceId: ali.String(instanceId),
}
res, err := c.ecs.DescribeInstanceAttribute(describeInstanceAttributeRequest)
if err != nil {
return nil, err
}
if ali.Int32Value(res.StatusCode) != http.StatusOK {
return nil, fmt.Errorf("CheckInstanceStatusActive status failed: %d", ali.Int32Value(res.StatusCode))
}
if ali.StringValue(res.Body.Status) == string(InstanceStatusRunning) {
return ali.Bool(true), nil
}
return ali.Bool(false), nil
}
// ModifyInstanceAttribute 修改实例的名称
func (c *Client) ModifyInstanceName(instanceId, name string) error {
modifyInstanceAttributeRequest := &ecs20140526.ModifyInstanceAttributeRequest{
InstanceId: ali.String(instanceId),
InstanceName: ali.String(name),
}
res, err := c.ecs.ModifyInstanceAttribute(modifyInstanceAttributeRequest)
if err != nil {
return err
}
if ali.Int32Value(res.StatusCode) != http.StatusOK {
return fmt.Errorf("ModifyInstanceName status failed: %d", ali.Int32Value(res.StatusCode))
}
return nil
}