github.com/atsaki/terraform@v0.4.3-0.20150919165407-25bba5967654/builtin/providers/aws/resource_aws_s3_bucket_object.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 8 "github.com/hashicorp/terraform/helper/schema" 9 10 "github.com/aws/aws-sdk-go/aws" 11 "github.com/aws/aws-sdk-go/aws/awserr" 12 "github.com/aws/aws-sdk-go/service/s3" 13 ) 14 15 func resourceAwsS3BucketObject() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsS3BucketObjectPut, 18 Read: resourceAwsS3BucketObjectRead, 19 Update: resourceAwsS3BucketObjectPut, 20 Delete: resourceAwsS3BucketObjectDelete, 21 22 Schema: map[string]*schema.Schema{ 23 "bucket": &schema.Schema{ 24 Type: schema.TypeString, 25 Required: true, 26 ForceNew: true, 27 }, 28 29 "key": &schema.Schema{ 30 Type: schema.TypeString, 31 Required: true, 32 ForceNew: true, 33 }, 34 35 "source": &schema.Schema{ 36 Type: schema.TypeString, 37 Required: true, 38 ForceNew: true, 39 }, 40 41 "etag": &schema.Schema{ 42 Type: schema.TypeString, 43 Computed: true, 44 }, 45 }, 46 } 47 } 48 49 func resourceAwsS3BucketObjectPut(d *schema.ResourceData, meta interface{}) error { 50 s3conn := meta.(*AWSClient).s3conn 51 52 bucket := d.Get("bucket").(string) 53 key := d.Get("key").(string) 54 source := d.Get("source").(string) 55 56 file, err := os.Open(source) 57 58 if err != nil { 59 return fmt.Errorf("Error opening S3 bucket object source (%s): %s", source, err) 60 } 61 62 resp, err := s3conn.PutObject( 63 &s3.PutObjectInput{ 64 Bucket: aws.String(bucket), 65 Key: aws.String(key), 66 Body: file, 67 }) 68 69 if err != nil { 70 return fmt.Errorf("Error putting object in S3 bucket (%s): %s", bucket, err) 71 } 72 73 d.Set("etag", resp.ETag) 74 d.SetId(key) 75 return nil 76 } 77 78 func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) error { 79 s3conn := meta.(*AWSClient).s3conn 80 81 bucket := d.Get("bucket").(string) 82 key := d.Get("key").(string) 83 etag := d.Get("etag").(string) 84 85 resp, err := s3conn.HeadObject( 86 &s3.HeadObjectInput{ 87 Bucket: aws.String(bucket), 88 Key: aws.String(key), 89 IfMatch: aws.String(etag), 90 }) 91 92 if err != nil { 93 // If S3 returns a 404 Request Failure, mark the object as destroyed 94 if awsErr, ok := err.(awserr.RequestFailure); ok && awsErr.StatusCode() == 404 { 95 d.SetId("") 96 log.Printf("[WARN] Error Reading Object (%s), object not found (HTTP status 404)", key) 97 return nil 98 } 99 return err 100 } 101 102 log.Printf("[DEBUG] Reading S3 Bucket Object meta: %s", resp) 103 return nil 104 } 105 106 func resourceAwsS3BucketObjectDelete(d *schema.ResourceData, meta interface{}) error { 107 s3conn := meta.(*AWSClient).s3conn 108 109 bucket := d.Get("bucket").(string) 110 key := d.Get("key").(string) 111 112 _, err := s3conn.DeleteObject( 113 &s3.DeleteObjectInput{ 114 Bucket: aws.String(bucket), 115 Key: aws.String(key), 116 }) 117 if err != nil { 118 return fmt.Errorf("Error deleting S3 bucket object: %s", err) 119 } 120 return nil 121 }