Skip to content

Commit 71e97e5

Browse files
authored
Support FIPS for S3 Outposts (#3963)
1 parent e929589 commit 71e97e5

File tree

3 files changed

+43
-19
lines changed

3 files changed

+43
-19
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"type": "feature",
3+
"category": "S3Control",
4+
"description": "Support FIPS for S3 Outposts"
5+
}

lib/services/s3control.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ AWS.util.update(AWS.S3Control.prototype, {
2727
}
2828

2929
if (isArnInBucket || isArnInName) {
30-
request.addListener('validate', s3util.validateArnRegion);
30+
request.addListener('validate', this.validateArnRegion);
3131
request.addListener('validate', this.validateArnAccountWithParams, true);
3232
request.addListener('validate', s3util.validateArnAccount);
3333
request.addListener('validate', s3util.validateArnService);
@@ -98,9 +98,10 @@ AWS.util.update(AWS.S3Control.prototype, {
9898

9999
var endpoint = req.httpRequest.endpoint;
100100
var useArnRegion = req.service.config.s3UseArnRegion;
101+
var useFipsEndpoint = req.service.config.useFipsEndpoint;
101102

102103
endpoint.hostname = [
103-
's3-outposts',
104+
's3-outposts' + (useFipsEndpoint ? '-fips': ''),
104105
useArnRegion ? parsedArn.region : req.service.config.region,
105106
'amazonaws.com'
106107
].join('.');
@@ -112,8 +113,9 @@ AWS.util.update(AWS.S3Control.prototype, {
112113
*/
113114
populateEndpointForOutpostId: function populateEndpointForOutpostId(req) {
114115
var endpoint = req.httpRequest.endpoint;
116+
var useFipsEndpoint = req.service.config.useFipsEndpoint;
115117
endpoint.hostname = [
116-
's3-outposts',
118+
's3-outposts' + (useFipsEndpoint ? '-fips': ''),
117119
req.service.config.region,
118120
'amazonaws.com'
119121
].join('.');
@@ -131,6 +133,13 @@ AWS.util.update(AWS.S3Control.prototype, {
131133
}
132134
},
133135

136+
/**
137+
* @api private
138+
*/
139+
validateArnRegion: function validateArnRegion(req) {
140+
s3util.validateArnRegion(req, { allowFipsEndpoint: true });
141+
},
142+
134143
/**
135144
* @api private
136145
*/

test/services/s3control.spec.js

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ describe('AWS.S3Control', function() {
205205
});
206206
});
207207

208-
it('should correctly generate access point endpoint for pseudo regions', function() {
208+
it('should correctly generate access point endpoint for s3-external-1', function() {
209209
var client = new AWS.S3Control({region: 'us-east-1'});
210210
helpers.mockHttpResponse(200, {}, '');
211211
var request = client.getBucket({
@@ -215,22 +215,32 @@ describe('AWS.S3Control', function() {
215215
expect(
216216
built.httpRequest.endpoint.hostname
217217
).to.equal('s3-outposts.s3-external-1.amazonaws.com');
218+
});
218219

219-
var testFipsError = (client) => {
220-
helpers.mockHttpResponse(200, {}, '');
221-
request = client.getBucket({
222-
Bucket: 'arn:aws:s3-outposts:s3-external-1:123456789012:outpost/op-01234567890123456/bucket/mybucket'
223-
});
224-
var error;
225-
request.build(function(err) {
226-
error = err;
227-
});
228-
expect(error.name).to.equal('InvalidConfiguration');
229-
expect(error.message).to.equal('ARN endpoint is not compatible with FIPS region');
230-
};
231-
testFipsError(new AWS.S3Control({region: 'fips-us-east-1'}));
232-
testFipsError(new AWS.S3Control({region: 'us-east-1-fips'}));
233-
testFipsError(new AWS.S3Control({region: 'us-east-1', useFipsEndpoint: true}));
220+
it('should correctly generate access point endpoint when useFipsEndpoint=true', function() {
221+
var client = new AWS.S3Control({region: 'us-gov-west-1', useFipsEndpoint: true});
222+
helpers.mockHttpResponse(200, {}, '');
223+
var request = client.getBucket({
224+
Bucket: 'arn:aws:s3-outposts:us-gov-west-1:123456789012:outpost/op-01234567890123456/bucket/mybucket'
225+
});
226+
var built = request.build(function() {});
227+
expect(
228+
built.httpRequest.endpoint.hostname
229+
).to.equal('s3-outposts-fips.us-gov-west-1.amazonaws.com');
230+
});
231+
232+
it('should throw when fips region is passed in ARN', function() {
233+
var client = new AWS.S3Control({region: 'us-gov-west-1', useFipsEndpoint: true});
234+
helpers.mockHttpResponse(200, {}, '');
235+
var request = client.getBucket({
236+
Bucket: 'arn:aws:s3-outposts:fips-us-gov-west-1:123456789012:outpost/op-01234567890123456/bucket/mybucket'
237+
});
238+
var error;
239+
request.build(function(err) {
240+
error = err;
241+
});
242+
expect(error.name).to.equal('InvalidConfiguration');
243+
expect(error.message).to.equal('FIPS region not allowed in ARN');
234244
});
235245

236246
it('should use regions from ARN if s3UseArnRegion config is set to false', function(done) {

0 commit comments

Comments
 (0)