Skip to content


Repository files navigation


Fetch what's new from AWS and send out notifications on social sites.

Build Status PkgGoDev Go Report Card GitHub release (latest by date) codecov

App Install

go-aws-news can be executed as an application that sends out notifications to social sites like Discord. To configure providers, modify the config.yaml file to enable a provider.

go-aws-news is designed to be run on a schedule, once a day (displaying the previous day's AWS News). See the install options for examples on how to install and run.

Notification Providers

Currently supported providers:

Install Options

Install With Crontab

The simplest way to run go-aws-news is via crontab.

Type crontab -e on Mac or Linux and add a line:

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

The above example will execute go-aws-news at 2PM UTC (8AM CST) each day.

Install As Kubernetes CronJob

go-aws-news can be run as a CronJob in a Kubernetes cluster.

Example cronjob.yaml:

apiVersion: batch/v1beta1
kind: CronJob
  name: go-aws-news
  schedule: "0 14 * * *"
          - name: go-aws-news
            image: circa10a/go-aws-news
            - name: config
              mountPath: /config.yaml
              subPath: config.yaml
          - name: config
              name: awsnews-config
          restartPolicy: OnFailure

The ConfigMap can be created from the config.yaml file itself:

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

To apply the cronjob.yaml example above:

kubectl apply -f cronjob.yaml

Install As AWS Lambda

  1. Setup provider config in AWS SSM Parameter Store:

    aws ssm put-parameter --type SecureString --name go-aws-news-config --value "$(cat config.yaml)"

    Note: Overriding the name go-aws-news-config will require an environment variable on the lambda function: GO_AWS_NEWS_CONFIG_NAME.

  2. Create the Lambda execution role and add permissions:

    aws iam create-role --role-name go-aws-news-lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": ""}, "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
  3. Create the lambda function:

    make lambda-package
    aws lambda create-function --function-name go-aws-news --zip-file fileb://bin/ --runtime go1.x --handler awsnews \
      --role $(aws iam get-role --role-name go-aws-news-lambda-ex --query Role.Arn --output text)
  4. Create a schedule for the 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
  5. Allow the lambda function to be invoked by the schedule rule:

    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 --source-arn $EVENT_ARN

Module Install

go-aws-news can be installed as a module for use in other Go applications:

go get -u ""

Module Usage

Methods return a slice of structs which include the announcement title, a link, and the date it was posted as well an error. This allows you to manipulate the data in whichever way you please, or simply use Print() to print a nice ASCII table to the console.

Get Today's news

package main

import (
  awsnews ""

func main() {
    news, err := awsnews.Today()
    if err != nil {
      // Handle error

Get Yesterday's news

news, _ := awsnews.Yesterday()

Get all news for the month

news, _ := awsnews.ThisMonth()

Get from a previous month

// Custom timeframe(June 2019)
news, err := awsnews.Fetch(2019, 06)

Get from a previous year

// Custom timeframe(2017)
news, err := awsnews.FetchYear(2017)

Print out announcements

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

Loop over news data

// Loop slice of stucts of announcements
// For your own data manipulation
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)

Limit news results count

news, _ := awsnews.ThisMonth()
// Last 10 news items of the month

Get news as JSON

news, _ := awsnews.ThisMonth()
json, jsonErr := news.JSON()
if jsonErr != nil {

Get news as HTML

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

Get news about a specific product

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

Google Assistant



# Unit/Integration tests
# Get code coverage
make coverage