1//go:build example
2// +build example
3
4package main
5
6import (
7	"fmt"
8	"io/ioutil"
9
10	"github.com/aws/aws-sdk-go/aws"
11	"github.com/aws/aws-sdk-go/aws/arn"
12	"github.com/aws/aws-sdk-go/aws/session"
13	"github.com/aws/aws-sdk-go/service/s3"
14	"github.com/aws/aws-sdk-go/service/s3control"
15)
16
17const (
18	bucketName  = "myBucketName"
19	keyName     = "myKeyName"
20	accountID   = "123456789012"
21	accessPoint = "accesspointname"
22)
23
24func main() {
25	sess := session.Must(session.NewSession())
26
27	s3Svc := s3.New(sess)
28	s3ControlSvc := s3control.New(sess)
29
30	// Create an S3 Bucket
31	fmt.Println("create s3 bucket")
32	_, err := s3Svc.CreateBucket(&s3.CreateBucketInput{
33		Bucket: aws.String(bucketName),
34	})
35	if err != nil {
36		panic(fmt.Errorf("failed to create bucket: %v", err))
37	}
38
39	// Wait for S3 Bucket to Exist
40	fmt.Println("wait for s3 bucket to exist")
41	err = s3Svc.WaitUntilBucketExists(&s3.HeadBucketInput{
42		Bucket: aws.String(bucketName),
43	})
44	if err != nil {
45		panic(fmt.Sprintf("bucket failed to materialize: %v", err))
46	}
47
48	// Create an Access Point referring to the bucket
49	fmt.Println("create an access point")
50	_, err = s3ControlSvc.CreateAccessPoint(&s3control.CreateAccessPointInput{
51		AccountId: aws.String(accountID),
52		Bucket:    aws.String(bucketName),
53		Name:      aws.String(accessPoint),
54	})
55	if err != nil {
56		panic(fmt.Sprintf("failed to create access point: %v", err))
57	}
58
59	// Use the SDK's ARN builder to create an ARN for the Access Point.
60	apARN := arn.ARN{
61		Partition: "aws",
62		Service:   "s3",
63		Region:    aws.StringValue(sess.Config.Region),
64		AccountID: accountID,
65		Resource:  "accesspoint/" + accessPoint,
66	}
67
68	// And Use Access Point ARN where bucket parameters are accepted
69	fmt.Println("get object using access point")
70	getObjectOutput, err := s3Svc.GetObject(&s3.GetObjectInput{
71		Bucket: aws.String(apARN.String()),
72		Key:    aws.String("somekey"),
73	})
74	if err != nil {
75		panic(fmt.Sprintf("failed get object request: %v", err))
76	}
77
78	_, err = ioutil.ReadAll(getObjectOutput.Body)
79	if err != nil {
80		panic(fmt.Sprintf("failed to read object body: %v", err))
81	}
82}
83