github.com/ojiry/terraform@v0.8.2-0.20161218223921-e50cec712c4a/builtin/providers/aws/resource_aws_s3_bucket_test.go (about) 1 package aws 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "reflect" 7 "regexp" 8 "strconv" 9 "testing" 10 11 "github.com/hashicorp/terraform/helper/acctest" 12 "github.com/hashicorp/terraform/helper/resource" 13 "github.com/hashicorp/terraform/terraform" 14 15 "github.com/aws/aws-sdk-go/aws" 16 "github.com/aws/aws-sdk-go/aws/awserr" 17 "github.com/aws/aws-sdk-go/service/s3" 18 "github.com/hashicorp/terraform/helper/schema" 19 ) 20 21 func TestAccAWSS3Bucket_basic(t *testing.T) { 22 rInt := acctest.RandInt() 23 arnRegexp := regexp.MustCompile( 24 "^arn:aws:s3:::") 25 26 resource.Test(t, resource.TestCase{ 27 PreCheck: func() { testAccPreCheck(t) }, 28 /* 29 IDRefreshName: "aws_s3_bucket.bucket", 30 IDRefreshIgnore: []string{"force_destroy"}, 31 */ 32 Providers: testAccProviders, 33 CheckDestroy: testAccCheckAWSS3BucketDestroy, 34 Steps: []resource.TestStep{ 35 { 36 Config: testAccAWSS3BucketConfig(rInt), 37 Check: resource.ComposeTestCheckFunc( 38 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 39 resource.TestCheckResourceAttr( 40 "aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")), 41 resource.TestCheckResourceAttr( 42 "aws_s3_bucket.bucket", "region", "us-west-2"), 43 resource.TestCheckResourceAttr( 44 "aws_s3_bucket.bucket", "website_endpoint", ""), 45 resource.TestMatchResourceAttr( 46 "aws_s3_bucket.bucket", "arn", arnRegexp), 47 ), 48 }, 49 }, 50 }) 51 } 52 53 func TestAccAWSS3Bucket_region(t *testing.T) { 54 rInt := acctest.RandInt() 55 56 resource.Test(t, resource.TestCase{ 57 PreCheck: func() { testAccPreCheck(t) }, 58 Providers: testAccProviders, 59 CheckDestroy: testAccCheckAWSS3BucketDestroy, 60 Steps: []resource.TestStep{ 61 { 62 Config: testAccAWSS3BucketConfigWithRegion(rInt), 63 Check: resource.ComposeTestCheckFunc( 64 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 65 resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "region", "eu-west-1"), 66 ), 67 }, 68 }, 69 }) 70 } 71 72 func TestAccAWSS3Bucket_acceleration(t *testing.T) { 73 rInt := acctest.RandInt() 74 75 resource.Test(t, resource.TestCase{ 76 PreCheck: func() { testAccPreCheck(t) }, 77 Providers: testAccProviders, 78 CheckDestroy: testAccCheckAWSS3BucketDestroy, 79 Steps: []resource.TestStep{ 80 { 81 Config: testAccAWSS3BucketConfigWithAcceleration(rInt), 82 Check: resource.ComposeTestCheckFunc( 83 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 84 resource.TestCheckResourceAttr( 85 "aws_s3_bucket.bucket", "acceleration_status", "Enabled"), 86 ), 87 }, 88 { 89 Config: testAccAWSS3BucketConfigWithoutAcceleration(rInt), 90 Check: resource.ComposeTestCheckFunc( 91 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 92 resource.TestCheckResourceAttr( 93 "aws_s3_bucket.bucket", "acceleration_status", "Suspended"), 94 ), 95 }, 96 }, 97 }) 98 } 99 100 func TestAccAWSS3Bucket_RequestPayer(t *testing.T) { 101 rInt := acctest.RandInt() 102 103 resource.Test(t, resource.TestCase{ 104 PreCheck: func() { testAccPreCheck(t) }, 105 Providers: testAccProviders, 106 CheckDestroy: testAccCheckAWSS3BucketDestroy, 107 Steps: []resource.TestStep{ 108 { 109 Config: testAccAWSS3BucketConfigRequestPayerBucketOwner(rInt), 110 Check: resource.ComposeTestCheckFunc( 111 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 112 resource.TestCheckResourceAttr( 113 "aws_s3_bucket.bucket", 114 "request_payer", 115 "BucketOwner"), 116 testAccCheckAWSS3RequestPayer( 117 "aws_s3_bucket.bucket", 118 "BucketOwner"), 119 ), 120 }, 121 { 122 Config: testAccAWSS3BucketConfigRequestPayerRequester(rInt), 123 Check: resource.ComposeTestCheckFunc( 124 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 125 resource.TestCheckResourceAttr( 126 "aws_s3_bucket.bucket", 127 "request_payer", 128 "Requester"), 129 testAccCheckAWSS3RequestPayer( 130 "aws_s3_bucket.bucket", 131 "Requester"), 132 ), 133 }, 134 }, 135 }) 136 } 137 138 func TestResourceAWSS3BucketRequestPayer_validation(t *testing.T) { 139 _, errors := validateS3BucketRequestPayerType("incorrect", "request_payer") 140 if len(errors) == 0 { 141 t.Fatalf("Expected to trigger a validation error") 142 } 143 144 var testCases = []struct { 145 Value string 146 ErrCount int 147 }{ 148 { 149 Value: "Requester", 150 ErrCount: 0, 151 }, 152 { 153 Value: "BucketOwner", 154 ErrCount: 0, 155 }, 156 } 157 158 for _, tc := range testCases { 159 _, errors := validateS3BucketRequestPayerType(tc.Value, "request_payer") 160 if len(errors) != tc.ErrCount { 161 t.Fatalf("Expected not to trigger a validation error") 162 } 163 } 164 } 165 166 func TestAccAWSS3Bucket_Policy(t *testing.T) { 167 rInt := acctest.RandInt() 168 169 resource.Test(t, resource.TestCase{ 170 PreCheck: func() { testAccPreCheck(t) }, 171 Providers: testAccProviders, 172 CheckDestroy: testAccCheckAWSS3BucketDestroy, 173 Steps: []resource.TestStep{ 174 { 175 Config: testAccAWSS3BucketConfigWithPolicy(rInt), 176 Check: resource.ComposeTestCheckFunc( 177 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 178 testAccCheckAWSS3BucketPolicy( 179 "aws_s3_bucket.bucket", testAccAWSS3BucketPolicy(rInt)), 180 ), 181 }, 182 { 183 Config: testAccAWSS3BucketConfig(rInt), 184 Check: resource.ComposeTestCheckFunc( 185 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 186 testAccCheckAWSS3BucketPolicy( 187 "aws_s3_bucket.bucket", ""), 188 ), 189 }, 190 { 191 Config: testAccAWSS3BucketConfigWithEmptyPolicy(rInt), 192 Check: resource.ComposeTestCheckFunc( 193 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 194 testAccCheckAWSS3BucketPolicy( 195 "aws_s3_bucket.bucket", ""), 196 ), 197 }, 198 }, 199 }) 200 } 201 202 func TestAccAWSS3Bucket_UpdateAcl(t *testing.T) { 203 ri := acctest.RandInt() 204 preConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAcl, ri) 205 postConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAclUpdate, ri) 206 207 resource.Test(t, resource.TestCase{ 208 PreCheck: func() { testAccPreCheck(t) }, 209 Providers: testAccProviders, 210 CheckDestroy: testAccCheckAWSS3BucketDestroy, 211 Steps: []resource.TestStep{ 212 { 213 Config: preConfig, 214 Check: resource.ComposeTestCheckFunc( 215 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 216 resource.TestCheckResourceAttr( 217 "aws_s3_bucket.bucket", "acl", "public-read"), 218 ), 219 }, 220 { 221 Config: postConfig, 222 Check: resource.ComposeTestCheckFunc( 223 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 224 resource.TestCheckResourceAttr( 225 "aws_s3_bucket.bucket", "acl", "private"), 226 ), 227 }, 228 }, 229 }) 230 } 231 232 func TestAccAWSS3Bucket_Website_Simple(t *testing.T) { 233 rInt := acctest.RandInt() 234 resource.Test(t, resource.TestCase{ 235 PreCheck: func() { testAccPreCheck(t) }, 236 Providers: testAccProviders, 237 CheckDestroy: testAccCheckAWSS3BucketDestroy, 238 Steps: []resource.TestStep{ 239 { 240 Config: testAccAWSS3BucketWebsiteConfig(rInt), 241 Check: resource.ComposeTestCheckFunc( 242 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 243 testAccCheckAWSS3BucketWebsite( 244 "aws_s3_bucket.bucket", "index.html", "", "", ""), 245 resource.TestCheckResourceAttr( 246 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 247 ), 248 }, 249 { 250 Config: testAccAWSS3BucketWebsiteConfigWithError(rInt), 251 Check: resource.ComposeTestCheckFunc( 252 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 253 testAccCheckAWSS3BucketWebsite( 254 "aws_s3_bucket.bucket", "index.html", "error.html", "", ""), 255 resource.TestCheckResourceAttr( 256 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 257 ), 258 }, 259 { 260 Config: testAccAWSS3BucketConfig(rInt), 261 Check: resource.ComposeTestCheckFunc( 262 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 263 testAccCheckAWSS3BucketWebsite( 264 "aws_s3_bucket.bucket", "", "", "", ""), 265 resource.TestCheckResourceAttr( 266 "aws_s3_bucket.bucket", "website_endpoint", ""), 267 ), 268 }, 269 }, 270 }) 271 } 272 273 func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) { 274 rInt := acctest.RandInt() 275 resource.Test(t, resource.TestCase{ 276 PreCheck: func() { testAccPreCheck(t) }, 277 Providers: testAccProviders, 278 CheckDestroy: testAccCheckAWSS3BucketDestroy, 279 Steps: []resource.TestStep{ 280 { 281 Config: testAccAWSS3BucketWebsiteConfigWithRedirect(rInt), 282 Check: resource.ComposeTestCheckFunc( 283 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 284 testAccCheckAWSS3BucketWebsite( 285 "aws_s3_bucket.bucket", "", "", "", "hashicorp.com"), 286 resource.TestCheckResourceAttr( 287 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 288 ), 289 }, 290 { 291 Config: testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(rInt), 292 Check: resource.ComposeTestCheckFunc( 293 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 294 testAccCheckAWSS3BucketWebsite( 295 "aws_s3_bucket.bucket", "", "", "https", "hashicorp.com"), 296 resource.TestCheckResourceAttr( 297 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 298 ), 299 }, 300 { 301 Config: testAccAWSS3BucketConfig(rInt), 302 Check: resource.ComposeTestCheckFunc( 303 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 304 testAccCheckAWSS3BucketWebsite( 305 "aws_s3_bucket.bucket", "", "", "", ""), 306 resource.TestCheckResourceAttr( 307 "aws_s3_bucket.bucket", "website_endpoint", ""), 308 ), 309 }, 310 }, 311 }) 312 } 313 314 func TestAccAWSS3Bucket_WebsiteRoutingRules(t *testing.T) { 315 rInt := acctest.RandInt() 316 resource.Test(t, resource.TestCase{ 317 PreCheck: func() { testAccPreCheck(t) }, 318 Providers: testAccProviders, 319 CheckDestroy: testAccCheckAWSS3BucketDestroy, 320 Steps: []resource.TestStep{ 321 { 322 Config: testAccAWSS3BucketWebsiteConfigWithRoutingRules(rInt), 323 Check: resource.ComposeTestCheckFunc( 324 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 325 testAccCheckAWSS3BucketWebsite( 326 "aws_s3_bucket.bucket", "index.html", "error.html", "", ""), 327 testAccCheckAWSS3BucketWebsiteRoutingRules( 328 "aws_s3_bucket.bucket", 329 []*s3.RoutingRule{ 330 { 331 Condition: &s3.Condition{ 332 KeyPrefixEquals: aws.String("docs/"), 333 }, 334 Redirect: &s3.Redirect{ 335 ReplaceKeyPrefixWith: aws.String("documents/"), 336 }, 337 }, 338 }, 339 ), 340 resource.TestCheckResourceAttr( 341 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 342 ), 343 }, 344 { 345 Config: testAccAWSS3BucketConfig(rInt), 346 Check: resource.ComposeTestCheckFunc( 347 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 348 testAccCheckAWSS3BucketWebsite( 349 "aws_s3_bucket.bucket", "", "", "", ""), 350 testAccCheckAWSS3BucketWebsiteRoutingRules("aws_s3_bucket.bucket", nil), 351 resource.TestCheckResourceAttr( 352 "aws_s3_bucket.bucket", "website_endpoint", ""), 353 ), 354 }, 355 }, 356 }) 357 } 358 359 // Test TestAccAWSS3Bucket_shouldFailNotFound is designed to fail with a "plan 360 // not empty" error in Terraform, to check against regresssions. 361 // See https://github.com/hashicorp/terraform/pull/2925 362 func TestAccAWSS3Bucket_shouldFailNotFound(t *testing.T) { 363 rInt := acctest.RandInt() 364 resource.Test(t, resource.TestCase{ 365 PreCheck: func() { testAccPreCheck(t) }, 366 Providers: testAccProviders, 367 CheckDestroy: testAccCheckAWSS3BucketDestroy, 368 Steps: []resource.TestStep{ 369 { 370 Config: testAccAWSS3BucketDestroyedConfig(rInt), 371 Check: resource.ComposeTestCheckFunc( 372 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 373 testAccCheckAWSS3DestroyBucket("aws_s3_bucket.bucket"), 374 ), 375 ExpectNonEmptyPlan: true, 376 }, 377 }, 378 }) 379 } 380 381 func TestAccAWSS3Bucket_Versioning(t *testing.T) { 382 rInt := acctest.RandInt() 383 resource.Test(t, resource.TestCase{ 384 PreCheck: func() { testAccPreCheck(t) }, 385 Providers: testAccProviders, 386 CheckDestroy: testAccCheckAWSS3BucketDestroy, 387 Steps: []resource.TestStep{ 388 { 389 Config: testAccAWSS3BucketConfig(rInt), 390 Check: resource.ComposeTestCheckFunc( 391 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 392 testAccCheckAWSS3BucketVersioning( 393 "aws_s3_bucket.bucket", ""), 394 ), 395 }, 396 { 397 Config: testAccAWSS3BucketConfigWithVersioning(rInt), 398 Check: resource.ComposeTestCheckFunc( 399 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 400 testAccCheckAWSS3BucketVersioning( 401 "aws_s3_bucket.bucket", s3.BucketVersioningStatusEnabled), 402 ), 403 }, 404 { 405 Config: testAccAWSS3BucketConfigWithDisableVersioning(rInt), 406 Check: resource.ComposeTestCheckFunc( 407 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 408 testAccCheckAWSS3BucketVersioning( 409 "aws_s3_bucket.bucket", s3.BucketVersioningStatusSuspended), 410 ), 411 }, 412 }, 413 }) 414 } 415 416 func TestAccAWSS3Bucket_Cors(t *testing.T) { 417 rInt := acctest.RandInt() 418 419 updateBucketCors := func(n string) resource.TestCheckFunc { 420 return func(s *terraform.State) error { 421 rs, ok := s.RootModule().Resources[n] 422 if !ok { 423 return fmt.Errorf("Not found: %s", n) 424 } 425 426 conn := testAccProvider.Meta().(*AWSClient).s3conn 427 _, err := conn.PutBucketCors(&s3.PutBucketCorsInput{ 428 Bucket: aws.String(rs.Primary.ID), 429 CORSConfiguration: &s3.CORSConfiguration{ 430 CORSRules: []*s3.CORSRule{ 431 { 432 AllowedHeaders: []*string{aws.String("*")}, 433 AllowedMethods: []*string{aws.String("GET")}, 434 AllowedOrigins: []*string{aws.String("https://www.example.com")}, 435 }, 436 }, 437 }, 438 }) 439 if err != nil { 440 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() != "NoSuchCORSConfiguration" { 441 return err 442 } 443 } 444 return nil 445 } 446 } 447 448 resource.Test(t, resource.TestCase{ 449 PreCheck: func() { testAccPreCheck(t) }, 450 Providers: testAccProviders, 451 CheckDestroy: testAccCheckAWSS3BucketDestroy, 452 Steps: []resource.TestStep{ 453 { 454 Config: testAccAWSS3BucketConfigWithCORS(rInt), 455 Check: resource.ComposeTestCheckFunc( 456 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 457 testAccCheckAWSS3BucketCors( 458 "aws_s3_bucket.bucket", 459 []*s3.CORSRule{ 460 { 461 AllowedHeaders: []*string{aws.String("*")}, 462 AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")}, 463 AllowedOrigins: []*string{aws.String("https://www.example.com")}, 464 ExposeHeaders: []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")}, 465 MaxAgeSeconds: aws.Int64(3000), 466 }, 467 }, 468 ), 469 updateBucketCors("aws_s3_bucket.bucket"), 470 ), 471 ExpectNonEmptyPlan: true, 472 }, 473 { 474 Config: testAccAWSS3BucketConfigWithCORS(rInt), 475 Check: resource.ComposeTestCheckFunc( 476 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 477 testAccCheckAWSS3BucketCors( 478 "aws_s3_bucket.bucket", 479 []*s3.CORSRule{ 480 { 481 AllowedHeaders: []*string{aws.String("*")}, 482 AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")}, 483 AllowedOrigins: []*string{aws.String("https://www.example.com")}, 484 ExposeHeaders: []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")}, 485 MaxAgeSeconds: aws.Int64(3000), 486 }, 487 }, 488 ), 489 ), 490 }, 491 }, 492 }) 493 } 494 495 func TestAccAWSS3Bucket_Logging(t *testing.T) { 496 rInt := acctest.RandInt() 497 resource.Test(t, resource.TestCase{ 498 PreCheck: func() { testAccPreCheck(t) }, 499 Providers: testAccProviders, 500 CheckDestroy: testAccCheckAWSS3BucketDestroy, 501 Steps: []resource.TestStep{ 502 { 503 Config: testAccAWSS3BucketConfigWithLogging(rInt), 504 Check: resource.ComposeTestCheckFunc( 505 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 506 testAccCheckAWSS3BucketLogging( 507 "aws_s3_bucket.bucket", "aws_s3_bucket.log_bucket", "log/"), 508 ), 509 }, 510 }, 511 }) 512 } 513 514 func TestAccAWSS3Bucket_Lifecycle(t *testing.T) { 515 rInt := acctest.RandInt() 516 resource.Test(t, resource.TestCase{ 517 PreCheck: func() { testAccPreCheck(t) }, 518 Providers: testAccProviders, 519 CheckDestroy: testAccCheckAWSS3BucketDestroy, 520 Steps: []resource.TestStep{ 521 { 522 Config: testAccAWSS3BucketConfigWithLifecycle(rInt), 523 Check: resource.ComposeTestCheckFunc( 524 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 525 resource.TestCheckResourceAttr( 526 "aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"), 527 resource.TestCheckResourceAttr( 528 "aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"), 529 resource.TestCheckResourceAttr( 530 "aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.days", "365"), 531 resource.TestCheckResourceAttr( 532 "aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.date", ""), 533 resource.TestCheckResourceAttr( 534 "aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.expired_object_delete_marker", "false"), 535 resource.TestCheckResourceAttr( 536 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.date", ""), 537 resource.TestCheckResourceAttr( 538 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.days", "30"), 539 resource.TestCheckResourceAttr( 540 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.storage_class", "STANDARD_IA"), 541 resource.TestCheckResourceAttr( 542 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.date", ""), 543 resource.TestCheckResourceAttr( 544 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.days", "60"), 545 resource.TestCheckResourceAttr( 546 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.storage_class", "GLACIER"), 547 resource.TestCheckResourceAttr( 548 "aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"), 549 resource.TestCheckResourceAttr( 550 "aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"), 551 resource.TestCheckResourceAttr( 552 "aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.date", "2016-01-12"), 553 resource.TestCheckResourceAttr( 554 "aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.days", "0"), 555 resource.TestCheckResourceAttr( 556 "aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.expired_object_delete_marker", "false"), 557 ), 558 }, 559 { 560 Config: testAccAWSS3BucketConfigWithVersioningLifecycle(rInt), 561 Check: resource.ComposeTestCheckFunc( 562 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 563 resource.TestCheckResourceAttr( 564 "aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"), 565 resource.TestCheckResourceAttr( 566 "aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"), 567 resource.TestCheckResourceAttr( 568 "aws_s3_bucket.bucket", "lifecycle_rule.0.enabled", "true"), 569 resource.TestCheckResourceAttr( 570 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_expiration.80908210.days", "365"), 571 resource.TestCheckResourceAttr( 572 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.days", "30"), 573 resource.TestCheckResourceAttr( 574 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.storage_class", "STANDARD_IA"), 575 resource.TestCheckResourceAttr( 576 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.days", "60"), 577 resource.TestCheckResourceAttr( 578 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.storage_class", "GLACIER"), 579 resource.TestCheckResourceAttr( 580 "aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"), 581 resource.TestCheckResourceAttr( 582 "aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"), 583 resource.TestCheckResourceAttr( 584 "aws_s3_bucket.bucket", "lifecycle_rule.1.enabled", "false"), 585 resource.TestCheckResourceAttr( 586 "aws_s3_bucket.bucket", "lifecycle_rule.1.noncurrent_version_expiration.80908210.days", "365"), 587 ), 588 }, 589 { 590 Config: testAccAWSS3BucketConfig(rInt), 591 Check: resource.ComposeTestCheckFunc( 592 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 593 ), 594 }, 595 }, 596 }) 597 } 598 599 func TestAccAWSS3Bucket_Replication(t *testing.T) { 600 rInt := acctest.RandInt() 601 602 // record the initialized providers so that we can use them to check for the instances in each region 603 var providers []*schema.Provider 604 providerFactories := map[string]terraform.ResourceProviderFactory{ 605 "aws": func() (terraform.ResourceProvider, error) { 606 p := Provider() 607 providers = append(providers, p.(*schema.Provider)) 608 return p, nil 609 }, 610 } 611 612 resource.Test(t, resource.TestCase{ 613 PreCheck: func() { testAccPreCheck(t) }, 614 ProviderFactories: providerFactories, 615 CheckDestroy: testAccCheckAWSS3BucketDestroyWithProviders(&providers), 616 Steps: []resource.TestStep{ 617 { 618 Config: testAccAWSS3BucketConfigReplication(rInt), 619 Check: resource.ComposeTestCheckFunc( 620 testAccCheckAWSS3BucketExistsWithProviders("aws_s3_bucket.bucket", &providers), 621 ), 622 }, 623 { 624 Config: testAccAWSS3BucketConfigReplicationWithConfiguration(rInt), 625 Check: resource.ComposeTestCheckFunc( 626 testAccCheckAWSS3BucketExistsWithProviders("aws_s3_bucket.bucket", &providers), 627 resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.#", "1"), 628 resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.0.rules.#", "1"), 629 resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.0.rules.2229345141.id", "foobar"), 630 resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.0.rules.2229345141.prefix", "foo"), 631 resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.0.rules.2229345141.status", s3.ReplicationRuleStatusEnabled), 632 ), 633 }, 634 }, 635 }) 636 } 637 638 func TestAccAWSS3Bucket_ReplicationExpectVersioningValidationError(t *testing.T) { 639 rInt := acctest.RandInt() 640 641 // record the initialized providers so that we can use them to check for the instances in each region 642 var providers []*schema.Provider 643 providerFactories := map[string]terraform.ResourceProviderFactory{ 644 "aws": func() (terraform.ResourceProvider, error) { 645 p := Provider() 646 providers = append(providers, p.(*schema.Provider)) 647 return p, nil 648 }, 649 } 650 651 resource.Test(t, resource.TestCase{ 652 PreCheck: func() { testAccPreCheck(t) }, 653 ProviderFactories: providerFactories, 654 CheckDestroy: testAccCheckAWSS3BucketDestroyWithProviders(&providers), 655 Steps: []resource.TestStep{ 656 { 657 Config: testAccAWSS3BucketConfigReplicationNoVersioning(rInt), 658 ExpectError: regexp.MustCompile(`versioning must be enabled to allow S3 bucket replication`), 659 }, 660 }, 661 }) 662 } 663 664 func testAccCheckAWSS3BucketDestroy(s *terraform.State) error { 665 return testAccCheckInstanceDestroyWithProvider(s, testAccProvider) 666 } 667 668 func testAccCheckAWSS3BucketDestroyWithProviders(providers *[]*schema.Provider) resource.TestCheckFunc { 669 return func(s *terraform.State) error { 670 for _, provider := range *providers { 671 if provider.Meta() == nil { 672 continue 673 } 674 if err := testAccCheckAWSS3BucketDestroyWithProvider(s, provider); err != nil { 675 return err 676 } 677 } 678 return nil 679 } 680 } 681 682 func testAccCheckAWSS3BucketDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { 683 conn := provider.Meta().(*AWSClient).s3conn 684 685 for _, rs := range s.RootModule().Resources { 686 if rs.Type != "aws_s3_bucket" { 687 continue 688 } 689 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 690 Bucket: aws.String(rs.Primary.ID), 691 }) 692 if err != nil { 693 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucket" { 694 return nil 695 } 696 return err 697 } 698 } 699 return nil 700 } 701 702 func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc { 703 providers := []*schema.Provider{testAccProvider} 704 return testAccCheckAWSS3BucketExistsWithProviders(n, &providers) 705 } 706 707 func testAccCheckAWSS3BucketExistsWithProviders(n string, providers *[]*schema.Provider) resource.TestCheckFunc { 708 return func(s *terraform.State) error { 709 rs, ok := s.RootModule().Resources[n] 710 if !ok { 711 return fmt.Errorf("Not found: %s", n) 712 } 713 714 if rs.Primary.ID == "" { 715 return fmt.Errorf("No ID is set") 716 } 717 for _, provider := range *providers { 718 // Ignore if Meta is empty, this can happen for validation providers 719 if provider.Meta() == nil { 720 continue 721 } 722 723 conn := provider.Meta().(*AWSClient).s3conn 724 _, err := conn.HeadBucket(&s3.HeadBucketInput{ 725 Bucket: aws.String(rs.Primary.ID), 726 }) 727 728 if err != nil { 729 return fmt.Errorf("S3Bucket error: %v", err) 730 } 731 return nil 732 } 733 734 return fmt.Errorf("Instance not found") 735 } 736 } 737 738 func testAccCheckAWSS3DestroyBucket(n string) resource.TestCheckFunc { 739 return func(s *terraform.State) error { 740 rs, ok := s.RootModule().Resources[n] 741 if !ok { 742 return fmt.Errorf("Not found: %s", n) 743 } 744 745 if rs.Primary.ID == "" { 746 return fmt.Errorf("No S3 Bucket ID is set") 747 } 748 749 conn := testAccProvider.Meta().(*AWSClient).s3conn 750 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 751 Bucket: aws.String(rs.Primary.ID), 752 }) 753 754 if err != nil { 755 return fmt.Errorf("Error destroying Bucket (%s) in testAccCheckAWSS3DestroyBucket: %s", rs.Primary.ID, err) 756 } 757 return nil 758 } 759 } 760 761 func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc { 762 return func(s *terraform.State) error { 763 rs, _ := s.RootModule().Resources[n] 764 conn := testAccProvider.Meta().(*AWSClient).s3conn 765 766 out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{ 767 Bucket: aws.String(rs.Primary.ID), 768 }) 769 770 if policy == "" { 771 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucketPolicy" { 772 // expected 773 return nil 774 } 775 if err == nil { 776 return fmt.Errorf("Expected no policy, got: %#v", *out.Policy) 777 } else { 778 return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy) 779 } 780 } 781 if err != nil { 782 return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy) 783 } 784 785 if v := out.Policy; v == nil { 786 if policy != "" { 787 return fmt.Errorf("bad policy, found nil, expected: %s", policy) 788 } 789 } else { 790 expected := make(map[string]interface{}) 791 if err := json.Unmarshal([]byte(policy), &expected); err != nil { 792 return err 793 } 794 actual := make(map[string]interface{}) 795 if err := json.Unmarshal([]byte(*v), &actual); err != nil { 796 return err 797 } 798 799 if !reflect.DeepEqual(expected, actual) { 800 return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual) 801 } 802 } 803 804 return nil 805 } 806 } 807 808 func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectProtocol string, redirectTo string) resource.TestCheckFunc { 809 return func(s *terraform.State) error { 810 rs, _ := s.RootModule().Resources[n] 811 conn := testAccProvider.Meta().(*AWSClient).s3conn 812 813 out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{ 814 Bucket: aws.String(rs.Primary.ID), 815 }) 816 817 if err != nil { 818 if indexDoc == "" { 819 // If we want to assert that the website is not there, than 820 // this error is expected 821 return nil 822 } else { 823 return fmt.Errorf("S3BucketWebsite error: %v", err) 824 } 825 } 826 827 if v := out.IndexDocument; v == nil { 828 if indexDoc != "" { 829 return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc) 830 } 831 } else { 832 if *v.Suffix != indexDoc { 833 return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument) 834 } 835 } 836 837 if v := out.ErrorDocument; v == nil { 838 if errorDoc != "" { 839 return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc) 840 } 841 } else { 842 if *v.Key != errorDoc { 843 return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument) 844 } 845 } 846 847 if v := out.RedirectAllRequestsTo; v == nil { 848 if redirectTo != "" { 849 return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo) 850 } 851 } else { 852 if *v.HostName != redirectTo { 853 return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo) 854 } 855 if redirectProtocol != "" && v.Protocol != nil && *v.Protocol != redirectProtocol { 856 return fmt.Errorf("bad redirect protocol to, expected: %s, got %#v", redirectProtocol, out.RedirectAllRequestsTo) 857 } 858 } 859 860 return nil 861 } 862 } 863 864 func testAccCheckAWSS3BucketWebsiteRoutingRules(n string, routingRules []*s3.RoutingRule) resource.TestCheckFunc { 865 return func(s *terraform.State) error { 866 rs, _ := s.RootModule().Resources[n] 867 conn := testAccProvider.Meta().(*AWSClient).s3conn 868 869 out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{ 870 Bucket: aws.String(rs.Primary.ID), 871 }) 872 873 if err != nil { 874 if routingRules == nil { 875 return nil 876 } 877 return fmt.Errorf("GetBucketWebsite error: %v", err) 878 } 879 880 if !reflect.DeepEqual(out.RoutingRules, routingRules) { 881 return fmt.Errorf("bad routing rule, expected: %v, got %v", routingRules, out.RoutingRules) 882 } 883 884 return nil 885 } 886 } 887 888 func testAccCheckAWSS3BucketVersioning(n string, versioningStatus string) resource.TestCheckFunc { 889 return func(s *terraform.State) error { 890 rs, _ := s.RootModule().Resources[n] 891 conn := testAccProvider.Meta().(*AWSClient).s3conn 892 893 out, err := conn.GetBucketVersioning(&s3.GetBucketVersioningInput{ 894 Bucket: aws.String(rs.Primary.ID), 895 }) 896 897 if err != nil { 898 return fmt.Errorf("GetBucketVersioning error: %v", err) 899 } 900 901 if v := out.Status; v == nil { 902 if versioningStatus != "" { 903 return fmt.Errorf("bad error versioning status, found nil, expected: %s", versioningStatus) 904 } 905 } else { 906 if *v != versioningStatus { 907 return fmt.Errorf("bad error versioning status, expected: %s, got %s", versioningStatus, *v) 908 } 909 } 910 911 return nil 912 } 913 } 914 915 func testAccCheckAWSS3BucketCors(n string, corsRules []*s3.CORSRule) resource.TestCheckFunc { 916 return func(s *terraform.State) error { 917 rs, _ := s.RootModule().Resources[n] 918 conn := testAccProvider.Meta().(*AWSClient).s3conn 919 920 out, err := conn.GetBucketCors(&s3.GetBucketCorsInput{ 921 Bucket: aws.String(rs.Primary.ID), 922 }) 923 924 if err != nil { 925 return fmt.Errorf("GetBucketCors error: %v", err) 926 } 927 928 if !reflect.DeepEqual(out.CORSRules, corsRules) { 929 return fmt.Errorf("bad error cors rule, expected: %v, got %v", corsRules, out.CORSRules) 930 } 931 932 return nil 933 } 934 } 935 936 func testAccCheckAWSS3RequestPayer(n, expectedPayer string) resource.TestCheckFunc { 937 return func(s *terraform.State) error { 938 rs, _ := s.RootModule().Resources[n] 939 conn := testAccProvider.Meta().(*AWSClient).s3conn 940 941 out, err := conn.GetBucketRequestPayment(&s3.GetBucketRequestPaymentInput{ 942 Bucket: aws.String(rs.Primary.ID), 943 }) 944 945 if err != nil { 946 return fmt.Errorf("GetBucketRequestPayment error: %v", err) 947 } 948 949 if *out.Payer != expectedPayer { 950 return fmt.Errorf("bad error request payer type, expected: %v, got %v", 951 expectedPayer, out.Payer) 952 } 953 954 return nil 955 } 956 } 957 958 func testAccCheckAWSS3BucketLogging(n, b, p string) resource.TestCheckFunc { 959 return func(s *terraform.State) error { 960 rs, _ := s.RootModule().Resources[n] 961 conn := testAccProvider.Meta().(*AWSClient).s3conn 962 963 out, err := conn.GetBucketLogging(&s3.GetBucketLoggingInput{ 964 Bucket: aws.String(rs.Primary.ID), 965 }) 966 967 if err != nil { 968 return fmt.Errorf("GetBucketLogging error: %v", err) 969 } 970 971 tb, _ := s.RootModule().Resources[b] 972 973 if v := out.LoggingEnabled.TargetBucket; v == nil { 974 if tb.Primary.ID != "" { 975 return fmt.Errorf("bad target bucket, found nil, expected: %s", tb.Primary.ID) 976 } 977 } else { 978 if *v != tb.Primary.ID { 979 return fmt.Errorf("bad target bucket, expected: %s, got %s", tb.Primary.ID, *v) 980 } 981 } 982 983 if v := out.LoggingEnabled.TargetPrefix; v == nil { 984 if p != "" { 985 return fmt.Errorf("bad target prefix, found nil, expected: %s", p) 986 } 987 } else { 988 if *v != p { 989 return fmt.Errorf("bad target prefix, expected: %s, got %s", p, *v) 990 } 991 } 992 993 return nil 994 } 995 } 996 997 // These need a bit of randomness as the name can only be used once globally 998 // within AWS 999 func testAccWebsiteEndpoint(randInt int) string { 1000 return fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt) 1001 } 1002 1003 func testAccAWSS3BucketPolicy(randInt int) string { 1004 return fmt.Sprintf(`{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::tf-test-bucket-%d/*" } ] }`, randInt) 1005 } 1006 1007 func testAccAWSS3BucketConfig(randInt int) string { 1008 return fmt.Sprintf(` 1009 resource "aws_s3_bucket" "bucket" { 1010 bucket = "tf-test-bucket-%d" 1011 acl = "public-read" 1012 } 1013 `, randInt) 1014 } 1015 1016 func testAccAWSS3BucketConfigWithRegion(randInt int) string { 1017 return fmt.Sprintf(` 1018 provider "aws" { 1019 alias = "west" 1020 region = "eu-west-1" 1021 } 1022 1023 resource "aws_s3_bucket" "bucket" { 1024 provider = "aws.west" 1025 bucket = "tf-test-bucket-%d" 1026 region = "eu-west-1" 1027 } 1028 `, randInt) 1029 } 1030 1031 func testAccAWSS3BucketWebsiteConfig(randInt int) string { 1032 return fmt.Sprintf(` 1033 resource "aws_s3_bucket" "bucket" { 1034 bucket = "tf-test-bucket-%d" 1035 acl = "public-read" 1036 1037 website { 1038 index_document = "index.html" 1039 } 1040 } 1041 `, randInt) 1042 } 1043 1044 func testAccAWSS3BucketWebsiteConfigWithError(randInt int) string { 1045 return fmt.Sprintf(` 1046 resource "aws_s3_bucket" "bucket" { 1047 bucket = "tf-test-bucket-%d" 1048 acl = "public-read" 1049 1050 website { 1051 index_document = "index.html" 1052 error_document = "error.html" 1053 } 1054 } 1055 `, randInt) 1056 } 1057 1058 func testAccAWSS3BucketWebsiteConfigWithRedirect(randInt int) string { 1059 return fmt.Sprintf(` 1060 resource "aws_s3_bucket" "bucket" { 1061 bucket = "tf-test-bucket-%d" 1062 acl = "public-read" 1063 1064 website { 1065 redirect_all_requests_to = "hashicorp.com" 1066 } 1067 } 1068 `, randInt) 1069 } 1070 1071 func testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(randInt int) string { 1072 return fmt.Sprintf(` 1073 resource "aws_s3_bucket" "bucket" { 1074 bucket = "tf-test-bucket-%d" 1075 acl = "public-read" 1076 1077 website { 1078 redirect_all_requests_to = "https://hashicorp.com" 1079 } 1080 } 1081 `, randInt) 1082 } 1083 1084 func testAccAWSS3BucketWebsiteConfigWithRoutingRules(randInt int) string { 1085 return fmt.Sprintf(` 1086 resource "aws_s3_bucket" "bucket" { 1087 bucket = "tf-test-bucket-%d" 1088 acl = "public-read" 1089 1090 website { 1091 index_document = "index.html" 1092 error_document = "error.html" 1093 routing_rules = <<EOF 1094 [{ 1095 "Condition": { 1096 "KeyPrefixEquals": "docs/" 1097 }, 1098 "Redirect": { 1099 "ReplaceKeyPrefixWith": "documents/" 1100 } 1101 }] 1102 EOF 1103 } 1104 } 1105 `, randInt) 1106 } 1107 1108 func testAccAWSS3BucketConfigWithAcceleration(randInt int) string { 1109 return fmt.Sprintf(` 1110 provider "aws" { 1111 alias = "west" 1112 region = "eu-west-1" 1113 } 1114 1115 resource "aws_s3_bucket" "bucket" { 1116 provider = "aws.west" 1117 bucket = "tf-test-bucket-%d" 1118 region = "eu-west-1" 1119 acl = "public-read" 1120 acceleration_status = "Enabled" 1121 } 1122 `, randInt) 1123 } 1124 1125 func testAccAWSS3BucketConfigWithoutAcceleration(randInt int) string { 1126 return fmt.Sprintf(` 1127 provider "aws" { 1128 alias = "west" 1129 region = "eu-west-1" 1130 } 1131 1132 resource "aws_s3_bucket" "bucket" { 1133 provider = "aws.west" 1134 bucket = "tf-test-bucket-%d" 1135 region = "eu-west-1" 1136 acl = "public-read" 1137 acceleration_status = "Suspended" 1138 } 1139 `, randInt) 1140 } 1141 1142 func testAccAWSS3BucketConfigRequestPayerBucketOwner(randInt int) string { 1143 return fmt.Sprintf(` 1144 resource "aws_s3_bucket" "bucket" { 1145 bucket = "tf-test-bucket-%d" 1146 acl = "public-read" 1147 request_payer = "BucketOwner" 1148 } 1149 `, randInt) 1150 } 1151 1152 func testAccAWSS3BucketConfigRequestPayerRequester(randInt int) string { 1153 return fmt.Sprintf(` 1154 resource "aws_s3_bucket" "bucket" { 1155 bucket = "tf-test-bucket-%d" 1156 acl = "public-read" 1157 request_payer = "Requester" 1158 } 1159 `, randInt) 1160 } 1161 1162 func testAccAWSS3BucketConfigWithPolicy(randInt int) string { 1163 return fmt.Sprintf(` 1164 resource "aws_s3_bucket" "bucket" { 1165 bucket = "tf-test-bucket-%d" 1166 acl = "public-read" 1167 policy = %s 1168 } 1169 `, randInt, strconv.Quote(testAccAWSS3BucketPolicy(randInt))) 1170 } 1171 1172 func testAccAWSS3BucketDestroyedConfig(randInt int) string { 1173 return fmt.Sprintf(` 1174 resource "aws_s3_bucket" "bucket" { 1175 bucket = "tf-test-bucket-%d" 1176 acl = "public-read" 1177 } 1178 `, randInt) 1179 } 1180 1181 func testAccAWSS3BucketConfigWithEmptyPolicy(randInt int) string { 1182 return fmt.Sprintf(` 1183 resource "aws_s3_bucket" "bucket" { 1184 bucket = "tf-test-bucket-%d" 1185 acl = "public-read" 1186 policy = "" 1187 } 1188 `, randInt) 1189 } 1190 1191 func testAccAWSS3BucketConfigWithVersioning(randInt int) string { 1192 return fmt.Sprintf(` 1193 resource "aws_s3_bucket" "bucket" { 1194 bucket = "tf-test-bucket-%d" 1195 acl = "public-read" 1196 versioning { 1197 enabled = true 1198 } 1199 } 1200 `, randInt) 1201 } 1202 1203 func testAccAWSS3BucketConfigWithDisableVersioning(randInt int) string { 1204 return fmt.Sprintf(` 1205 resource "aws_s3_bucket" "bucket" { 1206 bucket = "tf-test-bucket-%d" 1207 acl = "public-read" 1208 versioning { 1209 enabled = false 1210 } 1211 } 1212 `, randInt) 1213 } 1214 1215 func testAccAWSS3BucketConfigWithCORS(randInt int) string { 1216 return fmt.Sprintf(` 1217 resource "aws_s3_bucket" "bucket" { 1218 bucket = "tf-test-bucket-%d" 1219 acl = "public-read" 1220 cors_rule { 1221 allowed_headers = ["*"] 1222 allowed_methods = ["PUT","POST"] 1223 allowed_origins = ["https://www.example.com"] 1224 expose_headers = ["x-amz-server-side-encryption","ETag"] 1225 max_age_seconds = 3000 1226 } 1227 } 1228 `, randInt) 1229 } 1230 1231 var testAccAWSS3BucketConfigWithAcl = ` 1232 resource "aws_s3_bucket" "bucket" { 1233 bucket = "tf-test-bucket-%d" 1234 acl = "public-read" 1235 } 1236 ` 1237 1238 var testAccAWSS3BucketConfigWithAclUpdate = ` 1239 resource "aws_s3_bucket" "bucket" { 1240 bucket = "tf-test-bucket-%d" 1241 acl = "private" 1242 } 1243 ` 1244 1245 func testAccAWSS3BucketConfigWithLogging(randInt int) string { 1246 return fmt.Sprintf(` 1247 resource "aws_s3_bucket" "log_bucket" { 1248 bucket = "tf-test-log-bucket-%d" 1249 acl = "log-delivery-write" 1250 } 1251 resource "aws_s3_bucket" "bucket" { 1252 bucket = "tf-test-bucket-%d" 1253 acl = "private" 1254 logging { 1255 target_bucket = "${aws_s3_bucket.log_bucket.id}" 1256 target_prefix = "log/" 1257 } 1258 } 1259 `, randInt, randInt) 1260 } 1261 1262 func testAccAWSS3BucketConfigWithLifecycle(randInt int) string { 1263 return fmt.Sprintf(` 1264 resource "aws_s3_bucket" "bucket" { 1265 bucket = "tf-test-bucket-%d" 1266 acl = "private" 1267 lifecycle_rule { 1268 id = "id1" 1269 prefix = "path1/" 1270 enabled = true 1271 1272 expiration { 1273 days = 365 1274 } 1275 1276 transition { 1277 days = 30 1278 storage_class = "STANDARD_IA" 1279 } 1280 transition { 1281 days = 60 1282 storage_class = "GLACIER" 1283 } 1284 } 1285 lifecycle_rule { 1286 id = "id2" 1287 prefix = "path2/" 1288 enabled = true 1289 1290 expiration { 1291 date = "2016-01-12" 1292 } 1293 } 1294 } 1295 `, randInt) 1296 } 1297 1298 func testAccAWSS3BucketConfigWithVersioningLifecycle(randInt int) string { 1299 return fmt.Sprintf(` 1300 resource "aws_s3_bucket" "bucket" { 1301 bucket = "tf-test-bucket-%d" 1302 acl = "private" 1303 versioning { 1304 enabled = false 1305 } 1306 lifecycle_rule { 1307 id = "id1" 1308 prefix = "path1/" 1309 enabled = true 1310 1311 noncurrent_version_expiration { 1312 days = 365 1313 } 1314 noncurrent_version_transition { 1315 days = 30 1316 storage_class = "STANDARD_IA" 1317 } 1318 noncurrent_version_transition { 1319 days = 60 1320 storage_class = "GLACIER" 1321 } 1322 } 1323 lifecycle_rule { 1324 id = "id2" 1325 prefix = "path2/" 1326 enabled = false 1327 1328 noncurrent_version_expiration { 1329 days = 365 1330 } 1331 } 1332 } 1333 `, randInt) 1334 } 1335 1336 const testAccAWSS3BucketConfigReplicationBasic = ` 1337 provider "aws" { 1338 alias = "euwest" 1339 region = "eu-west-1" 1340 } 1341 1342 provider "aws" { 1343 alias = "uswest2" 1344 region = "us-west-2" 1345 } 1346 1347 resource "aws_iam_role" "role" { 1348 name = "tf-iam-role-replication-%d" 1349 assume_role_policy = <<POLICY 1350 { 1351 "Version": "2012-10-17", 1352 "Statement": [ 1353 { 1354 "Action": "sts:AssumeRole", 1355 "Principal": { 1356 "Service": "s3.amazonaws.com" 1357 }, 1358 "Effect": "Allow", 1359 "Sid": "" 1360 } 1361 ] 1362 } 1363 POLICY 1364 } 1365 ` 1366 1367 func testAccAWSS3BucketConfigReplication(randInt int) string { 1368 return fmt.Sprintf(testAccAWSS3BucketConfigReplicationBasic+` 1369 resource "aws_s3_bucket" "bucket" { 1370 provider = "aws.uswest2" 1371 bucket = "tf-test-bucket-%d" 1372 acl = "private" 1373 1374 versioning { 1375 enabled = true 1376 } 1377 } 1378 1379 resource "aws_s3_bucket" "destination" { 1380 provider = "aws.euwest" 1381 bucket = "tf-test-bucket-destination-%d" 1382 region = "eu-west-1" 1383 1384 versioning { 1385 enabled = true 1386 } 1387 } 1388 `, randInt, randInt, randInt) 1389 } 1390 1391 func testAccAWSS3BucketConfigReplicationWithConfiguration(randInt int) string { 1392 return fmt.Sprintf(testAccAWSS3BucketConfigReplicationBasic+` 1393 resource "aws_s3_bucket" "bucket" { 1394 provider = "aws.uswest2" 1395 bucket = "tf-test-bucket-%d" 1396 acl = "private" 1397 1398 versioning { 1399 enabled = true 1400 } 1401 1402 replication_configuration { 1403 role = "${aws_iam_role.role.arn}" 1404 rules { 1405 id = "foobar" 1406 prefix = "foo" 1407 status = "Enabled" 1408 1409 destination { 1410 bucket = "${aws_s3_bucket.destination.arn}" 1411 storage_class = "STANDARD" 1412 } 1413 } 1414 } 1415 } 1416 1417 resource "aws_s3_bucket" "destination" { 1418 provider = "aws.euwest" 1419 bucket = "tf-test-bucket-destination-%d" 1420 region = "eu-west-1" 1421 1422 versioning { 1423 enabled = true 1424 } 1425 } 1426 `, randInt, randInt, randInt) 1427 } 1428 1429 func testAccAWSS3BucketConfigReplicationNoVersioning(randInt int) string { 1430 return fmt.Sprintf(testAccAWSS3BucketConfigReplicationBasic+` 1431 resource "aws_s3_bucket" "bucket" { 1432 provider = "aws.uswest2" 1433 bucket = "tf-test-bucket-%d" 1434 acl = "private" 1435 1436 replication_configuration { 1437 role = "${aws_iam_role.role.arn}" 1438 rules { 1439 id = "foobar" 1440 prefix = "foo" 1441 status = "Enabled" 1442 1443 destination { 1444 bucket = "${aws_s3_bucket.destination.arn}" 1445 storage_class = "STANDARD" 1446 } 1447 } 1448 } 1449 } 1450 1451 resource "aws_s3_bucket" "destination" { 1452 provider = "aws.euwest" 1453 bucket = "tf-test-bucket-destination-%d" 1454 region = "eu-west-1" 1455 1456 versioning { 1457 enabled = true 1458 } 1459 } 1460 `, randInt, randInt, randInt) 1461 }