github.com/jsoriano/terraform@v0.6.7-0.20151026070445-8b70867fdd95/builtin/providers/aws/resource_aws_s3_bucket_object.go (about) 1 package aws 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "log" 8 "os" 9 10 "github.com/hashicorp/terraform/helper/schema" 11 12 "github.com/aws/aws-sdk-go/aws" 13 "github.com/aws/aws-sdk-go/aws/awserr" 14 "github.com/aws/aws-sdk-go/service/s3" 15 ) 16 17 func resourceAwsS3BucketObject() *schema.Resource { 18 return &schema.Resource{ 19 Create: resourceAwsS3BucketObjectPut, 20 Read: resourceAwsS3BucketObjectRead, 21 Delete: resourceAwsS3BucketObjectDelete, 22 23 Schema: map[string]*schema.Schema{ 24 "bucket": &schema.Schema{ 25 Type: schema.TypeString, 26 Required: true, 27 ForceNew: true, 28 }, 29 30 "cache_control": &schema.Schema{ 31 Type: schema.TypeString, 32 Optional: true, 33 ForceNew: true, 34 }, 35 36 "content_disposition": &schema.Schema{ 37 Type: schema.TypeString, 38 Optional: true, 39 ForceNew: true, 40 }, 41 42 "content_encoding": &schema.Schema{ 43 Type: schema.TypeString, 44 Optional: true, 45 ForceNew: true, 46 }, 47 48 "content_language": &schema.Schema{ 49 Type: schema.TypeString, 50 Optional: true, 51 ForceNew: true, 52 }, 53 54 "content_type": &schema.Schema{ 55 Type: schema.TypeString, 56 Optional: true, 57 ForceNew: true, 58 Computed: true, 59 }, 60 61 "key": &schema.Schema{ 62 Type: schema.TypeString, 63 Required: true, 64 ForceNew: true, 65 }, 66 67 "source": &schema.Schema{ 68 Type: schema.TypeString, 69 Optional: true, 70 ForceNew: true, 71 ConflictsWith: []string{"content"}, 72 }, 73 74 "content": &schema.Schema{ 75 Type: schema.TypeString, 76 Optional: true, 77 ForceNew: true, 78 ConflictsWith: []string{"source"}, 79 }, 80 81 "etag": &schema.Schema{ 82 Type: schema.TypeString, 83 Computed: true, 84 }, 85 }, 86 } 87 } 88 89 func resourceAwsS3BucketObjectPut(d *schema.ResourceData, meta interface{}) error { 90 s3conn := meta.(*AWSClient).s3conn 91 92 bucket := d.Get("bucket").(string) 93 key := d.Get("key").(string) 94 var body io.ReadSeeker 95 96 if v, ok := d.GetOk("source"); ok { 97 source := v.(string) 98 file, err := os.Open(source) 99 if err != nil { 100 return fmt.Errorf("Error opening S3 bucket object source (%s): %s", source, err) 101 } 102 103 body = file 104 } else if v, ok := d.GetOk("content"); ok { 105 content := v.(string) 106 body = bytes.NewReader([]byte(content)) 107 } else { 108 109 return fmt.Errorf("Must specify \"source\" or \"content\" field") 110 } 111 putInput := &s3.PutObjectInput{ 112 Bucket: aws.String(bucket), 113 Key: aws.String(key), 114 Body: body, 115 } 116 117 if v, ok := d.GetOk("cache_control"); ok { 118 putInput.CacheControl = aws.String(v.(string)) 119 } 120 121 if v, ok := d.GetOk("content_type"); ok { 122 putInput.ContentType = aws.String(v.(string)) 123 } 124 125 if v, ok := d.GetOk("content_encoding"); ok { 126 putInput.ContentEncoding = aws.String(v.(string)) 127 } 128 129 if v, ok := d.GetOk("content_language"); ok { 130 putInput.ContentLanguage = aws.String(v.(string)) 131 } 132 133 if v, ok := d.GetOk("content_disposition"); ok { 134 putInput.ContentDisposition = aws.String(v.(string)) 135 } 136 137 resp, err := s3conn.PutObject(putInput) 138 if err != nil { 139 return fmt.Errorf("Error putting object in S3 bucket (%s): %s", bucket, err) 140 } 141 142 d.Set("etag", resp.ETag) 143 d.SetId(key) 144 return nil 145 } 146 147 func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) error { 148 s3conn := meta.(*AWSClient).s3conn 149 150 bucket := d.Get("bucket").(string) 151 key := d.Get("key").(string) 152 etag := d.Get("etag").(string) 153 154 resp, err := s3conn.HeadObject( 155 &s3.HeadObjectInput{ 156 Bucket: aws.String(bucket), 157 Key: aws.String(key), 158 IfMatch: aws.String(etag), 159 }) 160 161 if err != nil { 162 // If S3 returns a 404 Request Failure, mark the object as destroyed 163 if awsErr, ok := err.(awserr.RequestFailure); ok && awsErr.StatusCode() == 404 { 164 d.SetId("") 165 log.Printf("[WARN] Error Reading Object (%s), object not found (HTTP status 404)", key) 166 return nil 167 } 168 return err 169 } 170 171 d.Set("cache_control", resp.CacheControl) 172 d.Set("content_disposition", resp.ContentDisposition) 173 d.Set("content_encoding", resp.ContentEncoding) 174 d.Set("content_language", resp.ContentLanguage) 175 d.Set("content_type", resp.ContentType) 176 177 log.Printf("[DEBUG] Reading S3 Bucket Object meta: %s", resp) 178 return nil 179 } 180 181 func resourceAwsS3BucketObjectDelete(d *schema.ResourceData, meta interface{}) error { 182 s3conn := meta.(*AWSClient).s3conn 183 184 bucket := d.Get("bucket").(string) 185 key := d.Get("key").(string) 186 187 _, err := s3conn.DeleteObject( 188 &s3.DeleteObjectInput{ 189 Bucket: aws.String(bucket), 190 Key: aws.String(key), 191 }) 192 if err != nil { 193 return fmt.Errorf("Error deleting S3 bucket object: %s", err) 194 } 195 return nil 196 }