github.com/wangzhucn/terraform@v0.6.7-0.20151109233120-4eea011b56b3/builtin/providers/aws/resource_aws_cloudtrail.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/service/cloudtrail"
     9  	"github.com/hashicorp/terraform/helper/schema"
    10  )
    11  
    12  func resourceAwsCloudTrail() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceAwsCloudTrailCreate,
    15  		Read:   resourceAwsCloudTrailRead,
    16  		Update: resourceAwsCloudTrailUpdate,
    17  		Delete: resourceAwsCloudTrailDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"name": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Required: true,
    23  				ForceNew: true,
    24  			},
    25  			"s3_bucket_name": &schema.Schema{
    26  				Type:     schema.TypeString,
    27  				Required: true,
    28  			},
    29  			"s3_key_prefix": &schema.Schema{
    30  				Type:     schema.TypeString,
    31  				Optional: true,
    32  			},
    33  			"cloud_watch_logs_role_arn": &schema.Schema{
    34  				Type:     schema.TypeString,
    35  				Optional: true,
    36  			},
    37  			"cloud_watch_logs_group_arn": &schema.Schema{
    38  				Type:     schema.TypeString,
    39  				Optional: true,
    40  			},
    41  			"include_global_service_events": &schema.Schema{
    42  				Type:     schema.TypeBool,
    43  				Optional: true,
    44  				Default:  true,
    45  			},
    46  			"sns_topic_name": &schema.Schema{
    47  				Type:     schema.TypeString,
    48  				Optional: true,
    49  			},
    50  		},
    51  	}
    52  }
    53  
    54  func resourceAwsCloudTrailCreate(d *schema.ResourceData, meta interface{}) error {
    55  	conn := meta.(*AWSClient).cloudtrailconn
    56  
    57  	input := cloudtrail.CreateTrailInput{
    58  		Name:         aws.String(d.Get("name").(string)),
    59  		S3BucketName: aws.String(d.Get("s3_bucket_name").(string)),
    60  	}
    61  
    62  	if v, ok := d.GetOk("cloud_watch_logs_group_arn"); ok {
    63  		input.CloudWatchLogsLogGroupArn = aws.String(v.(string))
    64  	}
    65  	if v, ok := d.GetOk("cloud_watch_logs_role_arn"); ok {
    66  		input.CloudWatchLogsRoleArn = aws.String(v.(string))
    67  	}
    68  	if v, ok := d.GetOk("include_global_service_events"); ok {
    69  		input.IncludeGlobalServiceEvents = aws.Bool(v.(bool))
    70  	}
    71  	if v, ok := d.GetOk("s3_key_prefix"); ok {
    72  		input.S3KeyPrefix = aws.String(v.(string))
    73  	}
    74  	if v, ok := d.GetOk("sns_topic_name"); ok {
    75  		input.SnsTopicName = aws.String(v.(string))
    76  	}
    77  
    78  	t, err := conn.CreateTrail(&input)
    79  	if err != nil {
    80  		return err
    81  	}
    82  
    83  	log.Printf("[DEBUG] CloudTrail created: %s", t)
    84  
    85  	d.SetId(*t.Name)
    86  
    87  	return resourceAwsCloudTrailRead(d, meta)
    88  }
    89  
    90  func resourceAwsCloudTrailRead(d *schema.ResourceData, meta interface{}) error {
    91  	conn := meta.(*AWSClient).cloudtrailconn
    92  
    93  	name := d.Get("name").(string)
    94  	input := cloudtrail.DescribeTrailsInput{
    95  		TrailNameList: []*string{
    96  			aws.String(name),
    97  		},
    98  	}
    99  	resp, err := conn.DescribeTrails(&input)
   100  	if err != nil {
   101  		return err
   102  	}
   103  	if len(resp.TrailList) == 0 {
   104  		return fmt.Errorf("No CloudTrail found, using name %q", name)
   105  	}
   106  
   107  	trail := resp.TrailList[0]
   108  	log.Printf("[DEBUG] CloudTrail received: %s", trail)
   109  
   110  	d.Set("name", trail.Name)
   111  	d.Set("s3_bucket_name", trail.S3BucketName)
   112  	d.Set("s3_key_prefix", trail.S3KeyPrefix)
   113  	d.Set("cloud_watch_logs_role_arn", trail.CloudWatchLogsRoleArn)
   114  	d.Set("cloud_watch_logs_group_arn", trail.CloudWatchLogsLogGroupArn)
   115  	d.Set("include_global_service_events", trail.IncludeGlobalServiceEvents)
   116  	d.Set("sns_topic_name", trail.SnsTopicName)
   117  
   118  	return nil
   119  }
   120  
   121  func resourceAwsCloudTrailUpdate(d *schema.ResourceData, meta interface{}) error {
   122  	conn := meta.(*AWSClient).cloudtrailconn
   123  
   124  	input := cloudtrail.UpdateTrailInput{
   125  		Name: aws.String(d.Get("name").(string)),
   126  	}
   127  
   128  	if d.HasChange("s3_bucket_name") {
   129  		input.S3BucketName = aws.String(d.Get("s3_bucket_name").(string))
   130  	}
   131  	if d.HasChange("s3_key_prefix") {
   132  		input.S3KeyPrefix = aws.String(d.Get("s3_key_prefix").(string))
   133  	}
   134  	if d.HasChange("cloud_watch_logs_role_arn") {
   135  		input.CloudWatchLogsRoleArn = aws.String(d.Get("cloud_watch_logs_role_arn").(string))
   136  	}
   137  	if d.HasChange("cloud_watch_logs_group_arn") {
   138  		input.CloudWatchLogsLogGroupArn = aws.String(d.Get("cloud_watch_logs_group_arn").(string))
   139  	}
   140  	if d.HasChange("include_global_service_events") {
   141  		input.IncludeGlobalServiceEvents = aws.Bool(d.Get("include_global_service_events").(bool))
   142  	}
   143  	if d.HasChange("sns_topic_name") {
   144  		input.SnsTopicName = aws.String(d.Get("sns_topic_name").(string))
   145  	}
   146  
   147  	log.Printf("[DEBUG] Updating CloudTrail: %s", input)
   148  	t, err := conn.UpdateTrail(&input)
   149  	if err != nil {
   150  		return err
   151  	}
   152  	log.Printf("[DEBUG] CloudTrail updated: %s", t)
   153  
   154  	return resourceAwsCloudTrailRead(d, meta)
   155  }
   156  
   157  func resourceAwsCloudTrailDelete(d *schema.ResourceData, meta interface{}) error {
   158  	conn := meta.(*AWSClient).cloudtrailconn
   159  	name := d.Get("name").(string)
   160  
   161  	log.Printf("[DEBUG] Deleting CloudTrail: %q", name)
   162  	_, err := conn.DeleteTrail(&cloudtrail.DeleteTrailInput{
   163  		Name: aws.String(name),
   164  	})
   165  
   166  	return err
   167  }