**Problem** * While adding e2e tests for AssumeRole functionality, it was noticed that some of the static credential e2e tests were flaky. * The tests would sometimes fail with an AuthFailure. **Solution** * It was discovered that this error happened sometimes after a static credential rotation and that AuthFailure occurs if EC2 is invoked with the wrong credentials. * Due to IAM's eventual consistency model, it can take some time (up to several seconds) for changes, including rotated credentials, to get propagated to all AWS services, including EC2. * The tests were intermittently failing because sometimes the credentials would be propagated in time before invoking EC2 and other times they were not propagated in time. * The fix is to add a retry mechanism when calling DescribeInstances. A 30 second window is defined in which the retries can take place. * The retries happen only for AuthFailures. Any other failure will not trigger a retry. **Testing** * After making this change, the intermittent failures were no longer seen for the e2e tests * The e2e tests cover updating/creating catalogs and sets as well us updating the host list. All pass. * New unit tests were added to test the retry mechanism. Support had to be added to mock a series of DescribeInstances calls vs a single call * New and existing unit tests passed
AWS Plugin for HashiCorp Boundary
This repo contains the aws plugin for HashiCorp Boundary.
Credential Rotation
This is the following priority for the credential chain: static, assume role, environment variables.
Static Credentials
Although static credentials are stored encrypted within Boundary, by default this
plugin will attempt to rotate credentials when they are supplied through the
secrets object. The given credentials will be used to create a new credential,
and then the given credential will be revoked. In this way, after rotation,
only Boundary knows the client secret in use by this plugin. More information
about AWS static credentials can be found here.
Credential rotation can be turned off by setting the
disable_credential_rotation attribute to true.
Assume Role Credentials
This plugin will attempt to assume a role when a role_arn is supplied through the
attributes object. More information about assume an AWS role can be found here. This feature only works when the plugin is running on a self managed Boundary worker.
To discover hosts across multiple AWS accounts, supply a target_role_arn in addition to role_arn. The plugin uses the principal credentials to assume the target role via a two-hop AssumeRole chain, enabling cross-account host discovery from a single worker. See Attributes and Secrets for the full list of target_* attributes.
Environment Credentials
This plugin will attempt to retrieve credentials from environment variables. More information about environment variables for AWS credentials can be found here. This feature only works when the plugin is running on a self managed Boundary worker.
Dynamic Hosts
This plugin supports dynamically sourcing hosts from Amazon EC2.
Host sets created with this plugin define filters which select and group like instances within AWS; these host sets can in turn be added to targets within Boundary as host sources.
At creation, update or deletion of a host catalog of this type, configuration of the plugin is performed via the attribute/secret values passed to the create, update, or delete calls actions. The values passed in to the plugin here are the attributes set on on a host catalog in boundary.
The plugin fetches hosts through the DescribeInstances call.
Storage Bucket
This plugin supports storing and fetching objects from Amazon S3.
Files created with this plugin are stored as objects defined by the bucket name and bucket prefix values configured in the storage bucket resource; these storage bucket resources can in turn be associated to targets within Boundary.
At creation, update or deletion of a storage bucket of this type, configuration of the plugin is performed via the attribute/secret values passed to the create, update, or delete calls actions. The values passed in to the plugin here are the attributes set on on a storage bucket in boundary.
The plugin fetches files through the GetObject call.
The plugin stores files through the PutObject call.
The plugin fetches metadata about the files through the HeadObject call.