Skip to content

Commit f2af02e

Browse files
committed
provider/aws: Add aws_config_delivery_channel
1 parent a2b63f9 commit f2af02e

6 files changed

Lines changed: 568 additions & 0 deletions

File tree

‎builtin/providers/aws/provider.go‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ func Provider() terraform.ResourceProvider {
234234
"aws_config_config_rule": resourceAwsConfigConfigRule(),
235235
"aws_config_configuration_recorder": resourceAwsConfigConfigurationRecorder(),
236236
"aws_config_configuration_recorder_status": resourceAwsConfigConfigurationRecorderStatus(),
237+
"aws_config_delivery_channel": resourceAwsConfigDeliveryChannel(),
237238
"aws_autoscaling_lifecycle_hook": resourceAwsAutoscalingLifecycleHook(),
238239
"aws_cloudwatch_metric_alarm": resourceAwsCloudWatchMetricAlarm(),
239240
"aws_codedeploy_app": resourceAwsCodeDeployApp(),
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
package aws
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"time"
7+
8+
"github.com/hashicorp/terraform/helper/resource"
9+
"github.com/hashicorp/terraform/helper/schema"
10+
11+
"github.com/aws/aws-sdk-go/aws"
12+
"github.com/aws/aws-sdk-go/aws/awserr"
13+
"github.com/aws/aws-sdk-go/service/configservice"
14+
)
15+
16+
func resourceAwsConfigDeliveryChannel() *schema.Resource {
17+
return &schema.Resource{
18+
Create: resourceAwsConfigDeliveryChannelPut,
19+
Read: resourceAwsConfigDeliveryChannelRead,
20+
Update: resourceAwsConfigDeliveryChannelPut,
21+
Delete: resourceAwsConfigDeliveryChannelDelete,
22+
23+
Importer: &schema.ResourceImporter{
24+
State: schema.ImportStatePassthrough,
25+
},
26+
27+
Schema: map[string]*schema.Schema{
28+
"name": {
29+
Type: schema.TypeString,
30+
Optional: true,
31+
Default: "default",
32+
ValidateFunc: validateMaxLength(256),
33+
},
34+
"s3_bucket_name": {
35+
Type: schema.TypeString,
36+
Required: true,
37+
},
38+
"s3_key_prefix": {
39+
Type: schema.TypeString,
40+
Optional: true,
41+
},
42+
"sns_topic_arn": {
43+
Type: schema.TypeString,
44+
Optional: true,
45+
ValidateFunc: validateArn,
46+
},
47+
"snapshot_delivery_properties": {
48+
Type: schema.TypeList,
49+
Optional: true,
50+
MaxItems: 1,
51+
Elem: &schema.Resource{
52+
Schema: map[string]*schema.Schema{
53+
"delivery_frequency": {
54+
Type: schema.TypeString,
55+
Optional: true,
56+
ValidateFunc: validateConfigExecutionFrequency,
57+
},
58+
},
59+
},
60+
},
61+
},
62+
}
63+
}
64+
65+
func resourceAwsConfigDeliveryChannelPut(d *schema.ResourceData, meta interface{}) error {
66+
conn := meta.(*AWSClient).configconn
67+
68+
name := d.Get("name").(string)
69+
channel := configservice.DeliveryChannel{
70+
Name: aws.String(name),
71+
S3BucketName: aws.String(d.Get("s3_bucket_name").(string)),
72+
}
73+
74+
if v, ok := d.GetOk("s3_key_prefix"); ok {
75+
channel.S3KeyPrefix = aws.String(v.(string))
76+
}
77+
if v, ok := d.GetOk("sns_topic_arn"); ok {
78+
channel.SnsTopicARN = aws.String(v.(string))
79+
}
80+
81+
if p, ok := d.GetOk("snapshot_delivery_properties"); ok {
82+
propertiesBlocks := p.([]interface{})
83+
block := propertiesBlocks[0].(map[string]interface{})
84+
85+
if v, ok := block["delivery_frequency"]; ok {
86+
channel.ConfigSnapshotDeliveryProperties = &configservice.ConfigSnapshotDeliveryProperties{
87+
DeliveryFrequency: aws.String(v.(string)),
88+
}
89+
}
90+
}
91+
92+
input := configservice.PutDeliveryChannelInput{DeliveryChannel: &channel}
93+
94+
err := resource.Retry(2*time.Minute, func() *resource.RetryError {
95+
_, err := conn.PutDeliveryChannel(&input)
96+
if err == nil {
97+
return nil
98+
}
99+
100+
awsErr, ok := err.(awserr.Error)
101+
if ok && awsErr.Code() == "InsufficientDeliveryPolicyException" {
102+
return resource.RetryableError(err)
103+
}
104+
105+
return resource.NonRetryableError(err)
106+
})
107+
if err != nil {
108+
return fmt.Errorf("Creating Delivery Channel failed: %s", err)
109+
}
110+
111+
d.SetId(name)
112+
113+
return resourceAwsConfigDeliveryChannelRead(d, meta)
114+
}
115+
116+
func resourceAwsConfigDeliveryChannelRead(d *schema.ResourceData, meta interface{}) error {
117+
conn := meta.(*AWSClient).configconn
118+
119+
input := configservice.DescribeDeliveryChannelsInput{
120+
DeliveryChannelNames: []*string{aws.String(d.Id())},
121+
}
122+
out, err := conn.DescribeDeliveryChannels(&input)
123+
if err != nil {
124+
if awsErr, ok := err.(awserr.Error); ok {
125+
if awsErr.Code() == "NoSuchDeliveryChannelException" {
126+
log.Printf("[WARN] Delivery Channel %q is gone (NoSuchDeliveryChannelException)", d.Id())
127+
d.SetId("")
128+
return nil
129+
}
130+
}
131+
return fmt.Errorf("Getting Delivery Channel failed: %s", err)
132+
}
133+
134+
if len(out.DeliveryChannels) < 1 {
135+
log.Printf("[WARN] Delivery Channel %q is gone (no channels found)", d.Id())
136+
d.SetId("")
137+
return nil
138+
}
139+
140+
if len(out.DeliveryChannels) > 1 {
141+
return fmt.Errorf("Received %d delivery channels under %s (expected exactly 1): %s",
142+
len(out.DeliveryChannels), d.Id(), out.DeliveryChannels)
143+
}
144+
145+
channel := out.DeliveryChannels[0]
146+
147+
d.Set("name", channel.Name)
148+
d.Set("s3_bucket_name", channel.S3BucketName)
149+
d.Set("s3_key_prefix", channel.S3KeyPrefix)
150+
d.Set("sns_topic_arn", channel.SnsTopicARN)
151+
152+
if channel.ConfigSnapshotDeliveryProperties != nil {
153+
d.Set("snapshot_delivery_properties", flattenConfigSnapshotDeliveryProperties(channel.ConfigSnapshotDeliveryProperties))
154+
}
155+
156+
return nil
157+
}
158+
159+
func resourceAwsConfigDeliveryChannelDelete(d *schema.ResourceData, meta interface{}) error {
160+
conn := meta.(*AWSClient).configconn
161+
input := configservice.DeleteDeliveryChannelInput{
162+
DeliveryChannelName: aws.String(d.Id()),
163+
}
164+
_, err := conn.DeleteDeliveryChannel(&input)
165+
if err != nil {
166+
return fmt.Errorf("Unable to delete delivery channel: %s", err)
167+
}
168+
169+
d.SetId("")
170+
return nil
171+
}

0 commit comments

Comments
 (0)