github.com/jonasi/terraform@v0.6.10-0.20160125170522-e865c342cc1f/builtin/providers/aws/resource_aws_s3_bucket_test.go (about) 1 package aws 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "math/rand" 7 "reflect" 8 "regexp" 9 "strconv" 10 "testing" 11 "time" 12 13 "github.com/hashicorp/terraform/helper/resource" 14 "github.com/hashicorp/terraform/terraform" 15 16 "github.com/aws/aws-sdk-go/aws" 17 "github.com/aws/aws-sdk-go/aws/awserr" 18 "github.com/aws/aws-sdk-go/service/s3" 19 ) 20 21 func TestAccAWSS3Bucket_basic(t *testing.T) { 22 23 arnRegexp := regexp.MustCompile( 24 "^arn:aws:s3:::") 25 26 resource.Test(t, resource.TestCase{ 27 PreCheck: func() { testAccPreCheck(t) }, 28 Providers: testAccProviders, 29 CheckDestroy: testAccCheckAWSS3BucketDestroy, 30 Steps: []resource.TestStep{ 31 resource.TestStep{ 32 Config: testAccAWSS3BucketConfig, 33 Check: resource.ComposeTestCheckFunc( 34 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 35 resource.TestCheckResourceAttr( 36 "aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")), 37 resource.TestCheckResourceAttr( 38 "aws_s3_bucket.bucket", "region", "us-west-2"), 39 resource.TestCheckResourceAttr( 40 "aws_s3_bucket.bucket", "website_endpoint", ""), 41 resource.TestMatchResourceAttr( 42 "aws_s3_bucket.bucket", "arn", arnRegexp), 43 ), 44 }, 45 }, 46 }) 47 } 48 49 func TestAccAWSS3Bucket_Policy(t *testing.T) { 50 resource.Test(t, resource.TestCase{ 51 PreCheck: func() { testAccPreCheck(t) }, 52 Providers: testAccProviders, 53 CheckDestroy: testAccCheckAWSS3BucketDestroy, 54 Steps: []resource.TestStep{ 55 resource.TestStep{ 56 Config: testAccAWSS3BucketConfigWithPolicy, 57 Check: resource.ComposeTestCheckFunc( 58 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 59 testAccCheckAWSS3BucketPolicy( 60 "aws_s3_bucket.bucket", testAccAWSS3BucketPolicy), 61 ), 62 }, 63 resource.TestStep{ 64 Config: testAccAWSS3BucketConfig, 65 Check: resource.ComposeTestCheckFunc( 66 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 67 testAccCheckAWSS3BucketPolicy( 68 "aws_s3_bucket.bucket", ""), 69 ), 70 }, 71 }, 72 }) 73 } 74 75 func TestAccAWSS3Bucket_UpdateAcl(t *testing.T) { 76 77 ri := genRandInt() 78 preConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAcl, ri) 79 postConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAclUpdate, ri) 80 81 resource.Test(t, resource.TestCase{ 82 PreCheck: func() { testAccPreCheck(t) }, 83 Providers: testAccProviders, 84 CheckDestroy: testAccCheckAWSS3BucketDestroy, 85 Steps: []resource.TestStep{ 86 resource.TestStep{ 87 Config: preConfig, 88 Check: resource.ComposeTestCheckFunc( 89 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 90 resource.TestCheckResourceAttr( 91 "aws_s3_bucket.bucket", "acl", "public-read"), 92 ), 93 }, 94 resource.TestStep{ 95 Config: postConfig, 96 Check: resource.ComposeTestCheckFunc( 97 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 98 resource.TestCheckResourceAttr( 99 "aws_s3_bucket.bucket", "acl", "private"), 100 ), 101 }, 102 }, 103 }) 104 } 105 106 func TestAccAWSS3Bucket_Website_Simple(t *testing.T) { 107 resource.Test(t, resource.TestCase{ 108 PreCheck: func() { testAccPreCheck(t) }, 109 Providers: testAccProviders, 110 CheckDestroy: testAccCheckAWSS3BucketDestroy, 111 Steps: []resource.TestStep{ 112 resource.TestStep{ 113 Config: testAccAWSS3BucketWebsiteConfig, 114 Check: resource.ComposeTestCheckFunc( 115 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 116 testAccCheckAWSS3BucketWebsite( 117 "aws_s3_bucket.bucket", "index.html", "", "", ""), 118 resource.TestCheckResourceAttr( 119 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint), 120 ), 121 }, 122 resource.TestStep{ 123 Config: testAccAWSS3BucketWebsiteConfigWithError, 124 Check: resource.ComposeTestCheckFunc( 125 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 126 testAccCheckAWSS3BucketWebsite( 127 "aws_s3_bucket.bucket", "index.html", "error.html", "", ""), 128 resource.TestCheckResourceAttr( 129 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint), 130 ), 131 }, 132 resource.TestStep{ 133 Config: testAccAWSS3BucketConfig, 134 Check: resource.ComposeTestCheckFunc( 135 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 136 testAccCheckAWSS3BucketWebsite( 137 "aws_s3_bucket.bucket", "", "", "", ""), 138 resource.TestCheckResourceAttr( 139 "aws_s3_bucket.bucket", "website_endpoint", ""), 140 ), 141 }, 142 }, 143 }) 144 } 145 146 func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) { 147 resource.Test(t, resource.TestCase{ 148 PreCheck: func() { testAccPreCheck(t) }, 149 Providers: testAccProviders, 150 CheckDestroy: testAccCheckAWSS3BucketDestroy, 151 Steps: []resource.TestStep{ 152 resource.TestStep{ 153 Config: testAccAWSS3BucketWebsiteConfigWithRedirect, 154 Check: resource.ComposeTestCheckFunc( 155 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 156 testAccCheckAWSS3BucketWebsite( 157 "aws_s3_bucket.bucket", "", "", "", "hashicorp.com"), 158 resource.TestCheckResourceAttr( 159 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint), 160 ), 161 }, 162 resource.TestStep{ 163 Config: testAccAWSS3BucketWebsiteConfigWithHttpsRedirect, 164 Check: resource.ComposeTestCheckFunc( 165 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 166 testAccCheckAWSS3BucketWebsite( 167 "aws_s3_bucket.bucket", "", "", "https", "hashicorp.com"), 168 resource.TestCheckResourceAttr( 169 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint), 170 ), 171 }, 172 resource.TestStep{ 173 Config: testAccAWSS3BucketConfig, 174 Check: resource.ComposeTestCheckFunc( 175 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 176 testAccCheckAWSS3BucketWebsite( 177 "aws_s3_bucket.bucket", "", "", "", ""), 178 resource.TestCheckResourceAttr( 179 "aws_s3_bucket.bucket", "website_endpoint", ""), 180 ), 181 }, 182 }, 183 }) 184 } 185 186 // Test TestAccAWSS3Bucket_shouldFailNotFound is designed to fail with a "plan 187 // not empty" error in Terraform, to check against regresssions. 188 // See https://github.com/hashicorp/terraform/pull/2925 189 func TestAccAWSS3Bucket_shouldFailNotFound(t *testing.T) { 190 resource.Test(t, resource.TestCase{ 191 PreCheck: func() { testAccPreCheck(t) }, 192 Providers: testAccProviders, 193 CheckDestroy: testAccCheckAWSS3BucketDestroy, 194 Steps: []resource.TestStep{ 195 resource.TestStep{ 196 Config: testAccAWSS3BucketDestroyedConfig, 197 Check: resource.ComposeTestCheckFunc( 198 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 199 testAccCheckAWSS3DestroyBucket("aws_s3_bucket.bucket"), 200 ), 201 ExpectNonEmptyPlan: true, 202 }, 203 }, 204 }) 205 } 206 207 func TestAccAWSS3Bucket_Versioning(t *testing.T) { 208 resource.Test(t, resource.TestCase{ 209 PreCheck: func() { testAccPreCheck(t) }, 210 Providers: testAccProviders, 211 CheckDestroy: testAccCheckAWSS3BucketDestroy, 212 Steps: []resource.TestStep{ 213 resource.TestStep{ 214 Config: testAccAWSS3BucketConfig, 215 Check: resource.ComposeTestCheckFunc( 216 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 217 testAccCheckAWSS3BucketVersioning( 218 "aws_s3_bucket.bucket", ""), 219 ), 220 }, 221 resource.TestStep{ 222 Config: testAccAWSS3BucketConfigWithVersioning, 223 Check: resource.ComposeTestCheckFunc( 224 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 225 testAccCheckAWSS3BucketVersioning( 226 "aws_s3_bucket.bucket", s3.BucketVersioningStatusEnabled), 227 ), 228 }, 229 resource.TestStep{ 230 Config: testAccAWSS3BucketConfigWithDisableVersioning, 231 Check: resource.ComposeTestCheckFunc( 232 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 233 testAccCheckAWSS3BucketVersioning( 234 "aws_s3_bucket.bucket", s3.BucketVersioningStatusSuspended), 235 ), 236 }, 237 }, 238 }) 239 } 240 241 func TestAccAWSS3Bucket_Cors(t *testing.T) { 242 resource.Test(t, resource.TestCase{ 243 PreCheck: func() { testAccPreCheck(t) }, 244 Providers: testAccProviders, 245 CheckDestroy: testAccCheckAWSS3BucketDestroy, 246 Steps: []resource.TestStep{ 247 resource.TestStep{ 248 Config: testAccAWSS3BucketConfigWithCORS, 249 Check: resource.ComposeTestCheckFunc( 250 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 251 testAccCheckAWSS3BucketCors( 252 "aws_s3_bucket.bucket", 253 []*s3.CORSRule{ 254 &s3.CORSRule{ 255 AllowedHeaders: []*string{aws.String("*")}, 256 AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")}, 257 AllowedOrigins: []*string{aws.String("https://www.example.com")}, 258 ExposeHeaders: []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")}, 259 MaxAgeSeconds: aws.Int64(3000), 260 }, 261 }, 262 ), 263 ), 264 }, 265 }, 266 }) 267 } 268 269 func TestAccAWSS3Bucket_Logging(t *testing.T) { 270 resource.Test(t, resource.TestCase{ 271 PreCheck: func() { testAccPreCheck(t) }, 272 Providers: testAccProviders, 273 CheckDestroy: testAccCheckAWSS3BucketDestroy, 274 Steps: []resource.TestStep{ 275 resource.TestStep{ 276 Config: testAccAWSS3BucketConfigWithLogging, 277 Check: resource.ComposeTestCheckFunc( 278 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 279 testAccCheckAWSS3BucketLogging( 280 "aws_s3_bucket.bucket", "aws_s3_bucket.log_bucket", "log/"), 281 ), 282 }, 283 }, 284 }) 285 } 286 287 func testAccCheckAWSS3BucketDestroy(s *terraform.State) error { 288 conn := testAccProvider.Meta().(*AWSClient).s3conn 289 290 for _, rs := range s.RootModule().Resources { 291 if rs.Type != "aws_s3_bucket" { 292 continue 293 } 294 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 295 Bucket: aws.String(rs.Primary.ID), 296 }) 297 if err != nil { 298 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucket" { 299 return nil 300 } 301 return err 302 } 303 } 304 return nil 305 } 306 307 func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc { 308 return func(s *terraform.State) error { 309 rs, ok := s.RootModule().Resources[n] 310 if !ok { 311 return fmt.Errorf("Not found: %s", n) 312 } 313 314 if rs.Primary.ID == "" { 315 return fmt.Errorf("No S3 Bucket ID is set") 316 } 317 318 conn := testAccProvider.Meta().(*AWSClient).s3conn 319 _, err := conn.HeadBucket(&s3.HeadBucketInput{ 320 Bucket: aws.String(rs.Primary.ID), 321 }) 322 323 if err != nil { 324 return fmt.Errorf("S3Bucket error: %v", err) 325 } 326 return nil 327 } 328 } 329 330 func testAccCheckAWSS3DestroyBucket(n string) resource.TestCheckFunc { 331 return func(s *terraform.State) error { 332 rs, ok := s.RootModule().Resources[n] 333 if !ok { 334 return fmt.Errorf("Not found: %s", n) 335 } 336 337 if rs.Primary.ID == "" { 338 return fmt.Errorf("No S3 Bucket ID is set") 339 } 340 341 conn := testAccProvider.Meta().(*AWSClient).s3conn 342 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 343 Bucket: aws.String(rs.Primary.ID), 344 }) 345 346 if err != nil { 347 return fmt.Errorf("Error destroying Bucket (%s) in testAccCheckAWSS3DestroyBucket: %s", rs.Primary.ID, err) 348 } 349 return nil 350 } 351 } 352 353 func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc { 354 return func(s *terraform.State) error { 355 rs, _ := s.RootModule().Resources[n] 356 conn := testAccProvider.Meta().(*AWSClient).s3conn 357 358 out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{ 359 Bucket: aws.String(rs.Primary.ID), 360 }) 361 362 if err != nil { 363 if policy == "" { 364 // expected 365 return nil 366 } else { 367 return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy) 368 } 369 } 370 371 if v := out.Policy; v == nil { 372 if policy != "" { 373 return fmt.Errorf("bad policy, found nil, expected: %s", policy) 374 } 375 } else { 376 expected := make(map[string]interface{}) 377 if err := json.Unmarshal([]byte(policy), &expected); err != nil { 378 return err 379 } 380 actual := make(map[string]interface{}) 381 if err := json.Unmarshal([]byte(*v), &actual); err != nil { 382 return err 383 } 384 385 if !reflect.DeepEqual(expected, actual) { 386 return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual) 387 } 388 } 389 390 return nil 391 } 392 } 393 func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectProtocol string, redirectTo string) resource.TestCheckFunc { 394 return func(s *terraform.State) error { 395 rs, _ := s.RootModule().Resources[n] 396 conn := testAccProvider.Meta().(*AWSClient).s3conn 397 398 out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{ 399 Bucket: aws.String(rs.Primary.ID), 400 }) 401 402 if err != nil { 403 if indexDoc == "" { 404 // If we want to assert that the website is not there, than 405 // this error is expected 406 return nil 407 } else { 408 return fmt.Errorf("S3BucketWebsite error: %v", err) 409 } 410 } 411 412 if v := out.IndexDocument; v == nil { 413 if indexDoc != "" { 414 return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc) 415 } 416 } else { 417 if *v.Suffix != indexDoc { 418 return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument) 419 } 420 } 421 422 if v := out.ErrorDocument; v == nil { 423 if errorDoc != "" { 424 return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc) 425 } 426 } else { 427 if *v.Key != errorDoc { 428 return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument) 429 } 430 } 431 432 if v := out.RedirectAllRequestsTo; v == nil { 433 if redirectTo != "" { 434 return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo) 435 } 436 } else { 437 if *v.HostName != redirectTo { 438 return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo) 439 } 440 if redirectProtocol != "" && *v.Protocol != redirectProtocol { 441 return fmt.Errorf("bad redirect protocol to, expected: %s, got %#v", redirectProtocol, out.RedirectAllRequestsTo) 442 } 443 } 444 445 return nil 446 } 447 } 448 449 func testAccCheckAWSS3BucketVersioning(n string, versioningStatus string) resource.TestCheckFunc { 450 return func(s *terraform.State) error { 451 rs, _ := s.RootModule().Resources[n] 452 conn := testAccProvider.Meta().(*AWSClient).s3conn 453 454 out, err := conn.GetBucketVersioning(&s3.GetBucketVersioningInput{ 455 Bucket: aws.String(rs.Primary.ID), 456 }) 457 458 if err != nil { 459 return fmt.Errorf("GetBucketVersioning error: %v", err) 460 } 461 462 if v := out.Status; v == nil { 463 if versioningStatus != "" { 464 return fmt.Errorf("bad error versioning status, found nil, expected: %s", versioningStatus) 465 } 466 } else { 467 if *v != versioningStatus { 468 return fmt.Errorf("bad error versioning status, expected: %s, got %s", versioningStatus, *v) 469 } 470 } 471 472 return nil 473 } 474 } 475 func testAccCheckAWSS3BucketCors(n string, corsRules []*s3.CORSRule) resource.TestCheckFunc { 476 return func(s *terraform.State) error { 477 rs, _ := s.RootModule().Resources[n] 478 conn := testAccProvider.Meta().(*AWSClient).s3conn 479 480 out, err := conn.GetBucketCors(&s3.GetBucketCorsInput{ 481 Bucket: aws.String(rs.Primary.ID), 482 }) 483 484 if err != nil { 485 return fmt.Errorf("GetBucketCors error: %v", err) 486 } 487 488 if !reflect.DeepEqual(out.CORSRules, corsRules) { 489 return fmt.Errorf("bad error cors rule, expected: %v, got %v", corsRules, out.CORSRules) 490 } 491 492 return nil 493 } 494 } 495 496 func testAccCheckAWSS3BucketLogging(n, b, p string) resource.TestCheckFunc { 497 return func(s *terraform.State) error { 498 rs, _ := s.RootModule().Resources[n] 499 conn := testAccProvider.Meta().(*AWSClient).s3conn 500 501 out, err := conn.GetBucketLogging(&s3.GetBucketLoggingInput{ 502 Bucket: aws.String(rs.Primary.ID), 503 }) 504 505 if err != nil { 506 return fmt.Errorf("GetBucketLogging error: %v", err) 507 } 508 509 tb, _ := s.RootModule().Resources[b] 510 511 if v := out.LoggingEnabled.TargetBucket; v == nil { 512 if tb.Primary.ID != "" { 513 return fmt.Errorf("bad target bucket, found nil, expected: %s", tb.Primary.ID) 514 } 515 } else { 516 if *v != tb.Primary.ID { 517 return fmt.Errorf("bad target bucket, expected: %s, got %s", tb.Primary.ID, *v) 518 } 519 } 520 521 if v := out.LoggingEnabled.TargetPrefix; v == nil { 522 if p != "" { 523 return fmt.Errorf("bad target prefix, found nil, expected: %s", p) 524 } 525 } else { 526 if *v != p { 527 return fmt.Errorf("bad target prefix, expected: %s, got %s", p, *v) 528 } 529 } 530 531 return nil 532 } 533 } 534 535 // These need a bit of randomness as the name can only be used once globally 536 // within AWS 537 var randInt = rand.New(rand.NewSource(time.Now().UnixNano())).Int() 538 var testAccWebsiteEndpoint = fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt) 539 var testAccAWSS3BucketPolicy = fmt.Sprintf(`{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::tf-test-bucket-%d/*" } ] }`, randInt) 540 541 var testAccAWSS3BucketConfig = fmt.Sprintf(` 542 resource "aws_s3_bucket" "bucket" { 543 bucket = "tf-test-bucket-%d" 544 acl = "public-read" 545 } 546 `, randInt) 547 548 var testAccAWSS3BucketWebsiteConfig = fmt.Sprintf(` 549 resource "aws_s3_bucket" "bucket" { 550 bucket = "tf-test-bucket-%d" 551 acl = "public-read" 552 553 website { 554 index_document = "index.html" 555 } 556 } 557 `, randInt) 558 559 var testAccAWSS3BucketWebsiteConfigWithError = fmt.Sprintf(` 560 resource "aws_s3_bucket" "bucket" { 561 bucket = "tf-test-bucket-%d" 562 acl = "public-read" 563 564 website { 565 index_document = "index.html" 566 error_document = "error.html" 567 } 568 } 569 `, randInt) 570 571 var testAccAWSS3BucketWebsiteConfigWithRedirect = fmt.Sprintf(` 572 resource "aws_s3_bucket" "bucket" { 573 bucket = "tf-test-bucket-%d" 574 acl = "public-read" 575 576 website { 577 redirect_all_requests_to = "hashicorp.com" 578 } 579 } 580 `, randInt) 581 582 var testAccAWSS3BucketWebsiteConfigWithHttpsRedirect = fmt.Sprintf(` 583 resource "aws_s3_bucket" "bucket" { 584 bucket = "tf-test-bucket-%d" 585 acl = "public-read" 586 587 website { 588 redirect_all_requests_to = "https://hashicorp.com" 589 } 590 } 591 `, randInt) 592 593 var testAccAWSS3BucketConfigWithPolicy = fmt.Sprintf(` 594 resource "aws_s3_bucket" "bucket" { 595 bucket = "tf-test-bucket-%d" 596 acl = "public-read" 597 policy = %s 598 } 599 `, randInt, strconv.Quote(testAccAWSS3BucketPolicy)) 600 601 var destroyedName = fmt.Sprintf("tf-test-bucket-%d", randInt) 602 var testAccAWSS3BucketDestroyedConfig = fmt.Sprintf(` 603 resource "aws_s3_bucket" "bucket" { 604 bucket = "%s" 605 acl = "public-read" 606 } 607 `, destroyedName) 608 var testAccAWSS3BucketConfigWithVersioning = fmt.Sprintf(` 609 resource "aws_s3_bucket" "bucket" { 610 bucket = "tf-test-bucket-%d" 611 acl = "public-read" 612 versioning { 613 enabled = true 614 } 615 } 616 `, randInt) 617 618 var testAccAWSS3BucketConfigWithDisableVersioning = fmt.Sprintf(` 619 resource "aws_s3_bucket" "bucket" { 620 bucket = "tf-test-bucket-%d" 621 acl = "public-read" 622 versioning { 623 enabled = false 624 } 625 } 626 `, randInt) 627 628 var testAccAWSS3BucketConfigWithCORS = fmt.Sprintf(` 629 resource "aws_s3_bucket" "bucket" { 630 bucket = "tf-test-bucket-%d" 631 acl = "public-read" 632 cors_rule { 633 allowed_headers = ["*"] 634 allowed_methods = ["PUT","POST"] 635 allowed_origins = ["https://www.example.com"] 636 expose_headers = ["x-amz-server-side-encryption","ETag"] 637 max_age_seconds = 3000 638 } 639 } 640 `, randInt) 641 642 var testAccAWSS3BucketConfigWithAcl = ` 643 resource "aws_s3_bucket" "bucket" { 644 bucket = "tf-test-bucket-%d" 645 acl = "public-read" 646 } 647 ` 648 649 var testAccAWSS3BucketConfigWithAclUpdate = ` 650 resource "aws_s3_bucket" "bucket" { 651 bucket = "tf-test-bucket-%d" 652 acl = "private" 653 } 654 ` 655 656 var testAccAWSS3BucketConfigWithLogging = fmt.Sprintf(` 657 resource "aws_s3_bucket" "log_bucket" { 658 bucket = "tf-test-log-bucket-%d" 659 acl = "log-delivery-write" 660 } 661 resource "aws_s3_bucket" "bucket" { 662 bucket = "tf-test-bucket-%d" 663 acl = "private" 664 logging { 665 target_bucket = "${aws_s3_bucket.log_bucket.id}" 666 target_prefix = "log/" 667 } 668 } 669 `, randInt, randInt)