Skip to content

Commit e5c320f

Browse files
authored
fix(searchable): enforce TLS 1.2 on Elasticsearch domains (v1 transformer) (#3456)
## Description The v1 `graphql-elasticsearch-transformer` creates Elasticsearch domains without any `DomainEndpointOptions` — no `EnforceHTTPS`, no `TLSSecurityPolicy`. AWS is deprecating TLS 1.0/1.1 support on April 20, 2026. Adds `DomainEndpointOptions` with `TLSSecurityPolicy: Policy-Min-TLS-1-2-2019-07` to the domain. Does NOT add `EnforceHTTPS` to avoid breaking customers currently using HTTP. Uses `as any` cast because `cloudform-types@4.2.0` lacks the `DomainEndpointOptions` type, but CloudFormation supports it. Related: aws-amplify/amplify-cli#14329 ### Changes - `packages/graphql-elasticsearch-transformer/src/resources.ts` — Added `DomainEndpointOptions` with `TLSSecurityPolicy` to `makeElasticsearchDomain()` - `packages/graphql-elasticsearch-transformer/src/__tests__/SearchableModelTransformer.test.ts` — Added TLS 1.2 assertion test ### CDK / CloudFormation Parameters Changed `AWS::Elasticsearch::Domain` → `DomainEndpointOptions.TLSSecurityPolicy` set to `Policy-Min-TLS-1-2-2019-07` (previously no `DomainEndpointOptions` at all) ### Validation - Unit tests: 7/7 pass - E2E: [batch 406490ab](https://us-east-1.console.aws.amazon.com/codesuite/codebuild/594813022831/projects/amplify-category-api-e2e-workflow/batch/amplify-category-api-e2e-workflow:406490ab-0d9d-4145-b1f0-e7b728838512?region=us-east-1) — 69/82 passed, all 3 searchable tests passed, failures are pre-existing (auth/schema) - Companion V2 fix: category-api/opensearch-tls-1-2-support (PR against main) ### Checklist - [x] `yarn test` passes - [x] Tests are changed or added - [x] CDK/CloudFormation parameter changes called out - [x] E2E test run linked
1 parent e8f0aee commit e5c320f

2 files changed

Lines changed: 36 additions & 1 deletion

File tree

packages/graphql-elasticsearch-transformer/src/__tests__/SearchableModelTransformer.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,35 @@ test('SearchableModelTransformer with external versioning', () => {
145145
expect(out.resolvers[expectedSearchResponseResolver]).toBeDefined();
146146
expect(out.resolvers[expectedSearchResponseResolver]).toMatchSnapshot();
147147
});
148+
149+
describe('Elasticsearch domain TLS configuration', () => {
150+
test('enforces HTTPS with TLS 1.2 on the Elasticsearch domain', () => {
151+
const validSchema = `
152+
type Post @model @searchable {
153+
id: ID!
154+
title: String!
155+
createdAt: String
156+
updatedAt: String
157+
}
158+
`;
159+
const transformer = new GraphQLTransform({
160+
transformers: [new DynamoDBModelTransformer(), new SearchableModelTransformer()],
161+
featureFlags,
162+
});
163+
const out = transformer.transform(validSchema);
164+
expect(out).toBeDefined();
165+
166+
const searchableStack = out.stacks['SearchableStack'];
167+
expect(searchableStack).toBeDefined();
168+
expect(searchableStack.Resources).toBeDefined();
169+
170+
const esDomain = searchableStack.Resources!['ElasticSearchDomain'];
171+
expect(esDomain).toBeDefined();
172+
expect(esDomain.Type).toEqual('AWS::Elasticsearch::Domain');
173+
174+
const domainEndpointOptions = esDomain.Properties.DomainEndpointOptions;
175+
expect(domainEndpointOptions).toBeDefined();
176+
expect(domainEndpointOptions.EnforceHTTPS).toBeUndefined();
177+
expect(domainEndpointOptions.TLSSecurityPolicy).toBe('Policy-Min-TLS-1-2-2019-07');
178+
});
179+
});

packages/graphql-elasticsearch-transformer/src/resources.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,9 @@ export class ResourceFactory {
494494
return new Elasticsearch.Domain({
495495
DomainName: this.domainName(),
496496
ElasticsearchVersion: '6.2',
497+
DomainEndpointOptions: {
498+
TLSSecurityPolicy: 'Policy-Min-TLS-1-2-2019-07',
499+
},
497500
ElasticsearchClusterConfig: {
498501
ZoneAwarenessEnabled: false,
499502
InstanceCount: Fn.Ref(ResourceConstants.PARAMETERS.ElasticsearchInstanceCount),
@@ -504,7 +507,7 @@ export class ResourceFactory {
504507
VolumeType: 'gp2',
505508
VolumeSize: Fn.Ref(ResourceConstants.PARAMETERS.ElasticsearchEBSVolumeGB),
506509
},
507-
});
510+
} as any);
508511
}
509512

510513
/**

0 commit comments

Comments
 (0)