diff --git a/builtin/providers/aws/provider.go b/builtin/providers/aws/provider.go index 54b542781..3c417d32d 100644 --- a/builtin/providers/aws/provider.go +++ b/builtin/providers/aws/provider.go @@ -13,23 +13,32 @@ func Provider() terraform.ResourceProvider { return &schema.Provider{ Schema: map[string]*schema.Schema{ "access_key": &schema.Schema{ - Type: schema.TypeString, - Required: true, - DefaultFunc: schema.EnvDefaultFunc("AWS_ACCESS_KEY", nil), + Type: schema.TypeString, + Required: true, + DefaultFunc: schema.MultiEnvDefaultFunc([]string{ + "AWS_ACCESS_KEY", + "AWS_ACCESS_KEY_ID", + }, nil), Description: descriptions["access_key"], }, "secret_key": &schema.Schema{ - Type: schema.TypeString, - Required: true, - DefaultFunc: schema.EnvDefaultFunc("AWS_SECRET_KEY", nil), + Type: schema.TypeString, + Required: true, + DefaultFunc: schema.MultiEnvDefaultFunc([]string{ + "AWS_SECRET_KEY", + "AWS_SECRET_ACCESS_KEY", + }, nil), Description: descriptions["secret_key"], }, "region": &schema.Schema{ - Type: schema.TypeString, - Required: true, - DefaultFunc: schema.EnvDefaultFunc("AWS_REGION", nil), + Type: schema.TypeString, + Required: true, + DefaultFunc: schema.MultiEnvDefaultFunc([]string{ + "AWS_REGION", + "AWS_DEFAULT_REGION", + }, nil), Description: descriptions["region"], InputDefault: "us-east-1", }, diff --git a/builtin/providers/aws/provider_test.go b/builtin/providers/aws/provider_test.go index ea214f7ee..77cd93107 100644 --- a/builtin/providers/aws/provider_test.go +++ b/builtin/providers/aws/provider_test.go @@ -30,14 +30,14 @@ func TestProvider_impl(t *testing.T) { } func testAccPreCheck(t *testing.T) { - if v := os.Getenv("AWS_ACCESS_KEY"); v == "" { - t.Fatal("AWS_ACCESS_KEY must be set for acceptance tests") + if v := os.Getenv("AWS_ACCESS_KEY_ID"); v == "" { + t.Fatal("AWS_ACCESS_KEY_ID must be set for acceptance tests") } - if v := os.Getenv("AWS_SECRET_KEY"); v == "" { - t.Fatal("AWS_SECRET_KEY must be set for acceptance tests") + if v := os.Getenv("AWS_SECRET_ACCESS_KEY"); v == "" { + t.Fatal("AWS_SECRET_ACCESS_KEY must be set for acceptance tests") } - if v := os.Getenv("AWS_REGION"); v == "" { + if v := os.Getenv("AWS_DEFAULT_REGION"); v == "" { log.Println("[INFO] Test: Using us-west-2 as test region") - os.Setenv("AWS_REGION", "us-west-2") + os.Setenv("AWS_DEFAULT_REGION", "us-west-2") } } diff --git a/helper/schema/schema.go b/helper/schema/schema.go index 2bb23168c..b41e826a2 100644 --- a/helper/schema/schema.go +++ b/helper/schema/schema.go @@ -174,6 +174,21 @@ func EnvDefaultFunc(k string, dv interface{}) SchemaDefaultFunc { } } +// MultiEnvDefaultFunc is a helper function that returns the value of the first +// environment variable in the given list that returns a non-empty value. If +// none of the environment variables return a value, the default value is +// returned. +func MultiEnvDefaultFunc(ks []string, dv interface{}) SchemaDefaultFunc { + return func() (interface{}, error) { + for _, k := range ks { + if v := os.Getenv(k); v != "" { + return v, nil + } + } + return dv, nil + } +} + // SchemaSetFunc is a function that must return a unique ID for the given // element. This unique ID is used to store the element in a hash. type SchemaSetFunc func(interface{}) int diff --git a/helper/schema/schema_test.go b/helper/schema/schema_test.go index 6d20256d1..c96c463b7 100644 --- a/helper/schema/schema_test.go +++ b/helper/schema/schema_test.go @@ -40,6 +40,63 @@ func TestEnvDefaultFunc(t *testing.T) { } } +func TestMultiEnvDefaultFunc(t *testing.T) { + keys := []string{ + "TF_TEST_MULTI_ENV_DEFAULT_FUNC1", + "TF_TEST_MULTI_ENV_DEFAULT_FUNC2", + } + defer func() { + for _, k := range keys { + os.Unsetenv(k) + } + }() + + // Test that the first key is returned first + f := MultiEnvDefaultFunc(keys, "42") + if err := os.Setenv(keys[0], "foo"); err != nil { + t.Fatalf("err: %s", err) + } + + actual, err := f() + if err != nil { + t.Fatalf("err: %s", err) + } + if actual != "foo" { + t.Fatalf("bad: %#v", actual) + } + + if err := os.Unsetenv(keys[0]); err != nil { + t.Fatalf("err: %s", err) + } + + // Test that the second key is returned if the first one is empty + f = MultiEnvDefaultFunc(keys, "42") + if err := os.Setenv(keys[1], "foo"); err != nil { + t.Fatalf("err: %s", err) + } + + actual, err = f() + if err != nil { + t.Fatalf("err: %s", err) + } + if actual != "foo" { + t.Fatalf("bad: %#v", actual) + } + + if err := os.Unsetenv(keys[1]); err != nil { + t.Fatalf("err: %s", err) + } + + // Test that the default value is returned when no keys are set + actual, err = f() + if err != nil { + t.Fatalf("err: %s", err) + } + if actual != "42" { + t.Fatalf("bad: %#v", actual) + } +} + func TestValueType_Zero(t *testing.T) { cases := []struct { Type ValueType diff --git a/website/Gemfile.lock b/website/Gemfile.lock index f30c41661..e956a6aa6 100644 --- a/website/Gemfile.lock +++ b/website/Gemfile.lock @@ -1,6 +1,6 @@ GIT remote: git://github.com/hashicorp/middleman-hashicorp.git - revision: b82c2c2fdc244cd0bd529ff27cfab24e43f07708 + revision: 30c15f93fb501041cff97c490b60ddc96c8314c9 specs: middleman-hashicorp (0.1.0) bootstrap-sass (~> 3.2) @@ -20,14 +20,18 @@ GIT GEM remote: https://rubygems.org/ specs: - activesupport (4.1.8) + activesupport (4.1.9) i18n (~> 0.6, >= 0.6.9) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) thread_safe (~> 0.1) tzinfo (~> 1.1) - bootstrap-sass (3.3.1.0) - sass (~> 3.2) + autoprefixer-rails (5.0.0.2) + execjs + json + bootstrap-sass (3.3.3) + autoprefixer-rails (>= 5.0.0.1) + sass (>= 3.2.19) builder (3.2.2) celluloid (0.16.0) timers (~> 4.0.0) @@ -37,14 +41,14 @@ GEM execjs coffee-script-source (1.8.0) commonjs (0.2.7) - compass (1.0.1) + compass (1.0.3) chunky_png (~> 1.2) - compass-core (~> 1.0.1) + compass-core (~> 1.0.2) compass-import-once (~> 1.0.5) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) sass (>= 3.3.13, < 3.5) - compass-core (1.0.1) + compass-core (1.0.3) multi_json (~> 1.0) sass (>= 3.3.0, < 3.5) compass-import-once (1.0.5) @@ -54,10 +58,10 @@ GEM eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) erubis (2.7.0) - eventmachine (1.0.3) + eventmachine (1.0.4) execjs (2.2.2) ffi (1.9.6) - haml (4.0.5) + haml (4.0.6) tilt hike (1.2.3) hitimes (1.2.2) @@ -66,12 +70,12 @@ GEM htmlcompressor (0.1.2) http_parser.rb (0.6.0) i18n (0.6.11) - json (1.8.1) + json (1.8.2) kramdown (1.5.0) less (2.6.0) commonjs (~> 0.2.7) libv8 (3.16.14.7) - listen (2.8.0) + listen (2.8.5) celluloid (>= 0.15.2) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) @@ -98,22 +102,22 @@ GEM rack-test (~> 0.6.2) thor (>= 0.15.2, < 2.0) tilt (~> 1.4.1, < 2.0) - middleman-livereload (3.3.4) + middleman-livereload (3.4.2) em-websocket (~> 0.5.1) - middleman-core (~> 3.2) + middleman-core (>= 3.3) rack-livereload (~> 0.3.15) middleman-minify-html (3.4.0) htmlcompressor (~> 0.1.0) middleman-core (>= 3.2) - middleman-sprockets (3.3.10) - middleman-core (~> 3.3) + middleman-sprockets (3.4.1) + middleman-core (>= 3.3) sprockets (~> 2.12.1) sprockets-helpers (~> 1.1.0) - sprockets-sass (~> 1.2.0) + sprockets-sass (~> 1.3.0) middleman-syntax (2.0.0) middleman-core (~> 3.2) rouge (~> 1.0) - minitest (5.4.3) + minitest (5.5.1) multi_json (1.10.1) padrino-helpers (0.12.4) i18n (~> 0.6, >= 0.6.7) @@ -121,22 +125,22 @@ GEM tilt (~> 1.4.1) padrino-support (0.12.4) activesupport (>= 3.1) - rack (1.5.2) + rack (1.6.0) rack-contrib (1.2.0) rack (>= 0.9.1) rack-livereload (0.3.15) rack - rack-rewrite (1.5.0) + rack-rewrite (1.5.1) rack-ssl-enforcer (0.2.8) - rack-test (0.6.2) + rack-test (0.6.3) rack (>= 1.0) rb-fsevent (0.9.4) rb-inotify (0.9.5) ffi (>= 0.5.0) - redcarpet (3.2.0) + redcarpet (3.2.2) ref (1.0.5) - rouge (1.7.3) - sass (3.4.8) + rouge (1.7.7) + sass (3.4.10) sprockets (2.12.3) hike (~> 1.2) multi_json (~> 1.0) @@ -144,7 +148,7 @@ GEM tilt (~> 1.1, != 1.3.0) sprockets-helpers (1.1.0) sprockets (~> 2.0) - sprockets-sass (1.2.0) + sprockets-sass (1.3.1) sprockets (~> 2.0) tilt (~> 1.1) therubyracer (0.12.1) @@ -161,8 +165,8 @@ GEM hitimes tzinfo (1.2.2) thread_safe (~> 0.1) - uber (0.0.11) - uglifier (2.5.3) + uber (0.0.13) + uglifier (2.7.0) execjs (>= 0.3.0) json (>= 1.8.0) diff --git a/website/source/docs/providers/aws/index.html.markdown b/website/source/docs/providers/aws/index.html.markdown index ec4a52881..499914149 100644 --- a/website/source/docs/providers/aws/index.html.markdown +++ b/website/source/docs/providers/aws/index.html.markdown @@ -35,11 +35,10 @@ resource "aws_instance" "web" { The following arguments are supported: * `access_key` - (Required) This is the AWS access key. It must be provided, but - it can also be sourced from the `AWS_ACCESS_KEY` environment variable. + it can also be sourced from the `AWS_ACCESS_KEY_ID` environment variable. * `secret_key` - (Required) This is the AWS secret key. It must be provided, but - it can also be sourced from the `AWS_SECRET_KEY` environment variable. + it can also be sourced from the `AWS_SECRET_ACCESS_KEY` environment variable. * `region` - (Required) This is the AWS region. It must be provided, but - it can also be sourced from the `AWS_REGION` environment variables. - + it can also be sourced from the `AWS_DEFAULT_REGION` environment variables.