Last active
April 4, 2018 01:43
-
-
Save owulveryck/f9665470e8334e8609434feeeddc6071 to your computer and use it in GitHub Desktop.
Explanation here: https://blog.owulveryck.info/2017/01/13/a-foot-in-nosql-and-a-toe-in-big-data/index.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"encoding/json" | |
"github.com/aws/aws-sdk-go/aws" | |
"github.com/aws/aws-sdk-go/aws/session" | |
"github.com/aws/aws-sdk-go/service/dynamodb" | |
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute" | |
"github.com/kelseyhightower/envconfig" | |
"log" | |
"net/http" | |
"time" | |
) | |
// Configuration holds the environment variables for configuration | |
type Configuration struct { | |
TableName string `default:"products"` | |
OfferIndex string `default:"https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.json"` | |
BaseURL string `default:"https://pricing.us-east-1.amazonaws.com"` | |
} | |
// offerIndex represents the structure as returned by the offerindex | |
type offerIndex struct { | |
FormatVersion string `json:"formatVersion"` | |
Disclaimer string `json:"disclaimer"` | |
PublicationDate time.Time `json:"publicationDate"` | |
Offers map[string]offer `json:"offers"` | |
} | |
type offer struct { | |
OfferCode string `json:"offerCode:"` | |
VersionIndexURL string `json:"versionIndexUrl"` | |
CurrentVersionURL string `json:"currentVersionUrl"` | |
} | |
// ProductDetails represents a call to the API | |
type productDetails struct { | |
Products map[string]struct { // the key is the product code | |
//Sku string `json:"sku"` | |
ProductFamily string `json:"productFamily"` | |
Attributes map[string]interface{} `json:"attributes"` | |
} `json:"products"` | |
} | |
func main() { | |
// Create the session for dynamodb | |
sess, err := session.NewSession() | |
if err != nil { | |
log.Fatal("failed to create session,", err) | |
} | |
svc := dynamodb.New(sess, &aws.Config{Region: aws.String("us-east-1")}) | |
var config Configuration | |
err = envconfig.Process("AWSBILLING", &config) | |
if err != nil { | |
log.Fatal(err.Error()) | |
} | |
// At first get the offer index and fill a structure | |
resp, err := http.Get(config.OfferIndex) | |
if err != nil { | |
log.Fatal(err) | |
} | |
var oi offerIndex | |
err = json.NewDecoder(resp.Body).Decode(&oi) | |
if err != nil { | |
log.Fatal(err) | |
} | |
resp.Body.Close() | |
// Now, for each offer, get the offer details | |
for _, o := range oi.Offers { | |
resp, err := http.Get(config.BaseURL + o.CurrentVersionURL) | |
if err != nil { | |
log.Fatal(err) | |
} | |
var pd productDetails | |
err = json.NewDecoder(resp.Body).Decode(&pd) | |
if err != nil { | |
log.Fatal(err) | |
} | |
resp.Body.Close() | |
// Declare the Items we will upload in the DB | |
var item = make(map[string]*dynamodb.AttributeValue, 3) | |
for k, v := range pd.Products { | |
item["SKU"], err = dynamodbattribute.Marshal(k) | |
item["ProductFamily"], err = dynamodbattribute.Marshal(v.ProductFamily) | |
item["Attributes"], err = dynamodbattribute.Marshal(v.Attributes) | |
// Prepare the parameters for the Put operation | |
params := &dynamodb.PutItemInput{ | |
Item: item, | |
TableName: aws.String(config.TableName), | |
} | |
// Now put the item, discarding the result | |
_, err = svc.PutItem(params) | |
if err != nil { | |
// Print the error, cast err to awserr.Error to get the Code and | |
// Message from an error. | |
log.Fatal(err) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment