golang获取AWS最新动态与资讯插件库go-aws-news的使用

go-aws-news

从AWS获取最新动态并在社交网站上发送通知。

go-aws-news示例图片

应用安装

go-aws-news可以作为应用程序执行,向Discord等社交网站发送通知。要配置提供程序,请修改config.yaml文件以启用提供程序。

go-aws-news设计为每天运行一次(显示前一天的AWS新闻)。请参阅安装选项以获取如何安装和运行的示例。

通知提供程序

当前支持的提供程序:

  • Discord
  • Rocket.Chat
  • Slack
  • SMTP(电子邮件)
  • Yammer

安装选项

使用Crontab安装

运行go-aws-news的最简单方法是通过crontab。

在Mac或Linux上输入crontab -e并添加一行:

# 二进制
0 2 * * * /path/to/go-aws-news-binary
# Docker
0 14 * * * docker run -d --rm --name aws-news \
  -v your_config.yaml:/config.yaml \
  circa10a/go-aws-news

上面的示例将在每天UTC时间2PM(CST时间8AM)执行go-aws-news

作为Kubernetes CronJob安装

go-aws-news可以作为Kubernetes集群中的CronJob运行。

示例cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: go-aws-news
spec:
  schedule: "0 14 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: go-aws-news
            image: circa10a/go-aws-news
            volumeMounts:
            - name: config
              mountPath: /config.yaml
              subPath: config.yaml
          volumes:
          - name: config
            configMap:
              name: awsnews-config
          restartPolicy: OnFailure

可以从config.yaml文件本身创建ConfigMap:

kubectl create configmap awsnews-config --from-file=config.yaml

要应用上面的cronjob.yaml示例:

kubectl apply -f cronjob.yaml

作为AWS Lambda安装

  1. 在AWS SSM参数存储中设置提供程序配置:
aws ssm put-parameter --type SecureString --name go-aws-news-config --value "$(cat config.yaml)"

注意:覆盖名称go-aws-news-config需要在Lambda函数上设置环境变量:GO_AWS_NEWS_CONFIG_NAME

  1. 创建Lambda执行角色并添加权限:
aws iam create-role --role-name go-aws-news-lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

aws iam attach-role-policy --role-name go-aws-news-lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
aws iam attach-role-policy --role-name go-aws-news-lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
  1. 创建Lambda函数:
make lambda-package
aws lambda create-function --function-name go-aws-news --zip-file fileb://bin/lambda.zip --runtime go1.x --handler awsnews \
  --role $(aws iam get-role --role-name go-aws-news-lambda-ex --query Role.Arn --output text)
  1. 为Lambda创建计划:
aws events put-rule --schedule-expression "cron(0 14 * * ? *)" --name go-aws-news-cron

LAMBDA_ARN=$(aws lambda get-function --function-name go-aws-news --query Configuration.FunctionArn)
aws events put-targets --rule go-aws-news-cron --targets "Id"="1","Arn"=$LAMBDA_ARN
  1. 允许计划规则调用Lambda函数:
EVENT_ARN=$(aws events describe-rule --name go-aws-news-cron --query Arn --output text)

aws lambda add-permission --function-name go-aws-news --statement-id eventbridge-cron \
  --action 'lambda:InvokeFunction' --principal events.amazonaws.com --source-arn $EVENT_ARN

模块安装

go-aws-news可以作为模块安装,用于其他Go应用程序:

go get -u "github.com/circa10a/go-aws-news/news"

模块使用

方法返回一个结构体切片,其中包括公告标题、链接和发布日期以及错误。这允许您以任何方式操作数据,或者简单地使用Print()在控制台上打印一个漂亮的ASCII表格。

获取今天的新闻

package main

import (
  awsnews "github.com/circa10a/go-aws-news/news"
)

func main() {
    news, err := awsnews.Today()
    if err != nil {
      // 处理错误
    }
    news.Print()
}

获取昨天的新闻

news, _ := awsnews.Yesterday()

获取本月的所有新闻

news, _ := awsnews.ThisMonth()

获取前几个月的新闻

// 自定义时间段(2019年6月)
news, err := awsnews.Fetch(2019, 06)

获取前几年的新闻

// 自定义时间段(2017年)
news, err := awsnews.FetchYear(2017)

打印公告

news, _ := awsnews.ThisMonth()
news.Print()
// 控制台输出
// +--------------------------------+--------------+
// |          ANNOUNCEMENT          |     DATE     |
// +--------------------------------+--------------+
// | Amazon Cognito now supports    | Jan 10, 2020 |
// | CloudWatch Usage Metrics       |              |
// +--------------------------------+--------------+
// | Introducing Workload Shares in | Jan 10, 2020 |
// | AWS Well-Architected Tool      |              |
// +--------------------------------+--------------+
//

遍历新闻数据

// 遍历公告结构体切片
// 用于您自己的数据操作
news, _ := awsnews.Fetch(time.Now().Year(), int(time.Now().Month()))
for _, v := range news {
    fmt.Printf("Title: %v\n", v.Title)
    fmt.Printf("Link: %v\n", v.Link)
    fmt.Printf("Date: %v\n", v.PostDate)
}

限制新闻结果数量

news, _ := awsnews.ThisMonth()
// 本月的最后10条新闻
news.Last(10).Print()

获取新闻为JSON

news, _ := awsnews.ThisMonth()
json, jsonErr := news.JSON()
if jsonErr != nil {
    log.Fatal(err)
}
fmt.Println(string(json))

获取新闻为HTML

news, _ := awsnews.ThisMonth()
html := news.HTML()
fmt.Println(html)

获取关于特定产品的新闻

news, err := awsnews.Fetch(2019, 12)
if err != nil {
    fmt.Println(err)
} else {
    news.Filter([]string{"EKS", "ECS"}).Print()
}

Google助手

开发

测试

# 单元/集成测试
make
# 获取代码覆盖率
make coverage

更多关于golang获取AWS最新动态与资讯插件库go-aws-news的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang获取AWS最新动态与资讯插件库go-aws-news的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-aws-news获取AWS最新动态与资讯

go-aws-news是一个用于获取AWS最新动态、产品更新和服务资讯的Go语言库,它可以帮助开发者及时了解AWS平台的变化。

安装go-aws-news

首先,使用go get命令安装该库:

go get github.com/aws-samples/go-aws-news

基本使用方法

1. 获取最新AWS资讯

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/aws-samples/go-aws-news/news"
)

func main() {
	// 创建新的AWS新闻客户端
	client := news.NewClient()

	// 获取最新的AWS新闻
	items, err := client.GetLatestNews()
	if err != nil {
		log.Fatalf("获取AWS新闻失败: %v", err)
	}

	// 打印新闻条目
	fmt.Println("=== 最新AWS资讯 ===")
	for _, item := range items {
		fmt.Printf("标题: %s\n日期: %s\n链接: %s\n\n", 
			item.Title, 
			item.Date.Format(time.RFC3339), 
			item.Link)
	}
}

2. 按日期范围查询

// 获取特定日期范围内的AWS新闻
startDate := time.Now().AddDate(0, 0, -7) // 一周前
endDate := time.Now()

items, err := client.GetNewsByDateRange(startDate, endDate)
if err != nil {
	log.Fatalf("按日期范围查询失败: %v", err)
}

fmt.Printf("\n=== 最近7天AWS资讯 (%d条) ===\n", len(items))
for _, item := range items {
	fmt.Printf("[%s] %s\n", item.Date.Format("2006-01-02"), item.Title)
}

3. 按服务名称过滤

// 获取特定AWS服务的更新
serviceName := "Amazon EC2"

items, err = client.GetNewsByService(serviceName)
if err != nil {
	log.Fatalf("按服务查询失败: %v", err)
}

fmt.Printf("\n=== %s最新更新 ===\n", serviceName)
for _, item := range items {
	fmt.Printf("- %s (%s)\n", item.Title, item.Date.Format("2006-01-02"))
}

高级功能

1. 自定义HTTP客户端

import (
	"net/http"
	"time"
)

// 创建自定义HTTP客户端
customHTTPClient := &http.Client{
	Timeout: 10 * time.Second,
}

// 使用自定义HTTP客户端创建AWS新闻客户端
client := news.NewClientWithHTTPClient(customHTTPClient)

2. 缓存结果

// 实现简单的内存缓存
var cachedItems []news.Item
var lastFetch time.Time

// 如果缓存未过期(例如1小时内),使用缓存
if time.Since(lastFetch) < time.Hour && len(cachedItems) > 0 {
	fmt.Println("使用缓存数据")
	for _, item := range cachedItems {
		fmt.Println(item.Title)
	}
} else {
	// 否则获取新数据
	items, err := client.GetLatestNews()
	if err != nil {
		log.Fatal(err)
	}
	cachedItems = items
	lastFetch = time.Now()
}

3. 集成到监控系统

// 定期检查AWS更新
func monitorAWSUpdates(interval time.Duration, callback func([]news.Item)) {
	ticker := time.NewTicker(interval)
	defer ticker.Stop()

	for range ticker.C {
		items, err := client.GetLatestNews()
		if err != nil {
			log.Printf("监控错误: %v", err)
			continue
		}
		callback(items)
	}
}

// 使用示例
go monitorAWSUpdates(6*time.Hour, func(items []news.Item) {
	fmt.Printf("发现%d条新AWS更新\n", len(items))
	// 这里可以添加通知逻辑,如发送邮件、Slack消息等
})

最佳实践

  1. 错误处理:始终检查返回的错误
  2. 限流:避免过于频繁的API调用
  3. 缓存:适当缓存结果减少API调用
  4. 日志记录:记录获取的资讯以便后续分析
  5. 过滤:根据自己使用的AWS服务过滤相关内容

go-aws-news库为开发者提供了便捷的方式来获取AWS平台的最新动态,帮助保持对AWS生态系统的了解,及时调整应用架构和配置。

回到顶部