Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix issues with regional endpoints and add integ tests #2994

Merged
merged 2 commits into from
Dec 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changes/next-release/bugfix-Endpoint-d580bc63.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "bugfix",
"category": "Endpoint",
"description": "fix bug in regional endpoints and add more tests"
}
8 changes: 8 additions & 0 deletions features/s3/buckets.feature
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,14 @@ Feature: Working with Buckets
When I delete the bucket
Then the bucket should not exist

@us-east-1-regional-endpoint
Scenario: Support us-east-1 regional endpoint
Given I am using the S3 us-east-1 regional endpoint
When I create a bucket
Then the bucket should exist
When I delete the bucket
Then the bucket should not exist

@cors
Scenario: Bucket CORS
When I create a bucket
Expand Down
5 changes: 5 additions & 0 deletions features/s3/step_definitions/buckets.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ module.exports = function() {
callback();
});

this.Given(/^I am using the S3 us-east-1 regional endpoint$/, function(callback) {
this.s3 = new this.AWS.S3({region: 'us-east-1', s3UsEast1RegionalEndpoint: 'regional'});
callback();
});

this.When(/^I create a bucket with the location constraint "([^"]*)"$/, function(location, callback) {
var bucket = this.bucket = this.uniqueName('aws-sdk-js-integration');
var params = {
Expand Down
10 changes: 10 additions & 0 deletions features/sts/step_definitions/sts.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ module.exports = function() {
this.request(null, 'getSessionToken', {DurationSeconds: parseInt(duration)}, callback, false);
});

this.Before('@sts-regional-endpoints', function(callback) {
this.service = new this.AWS.STS({region: 'us-east-1', stsRegionalEndpoints: 'regional'});
callback();
});

this.After('@sts-regional-endpoints', function(callback) {
this.service = new this.AWS.STS();
callback();
})

this.Then(/^the result should contain an access key ID and secret access key$/, function(callback) {
this.assert.compare(this.data.Credentials.AccessKeyId.length, '>', 0);
this.assert.compare(this.data.Credentials.SecretAccessKey.length, '>', 0);
Expand Down
5 changes: 5 additions & 0 deletions features/sts/sts.feature
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,8 @@ Feature: AWS Security Token Service
Scenario: Error handling
Given I get an STS session token with a duration of 60 seconds
Then the error code should be "ValidationError"

@sts-regional-endpoints
Scenario: Get a session token from regional endpoint
Given I get an STS session token with a duration of 900 seconds
Then the result should contain an access key ID and secret access key
12 changes: 12 additions & 0 deletions lib/config.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,18 @@ export abstract class ConfigurationOptions {
* Whether to force path style URLs for S3 objects.
*/
s3ForcePathStyle?: boolean
/**
* when region is set to 'us-east-1', whether to send s3 request to global endpoints
* or 'us-east-1' regional endpoints. This config is only applicable to S3 client;
* Defaults to 'legacy'
*/
s3UsEast1RegionalEndpoint?: "regional"|"legacy"
/**
* whether to override the request region with the region inferred
* from requested resource's ARN. Only available for S3 buckets
* Defaults to `true`
*/
s3UseArnRegion?: boolean
/**
* Whether the signature to sign requests with (overriding the API configuration) is cached.
*/
Expand Down
4 changes: 1 addition & 3 deletions lib/services/s3.js
Original file line number Diff line number Diff line change
Expand Up @@ -375,9 +375,7 @@ AWS.util.update(AWS.S3.prototype, {
var insertPoint = config.endpoint.indexOf('.amazonaws.com');
regionalEndpoint = config.endpoint.substring(0, insertPoint) +
'.us-east-1' + config.endpoint.substring(insertPoint);
var endpoint = req.httpRequest.endpoint;
endpoint.hostname = regionalEndpoint;
endpoint.host = regionalEndpoint;
req.httpRequest.updateEndpoint(regionalEndpoint);
}
},

Expand Down
6 changes: 2 additions & 4 deletions lib/services/sts.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,9 @@ AWS.util.update(AWS.STS.prototype, {
{code: 'ConfigError', message: 'Missing region in config'});
}
var insertPoint = config.endpoint.indexOf('.amazonaws.com');
regionalEndpoint = config.endpoint.substring(0, insertPoint) +
var regionalEndpoint = config.endpoint.substring(0, insertPoint) +
'.' + config.region + config.endpoint.substring(insertPoint);
var endpoint = req.httpRequest.endpoint;
endpoint.hostname = regionalEndpoint;
endpoint.host = regionalEndpoint;
req.httpRequest.updateEndpoint(regionalEndpoint);
req.httpRequest.region = config.region;
}
}
Expand Down
10 changes: 5 additions & 5 deletions scripts/region-checker/whitelist.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ var whitelist = {
370,
376,
748,
750,
869,
746,
867,
880,
881,
882,
887
878,
879,
885
]
};

Expand Down
10 changes: 5 additions & 5 deletions test/services/s3.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3319,18 +3319,18 @@ describe('AWS.S3', function() {
it('according to config settings', function() {
var s3 = new AWS.S3({region: 'us-west-2'});
var request = s3.listBuckets().build(function() {});
expect(request.httpRequest.endpoint.hostname).to.contain('s3.us-west-2.amazonaws.com');
expect(request.httpRequest.endpoint.hostname).to.equal('s3.us-west-2.amazonaws.com');
s3 = new AWS.S3({region: 'us-east-1'});
var request = s3.listBuckets().build(function() {});
expect(request.httpRequest.endpoint.hostname).to.contain('s3.amazonaws.com');
expect(request.httpRequest.endpoint.hostname).to.equal('s3.amazonaws.com');
s3 = new AWS.S3({region: 'us-east-1', s3UsEast1RegionalEndpoint: 'regional'});
request = s3.listBuckets().build(function() {});
expect(request.httpRequest.endpoint.hostname).to.contain('s3.us-east-1.amazonaws.com');
expect(request.httpRequest.endpoint.hostname).to.equal('s3.us-east-1.amazonaws.com');
});
it('should use global endpoints for when config is set to legacy', function() {
s3 = new AWS.S3({region: 'us-east-1', s3UsEast1RegionalEndpoint: 'legacy'});
request = s3.listBuckets().build(function() {});
expect(request.httpRequest.endpoint.hostname).to.contain('s3.amazonaws.com');
expect(request.httpRequest.endpoint.hostname).to.equal('s3.amazonaws.com');
});
it('should not update endpoint if supplied a custom endpoint', function() {
s3 = new AWS.S3({
Expand All @@ -3339,7 +3339,7 @@ describe('AWS.S3', function() {
endpoint: 's3.amazonaws.com'
});
request = s3.listBuckets().build(function() {});
expect(request.httpRequest.endpoint.hostname).to.contain('s3.amazonaws.com');
expect(request.httpRequest.endpoint.hostname).to.equal('s3.amazonaws.com');
});
});
}
Expand Down
12 changes: 6 additions & 6 deletions test/services/sts.spec.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.