@@ -80,7 +80,7 @@ func TestAwsBootstrapBackend(t *testing.T) {
80
80
81
81
require .NoError (t , err )
82
82
83
- validateS3BucketExistsAndIsTagged (t , helpers .TerraformRemoteStateS3Region , s3BucketName , nil )
83
+ validateS3BucketExistsAndIsTaggedAndVersioning (t , helpers .TerraformRemoteStateS3Region , s3BucketName , true , nil )
84
84
validateDynamoDBTableExistsAndIsTaggedAndIsSSEncrypted (t , helpers .TerraformRemoteStateS3Region , dynamoDBName , nil , false )
85
85
},
86
86
},
@@ -92,7 +92,7 @@ func TestAwsBootstrapBackend(t *testing.T) {
92
92
93
93
require .NoError (t , err )
94
94
95
- validateS3BucketExistsAndIsTagged (t , helpers .TerraformRemoteStateS3Region , s3BucketName , nil )
95
+ validateS3BucketExistsAndIsTaggedAndVersioning (t , helpers .TerraformRemoteStateS3Region , s3BucketName , true , nil )
96
96
validateDynamoDBTableExistsAndIsTaggedAndIsSSEncrypted (t , helpers .TerraformRemoteStateS3Region , dynamoDBName , nil , true )
97
97
},
98
98
},
@@ -104,7 +104,7 @@ func TestAwsBootstrapBackend(t *testing.T) {
104
104
105
105
require .NoError (t , err )
106
106
107
- validateS3BucketExistsAndIsTagged (t , helpers .TerraformRemoteStateS3Region , s3BucketName , nil )
107
+ validateS3BucketExistsAndIsTaggedAndVersioning (t , helpers .TerraformRemoteStateS3Region , s3BucketName , true , nil )
108
108
validateDynamoDBTableExistsAndIsTaggedAndIsSSEncrypted (t , helpers .TerraformRemoteStateS3Region , dynamoDBName , nil , false )
109
109
},
110
110
},
@@ -161,7 +161,7 @@ func TestAwsBootstrapBackendLegacyBehavior(t *testing.T) {
161
161
_ , stderr , err := helpers .RunTerragruntCommandWithOutput (t , "terragrunt run --all --non-interactive --log-level debug --working-dir " + rootPath + " apply" )
162
162
require .NoError (t , err )
163
163
164
- validateS3BucketExistsAndIsTagged (t , helpers .TerraformRemoteStateS3Region , s3BucketName , nil )
164
+ validateS3BucketExistsAndIsTaggedAndVersioning (t , helpers .TerraformRemoteStateS3Region , s3BucketName , true , nil )
165
165
validateDynamoDBTableExistsAndIsTaggedAndIsSSEncrypted (t , helpers .TerraformRemoteStateS3Region , dynamoDBName , nil , false )
166
166
167
167
assert .Contains (t , stderr , "Use the explicit `--backend-bootstrap` flag to automatically provision backend resources before they're needed." )
@@ -204,7 +204,7 @@ func TestAwsBootstrapBackendWithoutVersioning(t *testing.T) {
204
204
_ , _ , err := helpers .RunTerragruntCommandWithOutput (t , "terragrunt run --all --non-interactive --log-level debug --strict-control require-explicit-bootstrap --working-dir " + rootPath + " --feature disable_versioning=true --backend-bootstrap apply" )
205
205
require .NoError (t , err )
206
206
207
- validateS3BucketExistsAndIsTagged (t , helpers .TerraformRemoteStateS3Region , s3BucketName , nil )
207
+ validateS3BucketExistsAndIsTaggedAndVersioning (t , helpers .TerraformRemoteStateS3Region , s3BucketName , false , nil )
208
208
validateDynamoDBTableExistsAndIsTaggedAndIsSSEncrypted (t , helpers .TerraformRemoteStateS3Region , dynamoDBName , nil , false )
209
209
210
210
_ , _ , err = helpers .RunTerragruntCommandWithOutput (t , "terragrunt --non-interactive --log-level debug --working-dir " + rootPath + " --feature disable_versioning=true backend delete --all" )
@@ -214,6 +214,36 @@ func TestAwsBootstrapBackendWithoutVersioning(t *testing.T) {
214
214
require .NoError (t , err )
215
215
}
216
216
217
+ func TestAwsBootstrapBackendWithAccessLogging (t * testing.T ) {
218
+ t .Parallel ()
219
+
220
+ helpers .CleanupTerraformFolder (t , testFixtureS3Backend )
221
+ tmpEnvPath := helpers .CopyEnvironment (t , testFixtureS3Backend )
222
+ rootPath := util .JoinPath (tmpEnvPath , testFixtureS3Backend )
223
+
224
+ testID := strings .ToLower (helpers .UniqueID ())
225
+
226
+ s3BucketName := "terragrunt-test-bucket-" + testID
227
+ s3AccessLogsBucketName := "terragrunt-test-bucket-" + testID + "-access-logs"
228
+ dynamoDBName := "terragrunt-test-dynamodb-" + testID
229
+
230
+ defer func () {
231
+ deleteS3Bucket (t , s3BucketName , helpers .TerraformRemoteStateS3Region )
232
+ deleteS3Bucket (t , s3AccessLogsBucketName , helpers .TerraformRemoteStateS3Region )
233
+ cleanupTableForTest (t , dynamoDBName , helpers .TerraformRemoteStateS3Region )
234
+ }()
235
+
236
+ commonConfigPath := util .JoinPath (rootPath , "common.hcl" )
237
+ helpers .CopyTerragruntConfigAndFillPlaceholders (t , commonConfigPath , commonConfigPath , s3BucketName , dynamoDBName , helpers .TerraformRemoteStateS3Region )
238
+
239
+ _ , _ , err := helpers .RunTerragruntCommandWithOutput (t , "terragrunt run --all --non-interactive --log-level debug --strict-control require-explicit-bootstrap --working-dir " + rootPath + " --feature access_logging_bucket=" + s3AccessLogsBucketName + " --backend-bootstrap apply" )
240
+ require .NoError (t , err )
241
+
242
+ validateS3BucketExistsAndIsTaggedAndVersioning (t , helpers .TerraformRemoteStateS3Region , s3BucketName , true , nil )
243
+ validateS3BucketExistsAndIsTaggedAndVersioning (t , helpers .TerraformRemoteStateS3Region , s3AccessLogsBucketName , true , nil )
244
+ validateDynamoDBTableExistsAndIsTaggedAndIsSSEncrypted (t , helpers .TerraformRemoteStateS3Region , dynamoDBName , nil , false )
245
+ }
246
+
217
247
func TestAwsMigrateBackendWithoutVersioning (t * testing.T ) {
218
248
t .Parallel ()
219
249
@@ -238,7 +268,7 @@ func TestAwsMigrateBackendWithoutVersioning(t *testing.T) {
238
268
_ , _ , err := helpers .RunTerragruntCommandWithOutput (t , "terragrunt run --non-interactive --log-level debug --strict-control require-explicit-bootstrap --working-dir " + unitPath + " --feature disable_versioning=true --backend-bootstrap apply -- -auto-approve" )
239
269
require .NoError (t , err )
240
270
241
- validateS3BucketExistsAndIsTagged (t , helpers .TerraformRemoteStateS3Region , s3BucketName , nil )
271
+ validateS3BucketExistsAndIsTaggedAndVersioning (t , helpers .TerraformRemoteStateS3Region , s3BucketName , false , nil )
242
272
validateDynamoDBTableExistsAndIsTaggedAndIsSSEncrypted (t , helpers .TerraformRemoteStateS3Region , dynamoDBName , nil , false )
243
273
244
274
_ , _ , err = helpers .RunTerragruntCommandWithOutput (t , "terragrunt --non-interactive --log-level debug --working-dir " + rootPath + " --feature disable_versioning=true backend migrate unit1 unit2" )
@@ -471,7 +501,7 @@ func TestAwsWorksWithLocalTerraformVersion(t *testing.T) {
471
501
var expectedS3Tags = map [string ]string {
472
502
"owner" : "terragrunt integration test" ,
473
503
"name" : "Terraform state storage" }
474
- validateS3BucketExistsAndIsTagged (t , helpers .TerraformRemoteStateS3Region , s3BucketName , expectedS3Tags )
504
+ validateS3BucketExistsAndIsTaggedAndVersioning (t , helpers .TerraformRemoteStateS3Region , s3BucketName , true , expectedS3Tags )
475
505
476
506
var expectedDynamoDBTableTags = map [string ]string {
477
507
"owner" : "terragrunt integration test" ,
@@ -1590,6 +1620,21 @@ func assertS3Tags(t *testing.T, expectedTags map[string]string, bucketName strin
1590
1620
assert .Equal (t , expectedTags , actualTags , "Did not find expected tags on s3 bucket." )
1591
1621
}
1592
1622
1623
+ func assertS3BucketVersioning (t * testing.T , bucketName string , versioning bool , client * s3.S3 ) {
1624
+ t .Helper ()
1625
+
1626
+ res , err := client .GetBucketVersioning (& s3.GetBucketVersioningInput {Bucket : aws .String (bucketName )})
1627
+ require .NoError (t , err )
1628
+ require .NotNil (t , res )
1629
+
1630
+ if versioning {
1631
+ require .NotNil (t , res .Status )
1632
+ assert .Equal (t , * res .Status , s3 .BucketVersioningStatusEnabled , "Versioning is not enabled for the remote state S3 bucket %s" , bucketName )
1633
+ } else {
1634
+ require .Nil (t , res .Status )
1635
+ }
1636
+ }
1637
+
1593
1638
// Check that the DynamoDB table of the given name and region exists. Terragrunt should create this table during the test.
1594
1639
// Also check if table got tagged properly
1595
1640
func validateDynamoDBTableExistsAndIsTaggedAndIsSSEncrypted (t * testing.T , awsRegion string , tableName string , expectedTags map [string ]string , expectedSSEncrypted bool ) {
@@ -1651,7 +1696,7 @@ func doesDynamoDBTableItemExist(t *testing.T, awsRegion string, tableName, key s
1651
1696
1652
1697
// Check that the S3 Bucket of the given name and region exists. Terragrunt should create this bucket during the test.
1653
1698
// Also check if bucket got tagged properly and that public access is disabled completely.
1654
- func validateS3BucketExistsAndIsTagged (t * testing.T , awsRegion string , bucketName string , expectedTags map [string ]string ) {
1699
+ func validateS3BucketExistsAndIsTaggedAndVersioning (t * testing.T , awsRegion string , bucketName string , versioning bool , expectedTags map [string ]string ) {
1655
1700
t .Helper ()
1656
1701
1657
1702
client := helpers .CreateS3ClientForTest (t , awsRegion )
@@ -1663,6 +1708,8 @@ func validateS3BucketExistsAndIsTagged(t *testing.T, awsRegion string, bucketNam
1663
1708
assertS3Tags (t , expectedTags , bucketName , client )
1664
1709
}
1665
1710
1711
+ assertS3BucketVersioning (t , bucketName , versioning , client )
1712
+
1666
1713
assertS3PublicAccessBlocks (t , client , bucketName )
1667
1714
}
1668
1715
0 commit comments