Amazon Web Services provides different SDKs, Toolkits and Command Line Tools to develop and manage application running on AWS. AWS SDK for Go is one of the latest tools provided. New versions are pushed almost every 5 days.
In this blog post, we will write a simple Go code to create a CloudFront distribution with the default settings and the following:
- An S3 bucket as origin for the distribution
- A Lambda@Edge function associated to the default behavior
- A WAF Rule
For more information about:
- CloudFront
- Installing and configuring AWS SDK for Go
- CloudFront APIs with AWS SDK for Go
- Lambda@Edge
- WAF (Web Application Firewal)
package main
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/cloudfront"
"github.com/aws/aws-sdk-go/aws/awserr"
)
func main() {
creds := aws.Creds(accessKey, secretKey, "")
svc := cloudfront.New(creds, "us-east-1", nil)
// svc := cloudfront.New(session.New()) Can replace the 2 lines above if using Instance Role or Env. Variables
input := &cloudfront.CreateDistributionWithTagsInput{
Tags: &cloudfront.Tags{
Items: []*cloudfront.Tag{
},
},
DistributionConfig: &cloudfront.DistributionConfig{
CallerReference: aws.String("Sat Sept. 30 2017"),
Comment: aws.String("My WordPress Blog"),
Enabled: aws.Bool(true),
WebACLId: aws.String("eSamplec-5a3e-4857-9b92-0a5Sample3a4"),
Origins: &cloudfront.Origins{
Quantity: aws.Int64(1),
Items: []*cloudfront.Origin{
{
Id: aws.String("Jil_S3Origin"),
DomainName: aws.String("mydomain.com.s3.amazonaws.com"),
S3OriginConfig: &cloudfront.S3OriginConfig{
OriginAccessIdentity: aws.String(""),
},
},
},
},
DefaultCacheBehavior: &cloudfront.DefaultCacheBehavior{
TargetOriginId: aws.String("Jil_S3Origin"),
MinTTL: aws.Int64(10),
ViewerProtocolPolicy: aws.String("allow-all"),
LambdaFunctionAssociations: &cloudfront.LambdaFunctionAssociations{
Quantity: aws.Int64(1),
Items: []*cloudfront.LambdaFunctionAssociation{
{
EventType: aws.String("viewer-request"), // "viewer-request" | "viewer-response" | "origin-request" | "origin-response"
LambdaFunctionARN: aws.String("arn:aws:lambda:us-east-1:123456789012:function:myFunctionName:2"), // the version of the function must be added
},
},
},
TrustedSigners: &cloudfront.TrustedSigners{
Enabled: aws.Bool(false),
Quantity: aws.Int64(0),
},
ForwardedValues: &cloudfront.ForwardedValues{
Cookies: &cloudfront.CookiePreference{
Forward: aws.String("none"),
},
QueryString: aws.Bool(false),
},
},
},
}
result, err := svc.CreateDistributionWithTags(input)
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
case cloudfront.ErrCodeCNAMEAlreadyExists:
fmt.Println(cloudfront.ErrCodeCNAMEAlreadyExists, aerr.Error())
case cloudfront.ErrCodeDistributionAlreadyExists:
fmt.Println(cloudfront.ErrCodeDistributionAlreadyExists, aerr.Error())
case cloudfront.ErrCodeInvalidOrigin:
fmt.Println(cloudfront.ErrCodeInvalidOrigin, aerr.Error())
case cloudfront.ErrCodeInvalidOriginAccessIdentity:
fmt.Println(cloudfront.ErrCodeInvalidOriginAccessIdentity, aerr.Error())
case cloudfront.ErrCodeAccessDenied:
fmt.Println(cloudfront.ErrCodeAccessDenied, aerr.Error())
case cloudfront.ErrCodeTooManyTrustedSigners:
fmt.Println(cloudfront.ErrCodeTooManyTrustedSigners, aerr.Error())
case cloudfront.ErrCodeTrustedSignerDoesNotExist:
fmt.Println(cloudfront.ErrCodeTrustedSignerDoesNotExist, aerr.Error())
case cloudfront.ErrCodeInvalidViewerCertificate:
fmt.Println(cloudfront.ErrCodeTooManyCertificates, aerr.Error())
case cloudfront.ErrCodeInvalidLocationCode:
fmt.Println(cloudfront.ErrCodeInvalidLocationCode, aerr.Error())
case cloudfront.ErrCodeInvalidGeoRestrictionParameter:
fmt.Println(cloudfront.ErrCodeInvalidGeoRestrictionParameter, aerr.Error())
case cloudfront.ErrCodeInvalidProtocolSettings:
fmt.Println(cloudfront.ErrCodeInvalidProtocolSettings, aerr.Error())
case cloudfront.ErrCodeInvalidTTLOrder:
fmt.Println(cloudfront.ErrCodeInvalidTTLOrder, aerr.Error())
case cloudfront.ErrCodeInvalidWebACLId:
fmt.Println(cloudfront.ErrCodeInvalidWebACLId, aerr.Error())
case cloudfront.ErrCodeTooManyOriginCustomHeaders:
fmt.Println(cloudfront.ErrCodeTooManyOriginCustomHeaders, aerr.Error())
case cloudfront.ErrCodeTooManyQueryStringParameters:
fmt.Println(cloudfront.ErrCodeTooManyQueryStringParameters, aerr.Error())
case cloudfront.ErrCodeInvalidQueryStringParameters:
fmt.Println(cloudfront.ErrCodeInvalidQueryStringParameters, aerr.Error())
case cloudfront.ErrCodeTooManyDistributionsWithLambdaAssociations:
fmt.Println(cloudfront.ErrCodeTooManyDistributionsWithLambdaAssociations, aerr.Error())
case cloudfront.ErrCodeTooManyLambdaFunctionAssociations:
fmt.Println(cloudfront.ErrCodeTooManyLambdaFunctionAssociations, aerr.Error())
case cloudfront.ErrCodeInvalidLambdaFunctionAssociation:
fmt.Println(cloudfront.ErrCodeInvalidLambdaFunctionAssociation, aerr.Error())
case cloudfront.ErrCodeInvalidOriginReadTimeout:
fmt.Println(cloudfront.ErrCodeInvalidOriginReadTimeout, aerr.Error())
case cloudfront.ErrCodeInvalidOriginKeepaliveTimeout:
fmt.Println(cloudfront.ErrCodeInvalidOriginKeepaliveTimeout, aerr.Error())
default:
fmt.Println(aerr.Error())
}
} else { // Print the error, cast err to awserr.Error to get the Code and Message from an error.
fmt.Println(err.Error())
}
return
}
fmt.Println(result)
}