github.com/alexissmirnov/terraform@v0.4.3-0.20150423153700-1ef9731a2f14/builtin/providers/aws/resource_aws_s3_bucket.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 9 "github.com/awslabs/aws-sdk-go/aws" 10 "github.com/awslabs/aws-sdk-go/service/s3" 11 ) 12 13 func resourceAwsS3Bucket() *schema.Resource { 14 return &schema.Resource{ 15 Create: resourceAwsS3BucketCreate, 16 Read: resourceAwsS3BucketRead, 17 Update: resourceAwsS3BucketUpdate, 18 Delete: resourceAwsS3BucketDelete, 19 20 Schema: map[string]*schema.Schema{ 21 "bucket": &schema.Schema{ 22 Type: schema.TypeString, 23 Required: true, 24 ForceNew: true, 25 }, 26 27 "acl": &schema.Schema{ 28 Type: schema.TypeString, 29 Default: "private", 30 Optional: true, 31 ForceNew: true, 32 }, 33 34 "tags": tagsSchema(), 35 }, 36 } 37 } 38 39 func resourceAwsS3BucketCreate(d *schema.ResourceData, meta interface{}) error { 40 s3conn := meta.(*AWSClient).s3conn 41 awsRegion := meta.(*AWSClient).region 42 43 // Get the bucket and acl 44 bucket := d.Get("bucket").(string) 45 acl := d.Get("acl").(string) 46 47 log.Printf("[DEBUG] S3 bucket create: %s, ACL: %s", bucket, acl) 48 49 req := &s3.CreateBucketInput{ 50 Bucket: aws.String(bucket), 51 ACL: aws.String(acl), 52 } 53 54 // Special case us-east-1 region and do not set the LocationConstraint. 55 // See "Request Elements: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUT.html 56 if awsRegion != "us-east-1" { 57 req.CreateBucketConfiguration = &s3.CreateBucketConfiguration{ 58 LocationConstraint: aws.String(awsRegion), 59 } 60 } 61 62 _, err := s3conn.CreateBucket(req) 63 if err != nil { 64 return fmt.Errorf("Error creating S3 bucket: %s", err) 65 } 66 67 // Assign the bucket name as the resource ID 68 d.SetId(bucket) 69 70 return resourceAwsS3BucketUpdate(d, meta) 71 } 72 73 func resourceAwsS3BucketUpdate(d *schema.ResourceData, meta interface{}) error { 74 s3conn := meta.(*AWSClient).s3conn 75 if err := setTagsS3(s3conn, d); err != nil { 76 return err 77 } 78 return resourceAwsS3BucketRead(d, meta) 79 } 80 81 func resourceAwsS3BucketRead(d *schema.ResourceData, meta interface{}) error { 82 s3conn := meta.(*AWSClient).s3conn 83 84 _, err := s3conn.HeadBucket(&s3.HeadBucketInput{ 85 Bucket: aws.String(d.Id()), 86 }) 87 if err != nil { 88 if awsError, ok := err.(aws.APIError); ok && awsError.StatusCode == 404 { 89 d.SetId("") 90 } else { 91 // some of the AWS SDK's errors can be empty strings, so let's add 92 // some additional context. 93 return fmt.Errorf("error reading S3 bucket \"%s\": %s", d.Id(), err) 94 } 95 } 96 97 tagSet, err := getTagSetS3(s3conn, d.Id()) 98 if err != nil { 99 return err 100 } 101 102 if err := d.Set("tags", tagsToMapS3(tagSet)); err != nil { 103 return err 104 } 105 106 return nil 107 } 108 109 func resourceAwsS3BucketDelete(d *schema.ResourceData, meta interface{}) error { 110 s3conn := meta.(*AWSClient).s3conn 111 112 log.Printf("[DEBUG] S3 Delete Bucket: %s", d.Id()) 113 _, err := s3conn.DeleteBucket(&s3.DeleteBucketInput{ 114 Bucket: aws.String(d.Id()), 115 }) 116 if err != nil { 117 return err 118 } 119 return nil 120 }