Skip to content

Commit c16afa7

Browse files
authored
Merge pull request #44838 from tabito-hara/b-aws_cloudfront_distribution-logging_config_include_cookies
[bugfix] aws_cloudfront_distribution: Allow setting `logging_config.include_cookies` without enabling V1 logging
2 parents b91c6a8 + 410b286 commit c16afa7

File tree

4 files changed

+136
-9
lines changed

4 files changed

+136
-9
lines changed

.changelog/44838.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:bug
2+
resource/aws_cloudfront_distribution: Fix inability to configure `logging_config.include_cookies` argument while keeping V1 logging disabled
3+
```
4+
5+
```release-note:bug
6+
resource/aws_cloudfront_distribution: Change `logging_config.bucket` argument from `Required` to `Optional`
7+
```
8+
9+
```release-note:enhancement
10+
resource/aws_cloudfront_distribution: Add `logging_v1_enabled` attribute
11+
```

internal/service/cloudfront/distribution.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ func resourceDistribution() *schema.Resource {
337337
Schema: map[string]*schema.Schema{
338338
names.AttrBucket: {
339339
Type: schema.TypeString,
340-
Required: true,
340+
Optional: true,
341341
},
342342
"include_cookies": {
343343
Type: schema.TypeBool,
@@ -352,6 +352,10 @@ func resourceDistribution() *schema.Resource {
352352
},
353353
},
354354
},
355+
"logging_v1_enabled": {
356+
Type: schema.TypeBool,
357+
Computed: true,
358+
},
355359
"ordered_cache_behavior": {
356360
Type: schema.TypeList,
357361
Optional: true,
@@ -995,11 +999,17 @@ func resourceDistributionRead(ctx context.Context, d *schema.ResourceData, meta
995999
d.Set("in_progress_validation_batches", output.Distribution.InProgressInvalidationBatches)
9961000
d.Set("is_ipv6_enabled", distributionConfig.IsIPV6Enabled)
9971001
d.Set("last_modified_time", aws.String(output.Distribution.LastModifiedTime.String()))
998-
if distributionConfig.Logging != nil && aws.ToBool(distributionConfig.Logging.Enabled) {
999-
if err := d.Set("logging_config", flattenLoggingConfig(distributionConfig.Logging)); err != nil {
1000-
return sdkdiag.AppendErrorf(diags, "setting logging_config: %s", err)
1002+
if distributionConfig.Logging != nil {
1003+
d.Set("logging_v1_enabled", distributionConfig.Logging.Enabled)
1004+
if aws.ToBool(distributionConfig.Logging.Enabled) || aws.ToBool(distributionConfig.Logging.IncludeCookies) {
1005+
if err := d.Set("logging_config", flattenLoggingConfig(distributionConfig.Logging)); err != nil {
1006+
return sdkdiag.AppendErrorf(diags, "setting logging_config: %s", err)
1007+
}
1008+
} else {
1009+
d.Set("logging_config", []any{})
10011010
}
10021011
} else {
1012+
d.Set("logging_v1_enabled", false)
10031013
d.Set("logging_config", []any{})
10041014
}
10051015
if distributionConfig.CacheBehaviors != nil {
@@ -2651,8 +2661,13 @@ func expandLoggingConfig(tfMap map[string]any) *awstypes.LoggingConfig {
26512661
apiObject := &awstypes.LoggingConfig{}
26522662

26532663
if tfMap != nil {
2654-
apiObject.Bucket = aws.String(tfMap[names.AttrBucket].(string))
2655-
apiObject.Enabled = aws.Bool(true)
2664+
if v, ok := tfMap[names.AttrBucket]; ok && v.(string) != "" {
2665+
apiObject.Bucket = aws.String(v.(string))
2666+
apiObject.Enabled = aws.Bool(true)
2667+
} else {
2668+
apiObject.Bucket = aws.String("")
2669+
apiObject.Enabled = aws.Bool(false)
2670+
}
26562671
apiObject.IncludeCookies = aws.Bool(tfMap["include_cookies"].(bool))
26572672
apiObject.Prefix = aws.String(tfMap[names.AttrPrefix].(string))
26582673
} else {

internal/service/cloudfront/distribution_test.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func TestAccCloudFrontDistribution_basic(t *testing.T) {
4141
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsPercent, "0"),
4242
resource.TestCheckResourceAttr(resourceName, "origin.#", "1"),
4343
resource.TestCheckResourceAttr(resourceName, "origin.0.response_completion_timeout", "0"),
44+
resource.TestCheckResourceAttr(resourceName, "logging_v1_enabled", acctest.CtFalse),
4445
),
4546
},
4647
{
@@ -153,6 +154,45 @@ func TestAccCloudFrontDistribution_s3Origin(t *testing.T) {
153154
Check: resource.ComposeTestCheckFunc(
154155
testAccCheckDistributionExists(ctx, "aws_cloudfront_distribution.s3_distribution", &distribution),
155156
resource.TestCheckResourceAttr("aws_cloudfront_distribution.s3_distribution", names.AttrHostedZoneID, "Z2FDTNDATAQYW2"),
157+
resource.TestCheckResourceAttr("aws_cloudfront_distribution.s3_distribution", "logging_v1_enabled", acctest.CtTrue),
158+
),
159+
},
160+
{
161+
ResourceName: "aws_cloudfront_distribution.s3_distribution",
162+
ImportState: true,
163+
ImportStateVerify: true,
164+
ImportStateVerifyIgnore: []string{
165+
"retain_on_delete",
166+
"wait_for_deployment",
167+
},
168+
},
169+
},
170+
})
171+
}
172+
173+
func TestAccCloudFrontDistribution_includeCookieWhenV1loggingDisabled(t *testing.T) {
174+
ctx := acctest.Context(t)
175+
if testing.Short() {
176+
t.Skip("skipping long-running test in short mode")
177+
}
178+
179+
var distribution awstypes.Distribution
180+
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
181+
182+
resource.ParallelTest(t, resource.TestCase{
183+
PreCheck: func() { acctest.PreCheck(ctx, t); acctest.PreCheckPartitionHasService(t, names.CloudFrontEndpointID) },
184+
ErrorCheck: acctest.ErrorCheck(t, names.CloudFrontServiceID),
185+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
186+
CheckDestroy: testAccCheckDistributionDestroy(ctx),
187+
Steps: []resource.TestStep{
188+
{
189+
Config: testAccDistributionConfig_includeCookiesWhenV1loggingDisabled(rName),
190+
Check: resource.ComposeTestCheckFunc(
191+
testAccCheckDistributionExists(ctx, "aws_cloudfront_distribution.s3_distribution", &distribution),
192+
resource.TestCheckResourceAttr("aws_cloudfront_distribution.s3_distribution", names.AttrHostedZoneID, "Z2FDTNDATAQYW2"),
193+
resource.TestCheckResourceAttr("aws_cloudfront_distribution.s3_distribution", "logging_config.#", "1"),
194+
resource.TestCheckResourceAttr("aws_cloudfront_distribution.s3_distribution", "logging_config.0.include_cookies", acctest.CtTrue),
195+
resource.TestCheckResourceAttr("aws_cloudfront_distribution.s3_distribution", "logging_v1_enabled", acctest.CtFalse),
156196
),
157197
},
158198
{
@@ -1931,6 +1971,66 @@ resource "aws_cloudfront_distribution" "s3_distribution" {
19311971
`, testAccDistributionRetainConfig()))
19321972
}
19331973

1974+
func testAccDistributionConfig_includeCookiesWhenV1loggingDisabled(rName string) string {
1975+
return acctest.ConfigCompose(
1976+
originBucket(rName),
1977+
logBucket(rName),
1978+
fmt.Sprintf(`
1979+
resource "aws_cloudfront_distribution" "s3_distribution" {
1980+
depends_on = [
1981+
aws_s3_bucket_acl.s3_bucket_origin_acl,
1982+
aws_s3_bucket_acl.s3_bucket_logs_acl,
1983+
]
1984+
1985+
origin {
1986+
domain_name = aws_s3_bucket.s3_bucket_origin.bucket_regional_domain_name
1987+
origin_id = "myS3Origin"
1988+
}
1989+
1990+
enabled = true
1991+
default_root_object = "index.html"
1992+
1993+
logging_config {
1994+
include_cookies = true
1995+
}
1996+
1997+
default_cache_behavior {
1998+
allowed_methods = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
1999+
cached_methods = ["GET", "HEAD"]
2000+
target_origin_id = "myS3Origin"
2001+
2002+
forwarded_values {
2003+
query_string = false
2004+
2005+
cookies {
2006+
forward = "none"
2007+
}
2008+
}
2009+
2010+
viewer_protocol_policy = "allow-all"
2011+
min_ttl = 0
2012+
default_ttl = 3600
2013+
max_ttl = 86400
2014+
}
2015+
2016+
price_class = "PriceClass_200"
2017+
2018+
restrictions {
2019+
geo_restriction {
2020+
restriction_type = "whitelist"
2021+
locations = ["US", "CA", "GB", "DE"]
2022+
}
2023+
}
2024+
2025+
viewer_certificate {
2026+
cloudfront_default_certificate = true
2027+
}
2028+
2029+
%[1]s
2030+
}
2031+
`, testAccDistributionRetainConfig()))
2032+
}
2033+
19342034
func testAccDistributionConfig_tags1(tagKey1, tagValue1 string) string {
19352035
return fmt.Sprintf(`
19362036
resource "aws_cloudfront_distribution" "test" {

website/docs/r/cloudfront_distribution.html.markdown

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -526,9 +526,9 @@ argument should not be specified.
526526

527527
#### Logging Config Arguments
528528

529-
* `bucket` (Required) - Amazon S3 bucket to store the access logs in, for example, `myawslogbucket.s3.amazonaws.com`. The bucket must have correct ACL attached with "FULL_CONTROL" permission for "awslogsdelivery" account (Canonical ID: "c4c1ede66af53448b93c283ce9448c4ba468c9432aa01d700d3878632f77d2d0") for log transfer to work.
530-
* `include_cookies` (Optional) - Whether to include cookies in access logs (default: `false`).
531-
* `prefix` (Optional) - Prefix to the access log filenames for this distribution, for example, `myprefix/`.
529+
* `bucket` (Optional) - Amazon S3 bucket for V1 logging where access logs are stored, for example, `myawslogbucket.s3.amazonaws.com`. V1 logging is enabled when this argument is specified. The bucket must have correct ACL attached with "FULL_CONTROL" permission for "awslogsdelivery" account (Canonical ID: "c4c1ede66af53448b93c283ce9448c4ba468c9432aa01d700d3878632f77d2d0") for log transfer to work.
530+
* `include_cookies` (Optional) - Whether to include cookies in access logs (default: `false`). This argument applies to both V1 and V2 logging.
531+
* `prefix` (Optional) - Prefix added to the access log file names for V1 logging, for example, `myprefix/`. This argument is effective only when V1 logging is enabled.
532532

533533
#### Origin Arguments
534534

@@ -608,6 +608,7 @@ This resource exports the following attributes in addition to the arguments abov
608608
* `id` - Identifier for the distribution. For example: `EDFDVBD632BHDS5`.
609609
* `arn` - ARN for the distribution. For example: `arn:aws:cloudfront::123456789012:distribution/EDFDVBD632BHDS5`, where `123456789012` is your AWS account ID.
610610
* `caller_reference` - Internal value used by CloudFront to allow future updates to the distribution configuration.
611+
* `logging_v1_enabled` - Whether V1 logging is enabled for the distribution.
611612
* `status` - Current status of the distribution. `Deployed` if the distribution's information is fully propagated throughout the Amazon CloudFront system.
612613
* `tags_all` - Map of tags assigned to the resource, including those inherited from the provider [`default_tags` configuration block](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#default_tags-configuration-block).
613614
* `trusted_key_groups` - List of nested attributes for active trusted key groups, if the distribution is set up to serve private content with signed URLs.

0 commit comments

Comments
 (0)