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  }