golang AWS云服务开发SDK插件库aws-sdk-go的使用

Golang AWS云服务开发SDK插件库aws-sdk-go的使用

AWS SDK for Go v2

aws-sdk-go-v2是Go编程语言的AWS SDK v2版本,最低要求Go 1.22版本。

快速开始

下面是一个使用v2 SDK与Amazon DynamoDB交互的完整示例:

1. 初始化项目

$ mkdir ~/helloaws
$ cd ~/helloaws
$ go mod init helloaws

2. 添加SDK依赖

$ go get github.com/aws/aws-sdk-go-v2/aws
$ go get github.com/aws/aws-sdk-go-v2/config
$ go get github.com/aws/aws-sdk-go-v2/service/dynamodb

3. 编写代码

创建main.go文件并添加以下内容:

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
)

func main() {
    // 使用SDK的默认配置,从环境变量、共享凭据和共享配置文件中加载配置
    cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-west-2"))
    if err != nil {
        log.Fatalf("unable to load SDK config, %v", err)
    }

    // 使用配置创建DynamoDB客户端
    svc := dynamodb.NewFromConfig(cfg)

    // 构建请求及其输入参数
    resp, err := svc.ListTables(context.TODO(), &dynamodb.ListTablesInput{
        Limit: aws.Int32(5),
    })
    if err != nil {
        log.Fatalf("failed to list tables, %v", err)
    }

    fmt.Println("Tables:")
    for _, tableName := range resp.TableNames {
        fmt.Println(tableName)
    }
}

4. 编译和执行

$ go run .
Tables:
tableOne
tableTwo

获取帮助

如果您在使用过程中遇到问题,可以通过以下方式获取帮助:

  • 在GitHub上提问或发起讨论
  • 如果您认为发现了bug,请提交issue
  • 通过AWS支持中心提交支持工单

贡献和反馈

我们欢迎您对v2 SDK提供反馈和贡献:

  • 通过GitHub Issues提供反馈或报告bug
  • 您可以提交pull request来修复问题或添加新功能
  • 所有贡献必须遵循Apache 2.0许可协议

资源

  • SDK开发者指南 - 了解如何开始使用AWS SDK for Go V2
  • SDK迁移指南 - 了解如何从AWS SDK for Go迁移到V2
  • SDK API参考文档 - 查找所有AWS服务API操作的输入和输出参数
  • AWS服务文档 - 了解如何与AWS服务交互
  • AWS开发者论坛 - 提问、获取帮助和提供反馈

更多关于golang AWS云服务开发SDK插件库aws-sdk-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang AWS云服务开发SDK插件库aws-sdk-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


AWS SDK for Go (aws-sdk-go) 使用指南

AWS SDK for Go (aws-sdk-go) 是 AWS 官方提供的 Go 语言开发工具包,用于与 AWS 云服务进行交互。下面我将介绍其基本用法和常见示例。

安装和配置

首先安装 SDK:

go get github.com/aws/aws-sdk-go

基本配置

package main

import (
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/aws/credentials"
)

func main() {
	// 1. 使用默认配置(从环境变量或~/.aws/credentials读取)
	sess := session.Must(session.NewSessionWithOptions(session.Options{
		SharedConfigState: session.SharedConfigEnable,
	}))

	// 2. 显式指定凭证和区域
	sess := session.Must(session.NewSession(&aws.Config{
		Region:      aws.String("us-west-2"),
		Credentials: credentials.NewStaticCredentials("AKID", "SECRET_KEY", "TOKEN"),
	}))
}

常用服务示例

1. S3 服务操作

import (
	"github.com/aws/aws-sdk-go/service/s3"
	"log"
)

func s3Example() {
	sess := session.Must(session.NewSession(&aws.Config{
		Region: aws.String("us-west-2"),
	}))

	svc := s3.New(sess)

	// 列出所有bucket
	result, err := svc.ListBuckets(nil)
	if err != nil {
		log.Fatal(err)
	}

	for _, b := range result.Buckets {
		log.Printf("* %s created on %s\n",
			aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))
	}

	// 上传文件
	file, err := os.Open("testfile.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	_, err = svc.PutObject(&s3.PutObjectInput{
		Bucket: aws.String("my-bucket"),
		Key:    aws.String("testfile.txt"),
		Body:   file,
	})
	if err != nil {
		log.Fatal(err)
	}
}

2. EC2 服务操作

import "github.com/aws/aws-sdk-go/service/ec2"

func ec2Example() {
	sess := session.Must(session.NewSession(&aws.Config{
		Region: aws.String("us-west-2"),
	}))

	svc := ec2.New(sess)

	// 列出所有实例
	result, err := svc.DescribeInstances(nil)
	if err != nil {
		log.Fatal(err)
	}

	for _, r := range result.Reservations {
		for _, i := range r.Instances {
			log.Printf("Instance ID: %s, State: %s\n",
				aws.StringValue(i.InstanceId), 
				aws.StringValue(i.State.Name))
		}
	}

	// 启动新实例
	runResult, err := svc.RunInstances(&ec2.RunInstancesInput{
		ImageId:      aws.String("ami-e7527ed7"),
		InstanceType: aws.String("t2.micro"),
		MinCount:     aws.Int64(1),
		MaxCount:     aws.Int64(1),
	})
	if err != nil {
		log.Fatal(err)
	}
	log.Println("Created instance:", *runResult.Instances[0].InstanceId)
}

3. DynamoDB 操作

import "github.com/aws/aws-sdk-go/service/dynamodb"

func dynamoExample() {
	sess := session.Must(session.NewSession(&aws.Config{
		Region: aws.String("us-west-2"),
	}))

	svc := dynamodb.New(sess)

	// 创建表
	input := &dynamodb.CreateTableInput{
		AttributeDefinitions: []*dynamodb.AttributeDefinition{
			{
				AttributeName: aws.String("UserId"),
				AttributeType: aws.String("N"),
			},
		},
		KeySchema: []*dynamodb.KeySchemaElement{
			{
				AttributeName: aws.String("UserId"),
				KeyType:       aws.String("HASH"),
			},
		},
		ProvisionedThroughput: &dynamodb.ProvisionedThroughput{
			ReadCapacityUnits:  aws.Int64(10),
			WriteCapacityUnits: aws.Int64(10),
		},
		TableName: aws.String("Users"),
	}

	_, err := svc.CreateTable(input)
	if err != nil {
		log.Fatal(err)
	}

	// 插入数据
	_, err = svc.PutItem(&dynamodb.PutItemInput{
		TableName: aws.String("Users"),
		Item: map[string]*dynamodb.AttributeValue{
			"UserId": {
				N: aws.String("1"),
			},
			"UserName": {
				S: aws.String("John Doe"),
			},
		},
	})
	if err != nil {
		log.Fatal(err)
	}
}

错误处理

AWS SDK 返回的错误通常包含丰富的信息:

result, err := svc.SomeAPICall(input)
if err != nil {
    if aerr, ok := err.(awserr.Error); ok {
        switch aerr.Code() {
        case s3.ErrCodeNoSuchBucket:
            // 处理特定错误
        default:
            log.Println(aerr.Error())
        }
    } else {
        // 非AWS错误
        log.Println(err.Error())
    }
    return
}

最佳实践

  1. 复用 Session:Session 创建开销较大,应该在应用生命周期内复用
  2. 配置超时:为 HTTP 客户端配置合理的超时
  3. 使用 Context:支持上下文传递以控制超时和取消
  4. 处理分页:对于返回大量数据的 API 使用分页
// 带上下文的调用示例
ctx := context.Background()
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()

result, err := svc.SomeAPICallWithContext(ctx, input)

AWS SDK for Go 提供了完整的 AWS 服务 API 覆盖,以上只是基础示例。实际开发中应参考 官方文档 获取各服务的详细 API 说明。

回到顶部