Skip to content

Commit 5b99325

Browse files
authored
Merge pull request #34671 from hashicorp/b-vault-backup-iam
r/backup_vault_policy: add iam retry for eventual consistency
2 parents e7edd96 + cbf8d04 commit 5b99325

File tree

4 files changed

+96
-2
lines changed

4 files changed

+96
-2
lines changed

internal/service/backup/consts.go

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33

44
package backup
55

6+
import "time"
7+
8+
const (
9+
iamPropagationTimeout = 2 * time.Minute
10+
)
11+
612
const (
713
frameworkStatusCompleted = "COMPLETED"
814
frameworkStatusCreationInProgress = "CREATE_IN_PROGRESS"

internal/service/backup/errors.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
package backup
55

66
const (
7-
errCodeAccessDeniedException = "AccessDeniedException"
7+
errCodeAccessDeniedException = "AccessDeniedException"
8+
errCodeInvalidParameterValueException = "InvalidParameterValueException"
89
)

internal/service/backup/vault_policy.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,12 @@ func resourceVaultPolicyPut(ctx context.Context, d *schema.ResourceData, meta in
7272
Policy: aws.String(policy),
7373
}
7474

75-
_, err = conn.PutBackupVaultAccessPolicyWithContext(ctx, input)
75+
_, err = tfresource.RetryWhenAWSErrMessageContains(ctx, iamPropagationTimeout,
76+
func() (interface{}, error) {
77+
return conn.PutBackupVaultAccessPolicyWithContext(ctx, input)
78+
},
79+
errCodeInvalidParameterValueException, "Provided principal is not valid",
80+
)
7681

7782
if err != nil {
7883
return sdkdiag.AppendErrorf(diags, "creating Backup Vault Policy (%s): %s", name, err)

internal/service/backup/vault_policy_test.go

+82
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,28 @@ func TestAccBackupVaultPolicy_basic(t *testing.T) {
5454
})
5555
}
5656

57+
func TestAccBackupVaultPolicy_eventualConsistency(t *testing.T) {
58+
ctx := acctest.Context(t)
59+
var vault backup.GetBackupVaultAccessPolicyOutput
60+
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
61+
resourceName := "aws_backup_vault_policy.test"
62+
63+
resource.ParallelTest(t, resource.TestCase{
64+
PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) },
65+
ErrorCheck: acctest.ErrorCheck(t, backup.EndpointsID),
66+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
67+
CheckDestroy: testAccCheckVaultPolicyDestroy(ctx),
68+
Steps: []resource.TestStep{
69+
{
70+
Config: testAccVaultPolicyConfig_eventualConsistency(rName),
71+
Check: resource.ComposeTestCheckFunc(
72+
testAccCheckVaultPolicyExists(ctx, resourceName, &vault),
73+
resource.TestMatchResourceAttr(resourceName, "policy", regexache.MustCompile("^{\"Id\":\"default\".+"))),
74+
},
75+
},
76+
})
77+
}
78+
5779
func TestAccBackupVaultPolicy_disappears(t *testing.T) {
5880
ctx := acctest.Context(t)
5981
var vault backup.GetBackupVaultAccessPolicyOutput
@@ -285,3 +307,63 @@ resource "aws_backup_vault_policy" "test" {
285307
}
286308
`, rName)
287309
}
310+
311+
func testAccVaultPolicyConfig_eventualConsistency(rName string) string {
312+
return acctest.ConfigCompose(
313+
fmt.Sprintf(`
314+
data "aws_partition" "current" {}
315+
316+
resource "aws_iam_role" "test" {
317+
name = %[1]q
318+
assume_role_policy = jsonencode({
319+
Version = "2012-10-17"
320+
Statement = [
321+
{
322+
Action = "sts:AssumeRole"
323+
Effect = "Allow"
324+
Sid = ""
325+
Principal = {
326+
Service = "backup.amazonaws.com"
327+
}
328+
},
329+
]
330+
})
331+
}
332+
333+
resource "aws_iam_role_policy_attachment" "test" {
334+
role = aws_iam_role.test.name
335+
policy_arn = "arn:${data.aws_partition.current.partition}:iam::${data.aws_partition.current.partition}:policy/service-role/AWSBackupServiceRolePolicyForBackup"
336+
}
337+
338+
resource "aws_backup_vault" "test" {
339+
name = %[1]q
340+
}
341+
342+
resource "aws_backup_vault_policy" "test" {
343+
backup_vault_name = aws_backup_vault.test.name
344+
345+
policy = jsonencode({
346+
Version = "2012-10-17"
347+
Id = "default"
348+
Statement = [{
349+
Sid = "default"
350+
Effect = "Allow"
351+
Principal = {
352+
AWS = "${aws_iam_role.test.arn}"
353+
}
354+
Action = [
355+
"backup:DescribeBackupVault",
356+
"backup:DeleteBackupVault",
357+
"backup:PutBackupVaultAccessPolicy",
358+
"backup:DeleteBackupVaultAccessPolicy",
359+
"backup:GetBackupVaultAccessPolicy",
360+
"backup:StartBackupJob",
361+
"backup:GetBackupVaultNotifications",
362+
"backup:PutBackupVaultNotifications",
363+
]
364+
Resource = aws_backup_vault.test.arn
365+
}]
366+
})
367+
}
368+
`, rName))
369+
}

0 commit comments

Comments
 (0)