├── .github └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .npmignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── bin └── search.ts ├── build ├── build.sh └── transform.py ├── cdk.context.json ├── cdk.json ├── functions └── es-requests │ └── es-requests.js ├── img ├── cfn_outputs.png ├── create_user.png ├── example_dashboard.png ├── switch_tenants_1.png ├── switch_tenants_2.png └── user_admin_group.png ├── lib ├── dashboard.ndjson ├── index-template.json └── search-stack.ts ├── package-lock.json ├── package.json └── tsconfig.json /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | ---- 3 | 4 | *By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.* 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.js 2 | !functions/** 3 | !jest.config.js 4 | *.d.ts 5 | node_modules 6 | 7 | # CDK asset staging directory 8 | .cdk.staging 9 | cdk.out 10 | 11 | 12 | packaged.yaml 13 | synth.yaml 14 | .DS_Store 15 | .aws-sam 16 | samconfig.toml 17 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.ts 2 | !*.d.ts 3 | 4 | # CDK asset staging directory 5 | .cdk.staging 6 | cdk.out 7 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 4 | opensource-codeofconduct@amazon.com with any additional questions or comments. 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional 4 | documentation, we greatly value feedback and contributions from our community. 5 | 6 | Please read through this document before submitting any issues or pull requests to ensure we have all the necessary 7 | information to effectively respond to your bug report or contribution. 8 | 9 | 10 | ## Reporting Bugs/Feature Requests 11 | 12 | We welcome you to use the GitHub issue tracker to report bugs or suggest features. 13 | 14 | When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already 15 | reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: 16 | 17 | * A reproducible test case or series of steps 18 | * The version of our code being used 19 | * Any modifications you've made relevant to the bug 20 | * Anything unusual about your environment or deployment 21 | 22 | 23 | ## Contributing via Pull Requests 24 | Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 25 | 26 | 1. You are working against the latest source on the *master* branch. 27 | 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 28 | 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. 29 | 30 | To send us a pull request, please: 31 | 32 | 1. Fork the repository. 33 | 2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 34 | 3. Ensure local tests pass. 35 | 4. Commit to your fork using clear commit messages. 36 | 5. Send us a pull request, answering any default questions in the pull request interface. 37 | 6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. 38 | 39 | GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and 40 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 41 | 42 | 43 | ## Finding contributions to work on 44 | Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start. 45 | 46 | 47 | ## Code of Conduct 48 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 49 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 50 | opensource-codeofconduct@amazon.com with any additional questions or comments. 51 | 52 | 53 | ## Security issue notifications 54 | If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. 55 | 56 | 57 | ## Licensing 58 | 59 | See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. 60 | 61 | We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software is furnished to do so. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 10 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 11 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 12 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 13 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Launch Amazon Elasticsearch Service with Amazon Cognito User Pools 2 | 3 | To get started with [Amazon Elasticsearch Service](https://aws.amazon.com/elasticsearch-service/) (Amazon ES), you must have a concept for authentication and authorization for your search cluster. In addition to an IP-based access policy or a proxy server to protect your search cluster, you can leverage AWS Identity and Access Management (IAM) with Amazon Cognito User Pools to authenticate and authorize users. You can configure this using the AWS Management Console or the AWS Command Line Interface (AWS CLI). More information on configuration can be found in the [Amazon Cognito Authentication for Kibana documentation](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-cognito-auth.html). 4 | 5 | An Infrastructure-as-Code approach allows you to complete deployment and configuration in a safe, repeatable manner, so you can build and rebuild your search cluster automatically. 6 | 7 | This is the sample code for the concepts described in the blog post [Launch Amazon Elasticsearch Service with Amazon Cognito User Pools](https://aws.amazon.com/blogs/field-notes/launch-amazon-elasticsearch-service-with-amazon-cognito-user-pools/). It contains a [AWS Cloud Development Kit](https://aws.amazon.com/cdk/) (AWS CDK) template for the fully automated provisioning of the Amazon ES and Amazon Cognito resources, as well as your first search index and Kibana dashboard. The template structure is also applicable if you prefer to use AWS CloudFormation. 8 | 9 | ## Get Started 10 | 11 | Deploy the sample template from the AWS Serverless Application Repository: 12 | 13 | [![cloudformation-launch-button](https://s3.amazonaws.com/cloudformation-examples/cloudformation-launch-stack.png)](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:387304072572:applications~amazon-elasticsearch-service-with-cognito) 14 | 15 | ## Deploy the template from code 16 | 17 | The template provisions an Amazon Elasticsearch Service cluster in a fully automated way. The search cluster consists of a single `t3.small.elasticsearch` instance with 10GB of EBS storage. It is integrated with Amazon Cognito User Pools so you only need to add your user(s). The template also configures an example Kibana dashboard and an Amazon ES index template. 18 | 19 | The template prefixes the search domain and the Amazon Cognito Hosted UI with a string that you can define with the `applicationPrefix` template parameter. 20 | 21 | You can either deploy the template with AWS CloudFormation or CDK. Both options require you to install and configure the [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) and the [CDK](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html). 22 | 23 | The CDK template is written in TypeScript. TypeScript sources must be compiled to JavaScript initially and after each modification. Open a new terminal and keep this terminal open in the background if you like to change the source files. Change the directory to the one where `cdk.json` is and execute: 24 | 25 | ```bash 26 | npm install 27 | npm run watch 28 | ``` 29 | 30 | Read the [CDK developer guide](https://docs.aws.amazon.com/cdk/latest/guide/home.html) for more information. 31 | ### Deployment using CDK 32 | 33 | Create or update the application with `cdk deploy`. 34 | 35 | ```bash 36 | cdk deploy -c applicationPrefix= 37 | ``` 38 | 39 | ### Access the Example Dashboard 40 | 41 | As soon as the application is deployed completely the outputs of the AWS CloudFormation stack provides the links for the next steps. You will find two URLs in the AWS CloudFormation console called `createUserUrl` and `kibanaUrl`. 42 | 43 | ![AWS CloudFormation outputs](img/cfn_outputs.png) 44 | 45 | * Use the `createUserUrl` link from the outputs, or navigate to the Amazon Cognito user pool in the console to create a new user in the pool. **Enter an email address as username and email**. **Enter a temporary password** of your choice with at least 8 characters. Leave the phone number empty and **uncheck the checkbox to mark the phone number as verified**. If you like you can check the checkboxes to send an invitation to the new user or to make the user verify the email address. Then choose **Create user**. 46 | 47 | ![Create the user in the Amazon Cognito user pool](img/create_user.png) 48 | 49 | * The user has access restricted to the `logs-tenant`. If you want to provide full access control, including security management permissions, add the user to the `es-admins` group: 50 | 51 | ![Add the user to the es-admins group](img/user_admin_group.png) 52 | 53 | * Access the Kibana dashboard with the `kibanaUrl` link from the outputs, or navigate to the Kibana link displayed in the Amazon Elasticsearch Service console. 54 | 55 | * In Kibana, go to the tenant selection by choosing the **user menu** on the top right. Choose **Switch tenants**: 56 | 57 | ![User menu](img/switch_tenants_1.png) 58 | 59 | * Choose the `logs-tenant` that has been created during the launch of the application. Choose **Confirm**. 60 | 61 | ![User menu](img/switch_tenants_2.png) 62 | 63 | * Choose the **navigation menu** on top left and choose **Dashboard**. Choose the **Example Dashboard**. The dashboard contains instructions to add new documents to the search index and to visualize the documents with the graph in the dashboard. 64 | 65 | ![Screenshot of the example dashboard](img/example_dashboard.png) 66 | 67 | ## Cleaning Up 68 | 69 | To avoid incurring charges, delete the AWS CloudFormation stack when you are finished experimenting via `cdk destroy` in the directory where `cdk.json` is: 70 | 71 | ```bash 72 | cdk destroy 73 | ``` 74 | 75 | Or delete the AWS CloudFormation stack manually: 76 | 77 | * Sign in to the AWS CloudFormation console and choose your stack. 78 | * Choose **Delete** to delete all resources, including the search cluster and the Amazon Cognito user pool. 79 | 80 | ## FAQs 81 | 82 | ### Q: In which region can I deploy the sample application? 83 | 84 | The Launch Stack button above opens the AWS Serverless Application Repository in the US East 1 (Northern Virginia) region. You may switch to other regions from there before deployment. 85 | 86 | ### Q: How much do resources in this template cost? 87 | 88 | Standard AWS charges apply to the resources you deploy with this template. 89 | 90 | Amazon Elasticsearch Service provides customers in the [AWS Free Tier](https://aws.amazon.com/free/) free usage of up to 750 hours per month of the configuration in this template, i.e. a single-AZ `t3.small.elasticsearch` instance and 10GB of EBS storage for up to one year from the date the account was created. If you exceed the free tier limits, you will be charged the Amazon Elasticsearch Service rates for the additional resources you use. 91 | 92 | The Amazon Cognito User Pool feature has a free tier of 50,000 monthly active users for users who sign in directly to Cognito User Pools. The free tier does not automatically expire at the end of your 12 month AWS Free Tier term, and it is available to both existing and new AWS customers indefinitely. 93 | 94 | See offer terms of [Amazon Cognito](https://aws.amazon.com/cognito/pricing/) and [Amazon Elasticsearch Service](https://aws.amazon.com/elasticsearch-service/pricing/) for more details. 95 | ### Q: How can I add a new question to this list? 96 | 97 | If you found yourself wishing this set of frequently asked questions had an answer for a particular problem, please [submit a pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/). The chances are good that others will also benefit from having the answer listed here. 98 | 99 | ### Q: How can I contribute? 100 | 101 | See the [Contributing Guidelines](CONTRIBUTING.md) for details. 102 | 103 | ## License 104 | 105 | This library is licensed under the MIT-0 License. See the [LICENSE](LICENSE) file. 106 | -------------------------------------------------------------------------------- /bin/search.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import 'source-map-support/register'; 3 | import cdk = require('@aws-cdk/core'); 4 | import { SearchStack } from '../lib/search-stack'; 5 | 6 | export const app = new cdk.App(); 7 | new SearchStack(app, 'searchStack'); 8 | -------------------------------------------------------------------------------- /build/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | npm remove -g aws-cdk cdk-assets 4 | npm install -g aws-cdk cdk-assets 5 | npm install 6 | npm run build 7 | cdk synth > /dev/null 8 | 9 | # change assets' locations to the staging bucket 10 | python3 build/transform.py \ 11 | cdk.out/searchStack.assets.json \ 12 | cdk.out/searchStack.template.json \ 13 | package.json \ 14 | $ARTIFACT_BUCKET_NAME \ 15 | $CODEBUILD_BUILD_NUMBER \ 16 | $CODEBUILD_RESOLVED_SOURCE_VERSION 17 | 18 | # publish assets to the bucket written to the assets.json template 19 | cdk-assets publish -p cdk.out/assets.json 20 | 21 | # publish the SAM application 22 | sam publish --template-file cdk.out/template.yaml --region $AWS_DEFAULT_REGION 23 | -------------------------------------------------------------------------------- /build/transform.py: -------------------------------------------------------------------------------- 1 | import yaml, sys, json 2 | from os import path 3 | 4 | def change_asset_destination(doc, bucket): 5 | """ 6 | changes the destination to the bucket, without role assumption 7 | """ 8 | 9 | for asset in doc["files"].values(): 10 | del asset["destinations"]["current_account-current_region"]["assumeRoleArn"] 11 | asset["destinations"]["current_account-current_region"]["bucketName"] = bucket 12 | 13 | def change_template_bucket(doc, bucket): 14 | """ 15 | Replaces bucket names, removes metadata 16 | """ 17 | 18 | for resource, config in doc["Resources"].items(): 19 | if "Code" in config["Properties"]: 20 | config["Properties"]["Code"]["S3Bucket"] = bucket 21 | 22 | if "Content" in config["Properties"]: 23 | config["Properties"]["Content"]["S3Bucket"] = bucket 24 | 25 | del config["Metadata"] 26 | 27 | def main(assets, template, package, bucket, build_no, commit): 28 | 29 | # read assets file 30 | with open(assets) as input_file: 31 | asset_doc = yaml.safe_load(input_file) 32 | 33 | change_asset_destination(asset_doc, bucket) 34 | 35 | # write transformed assets file 36 | with open(path.join(path.dirname(input_file.name), 'assets.json'), 'w') as output_file: 37 | json.dump(asset_doc, output_file, sort_keys=False) 38 | 39 | # read template file 40 | with open(template) as input_file: 41 | template_doc = yaml.safe_load(input_file) 42 | 43 | change_template_bucket(template_doc, bucket) 44 | 45 | template_doc["Transform"] = "AWS::Serverless-2016-10-31" 46 | del template_doc["Resources"]["CDKMetadata"] 47 | del template_doc["Conditions"] 48 | del template_doc["Rules"] 49 | del template_doc["Parameters"]["BootstrapVersion"] 50 | 51 | commit_short = commit[:6] 52 | 53 | # read package file 54 | with open(package) as package_file: 55 | package_doc = yaml.safe_load(package_file) 56 | 57 | sem_ver = ("%s+%s.%s" % (package_doc["version"], build_no, commit_short)) 58 | 59 | template_doc["Metadata"] = { 60 | "AWS::ServerlessRepo::Application": { 61 | "Name": package_doc["name"], 62 | "Description": package_doc["description"], 63 | "Author": package_doc["author"]["name"], 64 | "SpdxLicenseId": package_doc["license"], 65 | "HomePageUrl": package_doc["homepage"], 66 | "SourceCodeUrl": ("%s/tree/%s" % (package_doc["homepage"], commit_short)), 67 | "SemanticVersion": sem_ver 68 | } 69 | } 70 | with open(path.join(path.dirname(input_file.name), 'template.yaml'), 'w') as output_file: 71 | yaml.dump(template_doc, output_file, sort_keys=False) 72 | 73 | if __name__ == "__main__": 74 | assets = sys.argv[1] 75 | template = sys.argv[2] 76 | package = sys.argv[3] 77 | bucket = sys.argv[4] 78 | build_no = sys.argv[5] 79 | commit = sys.argv[6] 80 | main(assets, template, package, bucket, build_no, commit) 81 | -------------------------------------------------------------------------------- /cdk.context.json: -------------------------------------------------------------------------------- 1 | { 2 | "@aws-cdk/core:enableStackNameDuplicates": "true" 3 | } 4 | -------------------------------------------------------------------------------- /cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "npx ts-node bin/search.ts", 3 | "context": { 4 | "@aws-cdk/core:newStyleStackSynthesis": true 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /functions/es-requests/es-requests.js: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. 2 | // SPDX-License-Identifier: MIT-0 3 | const AWS = require('aws-sdk'); 4 | 5 | const region = process.env.REGION; 6 | const domain = process.env.DOMAIN; 7 | 8 | function handleSuccess(response) { 9 | if (response.status >= 200 && response.status < 300) { 10 | console.log("Successful request:", response); 11 | } else { 12 | throw new Error("Request failed: " + JSON.stringify(response)); 13 | } 14 | } 15 | 16 | exports.handler = async function (event, _context) { 17 | console.log({ event }); 18 | 19 | const requestType = event.RequestType; 20 | 21 | if (requestType === "Create" || requestType === "Update") { 22 | const requests = event.ResourceProperties.requests; 23 | // run the promises sequentially 24 | var requestSuccessful = true; 25 | await requests.reduce(async (previousPromise, request) => { 26 | console.log({ request }) 27 | return previousPromise 28 | .then(_result => { return sendDocument(request.method, request.path, request.body, request.securitytenant, request.filename) }) 29 | .then(handleSuccess); 30 | }, Promise.resolve()) 31 | .catch(error => { 32 | console.log({ error }); 33 | requestSuccessful = false; 34 | }); 35 | 36 | if (!requestSuccessful) { 37 | throw new Error("One of the requests failed, see logs"); 38 | } 39 | } 40 | }; 41 | 42 | /** 43 | * Derived from https://github.com/awsdocs/amazon-elasticsearch-service-developer-guide/blob/master/doc_source/es-request-signing.md#node 44 | */ 45 | function sendDocument(httpMethod, path, document, securitytenant, filename) { 46 | return new Promise(function (resolve, reject) { 47 | console.log({ httpMethod, path, document }); 48 | 49 | var endpoint = new AWS.Endpoint(domain); 50 | var request = new AWS.HttpRequest(endpoint, region); 51 | 52 | // if this is a kibana request 53 | // add a xsrf header 54 | if (path.startsWith("_plugin/kibana/")) { 55 | request.headers['kbn-xsrf'] = 'kibana'; 56 | } 57 | 58 | request.path += path; 59 | request.method = httpMethod; 60 | const payload = []; 61 | 62 | if (typeof securitytenant === 'string') { 63 | request.headers['securitytenant'] = securitytenant; 64 | } 65 | 66 | if (typeof filename === 'string') { 67 | const boundary = "----MyBoundary"; 68 | request.headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`; 69 | payload.push(`--${boundary}`, 70 | `Content-Disposition: form-data; name="file"; filename="${filename}"`, 71 | `Content-Type: application/octet-stream`, 72 | "", 73 | document, 74 | "", 75 | `--${boundary}--`); 76 | } else { 77 | request.headers['Content-Type'] = 'application/json'; 78 | if (typeof document === 'string') { 79 | payload.push(document); 80 | } else if (typeof document === 'object') { 81 | payload.push(JSON.stringify(document)); 82 | } 83 | } 84 | 85 | request.body = payload.join("\r\n"); 86 | 87 | request.headers['host'] = domain; 88 | // Content-Length is only needed for DELETE requests that include a request 89 | // body, but including it for all requests doesn't seem to hurt anything. 90 | request.headers['Content-Length'] = Buffer.byteLength(request.body); 91 | 92 | var credentials = new AWS.EnvironmentCredentials('AWS'); 93 | var signer = new AWS.Signers.V4(request, 'es'); 94 | signer.addAuthorization(credentials, new Date()); 95 | 96 | var client = new AWS.HttpClient(); 97 | client.handleRequest(request, null, function (response) { 98 | var responseBody = ''; 99 | response.on('data', function (chunk) { 100 | responseBody += chunk; 101 | }); 102 | response.on('end', function (_chunk) { 103 | resolve({ "status": response.statusCode, "body": responseBody }); 104 | }); 105 | }, function (error) { 106 | reject(error); 107 | }); 108 | }); 109 | } 110 | -------------------------------------------------------------------------------- /img/cfn_outputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/amazon-elasticsearch-service-with-cognito/3a3a4a66133f85e48eff8173c2af5cdd45f0031b/img/cfn_outputs.png -------------------------------------------------------------------------------- /img/create_user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/amazon-elasticsearch-service-with-cognito/3a3a4a66133f85e48eff8173c2af5cdd45f0031b/img/create_user.png -------------------------------------------------------------------------------- /img/example_dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/amazon-elasticsearch-service-with-cognito/3a3a4a66133f85e48eff8173c2af5cdd45f0031b/img/example_dashboard.png -------------------------------------------------------------------------------- /img/switch_tenants_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/amazon-elasticsearch-service-with-cognito/3a3a4a66133f85e48eff8173c2af5cdd45f0031b/img/switch_tenants_1.png -------------------------------------------------------------------------------- /img/switch_tenants_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/amazon-elasticsearch-service-with-cognito/3a3a4a66133f85e48eff8173c2af5cdd45f0031b/img/switch_tenants_2.png -------------------------------------------------------------------------------- /img/user_admin_group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/amazon-elasticsearch-service-with-cognito/3a3a4a66133f85e48eff8173c2af5cdd45f0031b/img/user_admin_group.png -------------------------------------------------------------------------------- /lib/dashboard.ndjson: -------------------------------------------------------------------------------- 1 | {"attributes":{"fields":"[{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"temperature\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","timeFieldName":"timestamp","title":"logs-*"},"id":"d9bda310-114d-11eb-a3ce-1d703b366825","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2020-10-18T14:26:04.537Z","version":"WzMsMV0="} 2 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\n \"query\": {\n \"query\": \"\",\n \"language\": \"kuery\"\n },\n \"filter\": [],\n \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"\n}"},"title":"Example Graph","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Example Graph\",\"type\":\"line\",\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Average temperature\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"Average temperature\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"temperature\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"timestamp\",\"useNormalizedEsInterval\":true,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}}}]}"},"id":"f5e6efd0-2e52-11ea-a276-c5724fe7e4f3","migrationVersion":{"visualization":"7.7.0"},"references":[{"id":"d9bda310-114d-11eb-a3ce-1d703b366825","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-10-18T17:34:08.781Z","version":"WzcsMV0="} 3 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"title":"Example Instructions","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Example Instructions\",\"type\":\"markdown\",\"params\":{\"fontSize\":12,\"openLinksInNewTab\":false,\"markdown\":\"# Welcome\\n\\nThis is an example dashboard which has been created by the `amazon-elasticsearch-service-with-cognito` template.\\n\\nYou can now add a new doc to the index by using the [Kibana Dev Tools](#/dev_tools/console) to issue the following request:\\n\\n```\\nPOST logs-2020-01/_doc\\n{\\n \\\"temperature\\\": \\\"5\\\",\\n \\\"timestamp\\\": \\\"2020-01-03T17:00:00.00+0000\\\"\\n}\\n```\\n\\nAfter you posted the doc, come back to this dashboard, and adjust the time range on the top right to see the new data.\"},\"aggs\":[]}"},"id":"16f7f1a0-2e54-11ea-a276-c5724fe7e4f3","migrationVersion":{"visualization":"7.7.0"},"references":[],"type":"visualization","updated_at":"2020-10-18T17:39:40.197Z","version":"WzExLDFd"} 4 | {"attributes":{"description":"Example dashboard as created by the amazon-elasticsearch-service-with-cognito template.","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"embeddableConfig\":{},\"gridData\":{\"x\":24,\"y\":0,\"w\":24,\"h\":18,\"i\":\"1\"},\"panelIndex\":\"1\",\"version\":\"7.3.0\",\"panelRefName\":\"panel_0\"},{\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":18,\"i\":\"2\"},\"version\":\"7.3.0\",\"panelIndex\":\"2\",\"embeddableConfig\":{},\"panelRefName\":\"panel_1\"}]","timeRestore":false,"title":"Example Dashboard","version":1},"id":"1f9d0990-2e53-11ea-a276-c5724fe7e4f3","migrationVersion":{"dashboard":"7.3.0"},"references":[{"id":"f5e6efd0-2e52-11ea-a276-c5724fe7e4f3","name":"panel_0","type":"visualization"},{"id":"16f7f1a0-2e54-11ea-a276-c5724fe7e4f3","name":"panel_1","type":"visualization"}],"type":"dashboard","updated_at":"2020-10-18T17:34:09.690Z","version":"WzgsMV0="} 5 | {"exportedCount":4,"missingRefCount":0,"missingReferences":[]} -------------------------------------------------------------------------------- /lib/index-template.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_patterns": [ 3 | "logs-*" 4 | ], 5 | "mappings": { 6 | "properties": { 7 | "temperature": { 8 | "type": "long" 9 | }, 10 | "timestamp": { 11 | "type": "date" 12 | } 13 | } 14 | }, 15 | "settings" : { 16 | "number_of_shards" : "1", 17 | "number_of_replicas" : "0" 18 | } 19 | } -------------------------------------------------------------------------------- /lib/search-stack.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. 2 | // SPDX-License-Identifier: MIT-0 3 | 4 | import { Fn, Stack, Construct, StackProps, CfnParameter, CfnOutput, CfnJson, CustomResource, Duration } from '@aws-cdk/core'; 5 | import { AwsCustomResource, AwsCustomResourcePolicy, PhysicalResourceId, Provider } from '@aws-cdk/custom-resources' 6 | import { CfnDomain } from '@aws-cdk/aws-elasticsearch'; 7 | import { CfnUserPoolDomain, CfnIdentityPool, CfnIdentityPoolRoleAttachment, CfnUserPool, CfnUserPoolGroup } from '@aws-cdk/aws-cognito'; 8 | import { Effect, Role, ManagedPolicy, ServicePrincipal, FederatedPrincipal, PolicyStatement } from '@aws-cdk/aws-iam'; 9 | import * as lambda from '@aws-cdk/aws-lambda'; 10 | 11 | import path = require('path'); 12 | import fs = require('fs'); 13 | 14 | export class SearchStack extends Stack { 15 | constructor(scope: Construct, id: string, props?: StackProps) { 16 | 17 | super(scope, id, props); 18 | 19 | const applicationPrefix = new CfnParameter(this, 'applicationPrefix', { 20 | default: this.node.tryGetContext('applicationPrefix'), 21 | description: "Prefix for the Amazon Cognito domain and the Amazon Elasticsearch Service domain", 22 | type: "String", 23 | allowedPattern: "^[a-z0-9]*$", 24 | minLength: 3, 25 | maxLength: 20 26 | }).valueAsString; 27 | 28 | const userPool = new CfnUserPool(this, "userPool", { 29 | adminCreateUserConfig: { 30 | allowAdminCreateUserOnly: true 31 | }, 32 | usernameAttributes: ["email"], 33 | autoVerifiedAttributes: ["email"], 34 | }); 35 | 36 | // get a unique suffix from the last element of the stackId, e.g. 06b321d6b6e2 37 | const suffix = Fn.select(4, Fn.split("-", Fn.select(2, Fn.split("/", this.stackId)))); 38 | 39 | new CfnUserPoolDomain(this, "cognitoDomain", { 40 | domain: applicationPrefix + "-" + suffix, 41 | userPoolId: userPool.ref 42 | }); 43 | 44 | const idPool = new CfnIdentityPool(this, "identityPool", { 45 | allowUnauthenticatedIdentities: false, 46 | cognitoIdentityProviders: [] 47 | }); 48 | 49 | const esLimitedUserRole = new Role(this, "esLimitedUserRole", { 50 | assumedBy: new FederatedPrincipal('cognito-identity.amazonaws.com', { 51 | "StringEquals": { "cognito-identity.amazonaws.com:aud": idPool.ref }, 52 | "ForAnyValue:StringLike": { 53 | "cognito-identity.amazonaws.com:amr": "authenticated" 54 | } 55 | }, "sts:AssumeRoleWithWebIdentity") 56 | }); 57 | 58 | 59 | const esAdminFnRole = new Role(this, "esAdminFnRole", { 60 | assumedBy: new ServicePrincipal('lambda.amazonaws.com') 61 | }); 62 | esAdminFnRole.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole")) 63 | 64 | const esAdminUserRole = new Role(this, "esAdminUserRole", { 65 | assumedBy: 66 | new FederatedPrincipal('cognito-identity.amazonaws.com', { 67 | "StringEquals": { "cognito-identity.amazonaws.com:aud": idPool.ref }, 68 | "ForAnyValue:StringLike": { 69 | "cognito-identity.amazonaws.com:amr": "authenticated" 70 | } 71 | }, "sts:AssumeRoleWithWebIdentity") 72 | }); 73 | 74 | const elasticsearchHttpPolicy = new ManagedPolicy(this, "elasticsearchHttpPolicy", { 75 | roles: [esAdminUserRole, esAdminFnRole] 76 | }); 77 | 78 | new CfnUserPoolGroup(this, "userPoolAdminGroupPool", { 79 | userPoolId: userPool.ref, 80 | groupName: "es-admins", 81 | roleArn: esAdminUserRole.roleArn 82 | }); 83 | 84 | const domainArn = "arn:aws:es:" + this.region + ":" + this.account + ":domain/" + applicationPrefix + "/*" 85 | 86 | elasticsearchHttpPolicy.addStatements(new PolicyStatement({ 87 | effect: Effect.ALLOW, 88 | resources: [domainArn], 89 | actions: ['es:ESHttpPost', 'es:ESHttpGet', 'es:ESHttpPut'] 90 | })); 91 | 92 | const esRole = new Role(this, "esRole", { 93 | assumedBy: new ServicePrincipal('es.amazonaws.com'), 94 | managedPolicies: [ManagedPolicy.fromAwsManagedPolicyName("AmazonESCognitoAccess")] 95 | }); 96 | 97 | const esDomain = new CfnDomain(this, "searchDomain", { 98 | elasticsearchClusterConfig: { instanceType: "t3.small.elasticsearch" }, 99 | ebsOptions: { volumeSize: 10, ebsEnabled: true }, 100 | elasticsearchVersion: "7.9", 101 | domainName: applicationPrefix, 102 | nodeToNodeEncryptionOptions: { enabled: true }, 103 | encryptionAtRestOptions: { enabled: true }, 104 | advancedSecurityOptions: { 105 | enabled: true, 106 | masterUserOptions: { masterUserArn: esAdminFnRole.roleArn } 107 | }, 108 | domainEndpointOptions: { 109 | enforceHttps: true 110 | }, 111 | cognitoOptions: { 112 | enabled: true, 113 | identityPoolId: idPool.ref, 114 | roleArn: esRole.roleArn, 115 | userPoolId: userPool.ref 116 | }, 117 | 118 | // see recommended configuration for fgac 119 | // https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/fgac.html 120 | // don't use this without fgac, vpc support, or ip based restrictions 121 | // as it enables anonymous access 122 | accessPolicies: { 123 | "Version": "2012-10-17", 124 | "Statement": [ 125 | { 126 | "Effect": "Allow", 127 | "Principal": { 128 | "AWS": "*" 129 | }, 130 | "Action": "es:ESHttp*", 131 | "Resource": domainArn 132 | } 133 | ] 134 | } 135 | }); 136 | 137 | const userPoolClients = new AwsCustomResource(this, 'clientIdResource', { 138 | policy: AwsCustomResourcePolicy.fromSdkCalls({ resources: [userPool.attrArn] }), 139 | onCreate: { 140 | service: 'CognitoIdentityServiceProvider', 141 | action: 'listUserPoolClients', 142 | parameters: { 143 | UserPoolId: userPool.ref 144 | }, 145 | physicalResourceId: PhysicalResourceId.of(`ClientId-${applicationPrefix}`) 146 | } 147 | }); 148 | userPoolClients.node.addDependency(esDomain); 149 | 150 | const clientId = userPoolClients.getResponseField('UserPoolClients.0.ClientId'); 151 | const providerName = `cognito-idp.${this.region}.amazonaws.com/${userPool.ref}:${clientId}` 152 | 153 | new CfnIdentityPoolRoleAttachment(this, 'userPoolRoleAttachment', { 154 | identityPoolId: idPool.ref, 155 | roles: { 156 | 'authenticated': esLimitedUserRole.roleArn 157 | }, 158 | roleMappings: new CfnJson(this, 'roleMappingsJson', { 159 | value: { 160 | [providerName]: { 161 | Type: 'Token', 162 | AmbiguousRoleResolution: 'AuthenticatedRole' 163 | } 164 | } 165 | } 166 | ) 167 | }); 168 | 169 | /** 170 | * Function implementing the requests to Amazon Elasticsearch Service 171 | * for the custom resource. 172 | */ 173 | const esRequestsFn = new lambda.Function(this, 'esRequestsFn', { 174 | runtime: lambda.Runtime.NODEJS_14_X, 175 | handler: 'es-requests.handler', 176 | code: lambda.Code.fromAsset(path.join(__dirname, '..', 'functions/es-requests')), 177 | timeout: Duration.seconds(30), 178 | role: esAdminFnRole, 179 | environment: { 180 | "DOMAIN": esDomain.attrDomainEndpoint, 181 | "REGION": this.region 182 | } 183 | }); 184 | 185 | const esRequestProvider = new Provider(this, 'esRequestProvider', { 186 | onEventHandler: esRequestsFn 187 | }); 188 | 189 | 190 | /** 191 | * You can import files exported via Kibana's 192 | * Stack Management -> Save Objects as done with the 193 | * dashboard.ndjson below. 194 | */ 195 | new CustomResource(this, 'esRequestsResource', { 196 | serviceToken: esRequestProvider.serviceToken, 197 | properties: { 198 | requests: [ 199 | { 200 | "method": "PUT", 201 | "path": "_opendistro/_security/api/tenants/logs-tenant", 202 | "body": { 203 | "description": "A tenant for the sample kibana objects." 204 | } 205 | }, 206 | { 207 | "method": "PUT", 208 | "path": "_opendistro/_security/api/rolesmapping/all_access", 209 | "body": { 210 | "backend_roles": [ 211 | esAdminUserRole.roleArn, 212 | esAdminFnRole.roleArn 213 | ], 214 | "hosts": [], 215 | "users": [] 216 | } 217 | }, 218 | { 219 | "method": "PUT", 220 | "path": "_opendistro/_security/api/rolesmapping/security_manager", 221 | "body": { 222 | "backend_roles": [ 223 | esAdminFnRole.roleArn, 224 | esAdminUserRole.roleArn 225 | ], 226 | "hosts": [], 227 | "users": [] 228 | } 229 | }, 230 | { 231 | "method": "PUT", 232 | "path": "_template/example-index-template", 233 | "body": fs.readFileSync(path.join(__dirname, "index-template.json")).toString() 234 | }, 235 | { 236 | "method": "POST", 237 | "path": "_plugin/kibana/api/saved_objects/_import?overwrite=true", 238 | "body": fs.readFileSync(path.join(__dirname, "dashboard.ndjson")).toString(), 239 | "securitytenant": "logs-tenant", 240 | "filename": "dashboard.ndjson" 241 | }, 242 | { 243 | "method": "PUT", 244 | "path": "_opendistro/_security/api/roles/logs-role", 245 | "body": 246 | { 247 | "cluster_permissions": [ 248 | "cluster_composite_ops", 249 | "cluster_monitor" 250 | ], 251 | "index_permissions": [{ 252 | "index_patterns": [ 253 | "logs-*" 254 | ], 255 | "dls": "", 256 | "fls": [], 257 | "masked_fields": [], 258 | "allowed_actions": [ 259 | "crud", 260 | "create_index" 261 | ] 262 | }], 263 | "tenant_permissions": [{ 264 | "tenant_patterns": [ 265 | "logs-tenant" 266 | ], 267 | "allowed_actions": [ 268 | "kibana_all_write" 269 | ] 270 | }] 271 | } 272 | }, 273 | { 274 | "method": "PUT", 275 | "path": "_opendistro/_security/api/rolesmapping/logs-role", 276 | "body": { 277 | "backend_roles": [ 278 | esLimitedUserRole.roleArn 279 | ], 280 | "hosts": [], 281 | "users": [] 282 | } 283 | }, 284 | { 285 | "method": "PUT", 286 | "path": "_opendistro/_security/api/rolesmapping/kibana_user", 287 | "body": { 288 | "backend_roles": [ 289 | esLimitedUserRole.roleArn 290 | ], 291 | "hosts": [], 292 | "users": [] 293 | } 294 | } 295 | ] 296 | } 297 | }); 298 | 299 | new CfnOutput(this, 'createUserUrl', { 300 | description: "Create a new user in the user pool here - add it to the es-admins group if fine grained access controls should not apply.", 301 | value: "https://" + this.region + ".console.aws.amazon.com/cognito/users?region=" + this.region + "#/pool/" + userPool.ref + "/users" 302 | }); 303 | 304 | new CfnOutput(this, 'kibanaUrl', { 305 | description: "Access Kibana via this URL.", 306 | value: "https://" + esDomain.attrDomainEndpoint + "/_plugin/kibana/" 307 | }); 308 | 309 | } 310 | } 311 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "amazon-elasticsearch-service-with-cognito", 3 | "version": "1.1.4", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "amazon-elasticsearch-service-with-cognito", 9 | "version": "1.1.4", 10 | "license": "MIT-0", 11 | "dependencies": { 12 | "@aws-cdk/aws-cloudformation": "^1.108.1", 13 | "@aws-cdk/aws-cognito": "^1.108.1", 14 | "@aws-cdk/aws-elasticsearch": "^1.108.1", 15 | "@aws-cdk/aws-sam": "^1.108.1", 16 | "@aws-cdk/core": "^1.108.1", 17 | "@types/yaml": "^1.2.0", 18 | "aws-sdk": "^2.1354.0", 19 | "source-map-support": "^0.5.16" 20 | }, 21 | "bin": { 22 | "search": "bin/search.js" 23 | }, 24 | "devDependencies": { 25 | "@types/node": "14.17.1", 26 | "aws-cdk": "^1.108.1", 27 | "ts-node": "10.0.0", 28 | "typescript": "4.3.2" 29 | } 30 | }, 31 | "node_modules/@aws-cdk/assets": { 32 | "version": "1.198.1", 33 | "resolved": "https://registry.npmjs.org/@aws-cdk/assets/-/assets-1.198.1.tgz", 34 | "integrity": "sha512-SBEMniYL2HS5RfCPastfgREQxPt72PoyY5Lk0oNLa40YZlxbeMFEAQbxzZMlqiujwtMDcEA+EXDAdIfdhc6YzQ==", 35 | "dependencies": { 36 | "@aws-cdk/core": "1.198.1", 37 | "@aws-cdk/cx-api": "1.198.1", 38 | "constructs": "^3.3.69" 39 | }, 40 | "engines": { 41 | "node": ">= 14.15.0" 42 | }, 43 | "peerDependencies": { 44 | "@aws-cdk/core": "1.198.1", 45 | "@aws-cdk/cx-api": "1.198.1", 46 | "constructs": "^3.3.69" 47 | } 48 | }, 49 | "node_modules/@aws-cdk/aws-acmpca": { 50 | "version": "1.198.1", 51 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-acmpca/-/aws-acmpca-1.198.1.tgz", 52 | "integrity": "sha512-jtCcP4ApVhXpCc+Fe68xUxppskM5zoJtcPJ87zXUNXA2Fsp6s6iCwCaUMPB2ifadbJzOJQFndv5DrKMH2hLKog==", 53 | "dependencies": { 54 | "@aws-cdk/core": "1.198.1", 55 | "constructs": "^3.3.69" 56 | }, 57 | "engines": { 58 | "node": ">= 14.15.0" 59 | }, 60 | "peerDependencies": { 61 | "@aws-cdk/core": "1.198.1", 62 | "constructs": "^3.3.69" 63 | } 64 | }, 65 | "node_modules/@aws-cdk/aws-applicationautoscaling": { 66 | "version": "1.198.1", 67 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.198.1.tgz", 68 | "integrity": "sha512-f3BDhpJdy5Z6LVOm+YaXFiQTtj0IdL4YdfYrDJ0ye7yUbJVEfu6jp6ZHbovA7ULAxc5Y8fEFyRfH63JKCDezfg==", 69 | "dependencies": { 70 | "@aws-cdk/aws-autoscaling-common": "1.198.1", 71 | "@aws-cdk/aws-cloudwatch": "1.198.1", 72 | "@aws-cdk/aws-iam": "1.198.1", 73 | "@aws-cdk/core": "1.198.1", 74 | "constructs": "^3.3.69" 75 | }, 76 | "engines": { 77 | "node": ">= 14.15.0" 78 | }, 79 | "peerDependencies": { 80 | "@aws-cdk/aws-autoscaling-common": "1.198.1", 81 | "@aws-cdk/aws-cloudwatch": "1.198.1", 82 | "@aws-cdk/aws-iam": "1.198.1", 83 | "@aws-cdk/core": "1.198.1", 84 | "constructs": "^3.3.69" 85 | } 86 | }, 87 | "node_modules/@aws-cdk/aws-autoscaling-common": { 88 | "version": "1.198.1", 89 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.198.1.tgz", 90 | "integrity": "sha512-0fQuVIuiYjPT5mgvYbmYXLUcimOQNFp+3lGD/V4NCnDjc4BYRzG21xmvUBdYAu9ObCRjHmIjKZr5fzs2/HnYdw==", 91 | "dependencies": { 92 | "@aws-cdk/aws-iam": "1.198.1", 93 | "@aws-cdk/core": "1.198.1", 94 | "constructs": "^3.3.69" 95 | }, 96 | "engines": { 97 | "node": ">= 14.15.0" 98 | }, 99 | "peerDependencies": { 100 | "@aws-cdk/aws-iam": "1.198.1", 101 | "@aws-cdk/core": "1.198.1", 102 | "constructs": "^3.3.69" 103 | } 104 | }, 105 | "node_modules/@aws-cdk/aws-certificatemanager": { 106 | "version": "1.198.1", 107 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.198.1.tgz", 108 | "integrity": "sha512-uosVq4IGgi4oFsd7fpZeMUeHPlP53eURfDaIt5BW6OrDzQ1EfjtaJaMGKcGj3t6UfbMEz8JroR0S8hvfBKgysw==", 109 | "dependencies": { 110 | "@aws-cdk/aws-acmpca": "1.198.1", 111 | "@aws-cdk/aws-cloudwatch": "1.198.1", 112 | "@aws-cdk/aws-iam": "1.198.1", 113 | "@aws-cdk/aws-lambda": "1.198.1", 114 | "@aws-cdk/aws-route53": "1.198.1", 115 | "@aws-cdk/core": "1.198.1", 116 | "constructs": "^3.3.69" 117 | }, 118 | "engines": { 119 | "node": ">= 14.15.0" 120 | }, 121 | "peerDependencies": { 122 | "@aws-cdk/aws-acmpca": "1.198.1", 123 | "@aws-cdk/aws-cloudwatch": "1.198.1", 124 | "@aws-cdk/aws-iam": "1.198.1", 125 | "@aws-cdk/aws-lambda": "1.198.1", 126 | "@aws-cdk/aws-route53": "1.198.1", 127 | "@aws-cdk/core": "1.198.1", 128 | "constructs": "^3.3.69" 129 | } 130 | }, 131 | "node_modules/@aws-cdk/aws-cloudformation": { 132 | "version": "1.198.1", 133 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.198.1.tgz", 134 | "integrity": "sha512-DnHvkHqR4Oeg3z7mo/EmNUYhWgU+m+CgQW+q5LiKefww9gGMk3dlELCrSoujxeGe+62lHXH9JKVtjxtQ2iOODA==", 135 | "dependencies": { 136 | "@aws-cdk/aws-iam": "1.198.1", 137 | "@aws-cdk/aws-lambda": "1.198.1", 138 | "@aws-cdk/aws-s3": "1.198.1", 139 | "@aws-cdk/aws-sns": "1.198.1", 140 | "@aws-cdk/core": "1.198.1", 141 | "@aws-cdk/cx-api": "1.198.1", 142 | "constructs": "^3.3.69" 143 | }, 144 | "engines": { 145 | "node": ">= 14.15.0" 146 | }, 147 | "peerDependencies": { 148 | "@aws-cdk/aws-iam": "1.198.1", 149 | "@aws-cdk/aws-lambda": "1.198.1", 150 | "@aws-cdk/aws-s3": "1.198.1", 151 | "@aws-cdk/aws-sns": "1.198.1", 152 | "@aws-cdk/core": "1.198.1", 153 | "@aws-cdk/cx-api": "1.198.1", 154 | "constructs": "^3.3.69" 155 | } 156 | }, 157 | "node_modules/@aws-cdk/aws-cloudwatch": { 158 | "version": "1.198.1", 159 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.198.1.tgz", 160 | "integrity": "sha512-l1z/s7ZwiqcNEiNEFliDBJqmKTGz6mCYSrsefimumYK17cx2oIwnMz7QX6G24vJ+qmtjSnwix6BEFPLiTqTNEg==", 161 | "dependencies": { 162 | "@aws-cdk/aws-iam": "1.198.1", 163 | "@aws-cdk/core": "1.198.1", 164 | "constructs": "^3.3.69" 165 | }, 166 | "engines": { 167 | "node": ">= 14.15.0" 168 | }, 169 | "peerDependencies": { 170 | "@aws-cdk/aws-iam": "1.198.1", 171 | "@aws-cdk/core": "1.198.1", 172 | "constructs": "^3.3.69" 173 | } 174 | }, 175 | "node_modules/@aws-cdk/aws-codeguruprofiler": { 176 | "version": "1.198.1", 177 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.198.1.tgz", 178 | "integrity": "sha512-ptpIgRziuK9Up1EzHm0+NB5okuI79EprFv16BiG6zQllaGiuWrFXfbHPucnQHpiJ4clFB+6/Sn/4LjcbAvNVDA==", 179 | "dependencies": { 180 | "@aws-cdk/aws-iam": "1.198.1", 181 | "@aws-cdk/core": "1.198.1", 182 | "constructs": "^3.3.69" 183 | }, 184 | "engines": { 185 | "node": ">= 14.15.0" 186 | }, 187 | "peerDependencies": { 188 | "@aws-cdk/aws-iam": "1.198.1", 189 | "@aws-cdk/core": "1.198.1", 190 | "constructs": "^3.3.69" 191 | } 192 | }, 193 | "node_modules/@aws-cdk/aws-codestarnotifications": { 194 | "version": "1.198.1", 195 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codestarnotifications/-/aws-codestarnotifications-1.198.1.tgz", 196 | "integrity": "sha512-MOr4EOoPz6UL2nCMILEF9ZCTXbsJitLFr8iO7OpUJpaQiI3+u1RKJAk5oNmJI/qR2zq39O1MFwGGanhafO9jpA==", 197 | "dependencies": { 198 | "@aws-cdk/core": "1.198.1", 199 | "constructs": "^3.3.69" 200 | }, 201 | "engines": { 202 | "node": ">= 14.15.0" 203 | }, 204 | "peerDependencies": { 205 | "@aws-cdk/core": "1.198.1", 206 | "constructs": "^3.3.69" 207 | } 208 | }, 209 | "node_modules/@aws-cdk/aws-cognito": { 210 | "version": "1.198.1", 211 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cognito/-/aws-cognito-1.198.1.tgz", 212 | "integrity": "sha512-3H+M0WN0BjYisVqwg0XXVX7Oz7CKgB9u6fcV/EVlBNokQU/xculF4SZ2z+qptVBGpFxWBnbC2m0qgtYFK5eCbQ==", 213 | "bundleDependencies": [ 214 | "punycode" 215 | ], 216 | "dependencies": { 217 | "@aws-cdk/aws-certificatemanager": "1.198.1", 218 | "@aws-cdk/aws-iam": "1.198.1", 219 | "@aws-cdk/aws-kms": "1.198.1", 220 | "@aws-cdk/aws-lambda": "1.198.1", 221 | "@aws-cdk/core": "1.198.1", 222 | "@aws-cdk/custom-resources": "1.198.1", 223 | "constructs": "^3.3.69", 224 | "punycode": "^2.3.0" 225 | }, 226 | "engines": { 227 | "node": ">= 14.15.0" 228 | }, 229 | "peerDependencies": { 230 | "@aws-cdk/aws-certificatemanager": "1.198.1", 231 | "@aws-cdk/aws-iam": "1.198.1", 232 | "@aws-cdk/aws-kms": "1.198.1", 233 | "@aws-cdk/aws-lambda": "1.198.1", 234 | "@aws-cdk/core": "1.198.1", 235 | "@aws-cdk/custom-resources": "1.198.1", 236 | "constructs": "^3.3.69" 237 | } 238 | }, 239 | "node_modules/@aws-cdk/aws-cognito/node_modules/punycode": { 240 | "version": "2.3.0", 241 | "inBundle": true, 242 | "license": "MIT", 243 | "engines": { 244 | "node": ">=6" 245 | } 246 | }, 247 | "node_modules/@aws-cdk/aws-ec2": { 248 | "version": "1.198.1", 249 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ec2/-/aws-ec2-1.198.1.tgz", 250 | "integrity": "sha512-4kgrBzkTRfn8ZlcKH6Kn85aBVJVr6oLBADSmLtgsi4yi4p5u7rgO9eTRl1FTbmGdBkNfoIFG7fnNUS6utK4ttg==", 251 | "dependencies": { 252 | "@aws-cdk/aws-cloudwatch": "1.198.1", 253 | "@aws-cdk/aws-iam": "1.198.1", 254 | "@aws-cdk/aws-kms": "1.198.1", 255 | "@aws-cdk/aws-logs": "1.198.1", 256 | "@aws-cdk/aws-s3": "1.198.1", 257 | "@aws-cdk/aws-s3-assets": "1.198.1", 258 | "@aws-cdk/aws-ssm": "1.198.1", 259 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 260 | "@aws-cdk/core": "1.198.1", 261 | "@aws-cdk/cx-api": "1.198.1", 262 | "@aws-cdk/region-info": "1.198.1", 263 | "constructs": "^3.3.69" 264 | }, 265 | "engines": { 266 | "node": ">= 14.15.0" 267 | }, 268 | "peerDependencies": { 269 | "@aws-cdk/aws-cloudwatch": "1.198.1", 270 | "@aws-cdk/aws-iam": "1.198.1", 271 | "@aws-cdk/aws-kms": "1.198.1", 272 | "@aws-cdk/aws-logs": "1.198.1", 273 | "@aws-cdk/aws-s3": "1.198.1", 274 | "@aws-cdk/aws-s3-assets": "1.198.1", 275 | "@aws-cdk/aws-ssm": "1.198.1", 276 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 277 | "@aws-cdk/core": "1.198.1", 278 | "@aws-cdk/cx-api": "1.198.1", 279 | "@aws-cdk/region-info": "1.198.1", 280 | "constructs": "^3.3.69" 281 | } 282 | }, 283 | "node_modules/@aws-cdk/aws-ecr": { 284 | "version": "1.198.1", 285 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr/-/aws-ecr-1.198.1.tgz", 286 | "integrity": "sha512-Bz8WjN3gSFlMOVqjmq5E1Tg8LLM2ayYJuXbbqD43Xp8R9P321gGfEfvy7G09enZ68/0Og/nFisAMDqFaAzhpgw==", 287 | "dependencies": { 288 | "@aws-cdk/aws-events": "1.198.1", 289 | "@aws-cdk/aws-iam": "1.198.1", 290 | "@aws-cdk/aws-kms": "1.198.1", 291 | "@aws-cdk/core": "1.198.1", 292 | "constructs": "^3.3.69" 293 | }, 294 | "engines": { 295 | "node": ">= 14.15.0" 296 | }, 297 | "peerDependencies": { 298 | "@aws-cdk/aws-events": "1.198.1", 299 | "@aws-cdk/aws-iam": "1.198.1", 300 | "@aws-cdk/aws-kms": "1.198.1", 301 | "@aws-cdk/core": "1.198.1", 302 | "constructs": "^3.3.69" 303 | } 304 | }, 305 | "node_modules/@aws-cdk/aws-ecr-assets": { 306 | "version": "1.198.1", 307 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.198.1.tgz", 308 | "integrity": "sha512-EK2Pcn3Ds7VplfPDpopkOeZwHyQ8wTVS34LwcsGmEWqhweeOV85iFA24uiJ8abN+3hZUXpMNexp8QhsPedUz1Q==", 309 | "dependencies": { 310 | "@aws-cdk/assets": "1.198.1", 311 | "@aws-cdk/aws-ecr": "1.198.1", 312 | "@aws-cdk/aws-iam": "1.198.1", 313 | "@aws-cdk/aws-s3": "1.198.1", 314 | "@aws-cdk/core": "1.198.1", 315 | "@aws-cdk/cx-api": "1.198.1", 316 | "constructs": "^3.3.69" 317 | }, 318 | "engines": { 319 | "node": ">= 14.15.0" 320 | }, 321 | "peerDependencies": { 322 | "@aws-cdk/assets": "1.198.1", 323 | "@aws-cdk/aws-ecr": "1.198.1", 324 | "@aws-cdk/aws-iam": "1.198.1", 325 | "@aws-cdk/aws-s3": "1.198.1", 326 | "@aws-cdk/core": "1.198.1", 327 | "@aws-cdk/cx-api": "1.198.1", 328 | "constructs": "^3.3.69" 329 | } 330 | }, 331 | "node_modules/@aws-cdk/aws-efs": { 332 | "version": "1.198.1", 333 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-efs/-/aws-efs-1.198.1.tgz", 334 | "integrity": "sha512-iS9Y04fe+OacZRpywuHcuY4VUMegfgZB+2LhkOIpZsSbmi1HUJaNeTuO9A4wwdzH14R7RdD/KmcWwfY4OAVYBg==", 335 | "dependencies": { 336 | "@aws-cdk/aws-ec2": "1.198.1", 337 | "@aws-cdk/aws-iam": "1.198.1", 338 | "@aws-cdk/aws-kms": "1.198.1", 339 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 340 | "@aws-cdk/core": "1.198.1", 341 | "@aws-cdk/cx-api": "1.198.1", 342 | "constructs": "^3.3.69" 343 | }, 344 | "engines": { 345 | "node": ">= 14.15.0" 346 | }, 347 | "peerDependencies": { 348 | "@aws-cdk/aws-ec2": "1.198.1", 349 | "@aws-cdk/aws-iam": "1.198.1", 350 | "@aws-cdk/aws-kms": "1.198.1", 351 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 352 | "@aws-cdk/core": "1.198.1", 353 | "@aws-cdk/cx-api": "1.198.1", 354 | "constructs": "^3.3.69" 355 | } 356 | }, 357 | "node_modules/@aws-cdk/aws-elasticsearch": { 358 | "version": "1.198.1", 359 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-elasticsearch/-/aws-elasticsearch-1.198.1.tgz", 360 | "integrity": "sha512-KoFjCuusWaueciYAOEz8RbMMzwuTOlmYNDZ5in0IWiC246QLNxNrOL3Xox+/bYtJ1WGh4nRlja9f9SZ18hWQ9w==", 361 | "dependencies": { 362 | "@aws-cdk/aws-certificatemanager": "1.198.1", 363 | "@aws-cdk/aws-cloudwatch": "1.198.1", 364 | "@aws-cdk/aws-ec2": "1.198.1", 365 | "@aws-cdk/aws-iam": "1.198.1", 366 | "@aws-cdk/aws-kms": "1.198.1", 367 | "@aws-cdk/aws-logs": "1.198.1", 368 | "@aws-cdk/aws-route53": "1.198.1", 369 | "@aws-cdk/aws-secretsmanager": "1.198.1", 370 | "@aws-cdk/core": "1.198.1", 371 | "@aws-cdk/custom-resources": "1.198.1", 372 | "constructs": "^3.3.69" 373 | }, 374 | "engines": { 375 | "node": ">= 14.15.0" 376 | }, 377 | "peerDependencies": { 378 | "@aws-cdk/aws-certificatemanager": "1.198.1", 379 | "@aws-cdk/aws-cloudwatch": "1.198.1", 380 | "@aws-cdk/aws-ec2": "1.198.1", 381 | "@aws-cdk/aws-iam": "1.198.1", 382 | "@aws-cdk/aws-kms": "1.198.1", 383 | "@aws-cdk/aws-logs": "1.198.1", 384 | "@aws-cdk/aws-route53": "1.198.1", 385 | "@aws-cdk/aws-secretsmanager": "1.198.1", 386 | "@aws-cdk/core": "1.198.1", 387 | "@aws-cdk/custom-resources": "1.198.1", 388 | "constructs": "^3.3.69" 389 | } 390 | }, 391 | "node_modules/@aws-cdk/aws-events": { 392 | "version": "1.198.1", 393 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-events/-/aws-events-1.198.1.tgz", 394 | "integrity": "sha512-vhiwZh2YKBzqnPgTHP29ZCAF7v1MwKdlGgyGXpiXkagqDeV9dKhhdse8c7kPSk50lWMyq83j05fm0HSe2p34EQ==", 395 | "dependencies": { 396 | "@aws-cdk/aws-iam": "1.198.1", 397 | "@aws-cdk/core": "1.198.1", 398 | "constructs": "^3.3.69" 399 | }, 400 | "engines": { 401 | "node": ">= 14.15.0" 402 | }, 403 | "peerDependencies": { 404 | "@aws-cdk/aws-iam": "1.198.1", 405 | "@aws-cdk/core": "1.198.1", 406 | "constructs": "^3.3.69" 407 | } 408 | }, 409 | "node_modules/@aws-cdk/aws-iam": { 410 | "version": "1.198.1", 411 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-iam/-/aws-iam-1.198.1.tgz", 412 | "integrity": "sha512-1rKqbnLPRlAzWXLDV2VnRi4k1SYSIzfcoIZmMY7DT1GAznojJgul48ZuVFQHNBlFiQwcTyRahjQahprNrv3y7g==", 413 | "dependencies": { 414 | "@aws-cdk/core": "1.198.1", 415 | "@aws-cdk/cx-api": "1.198.1", 416 | "@aws-cdk/region-info": "1.198.1", 417 | "constructs": "^3.3.69" 418 | }, 419 | "engines": { 420 | "node": ">= 14.15.0" 421 | }, 422 | "peerDependencies": { 423 | "@aws-cdk/core": "1.198.1", 424 | "@aws-cdk/region-info": "1.198.1", 425 | "constructs": "^3.3.69" 426 | } 427 | }, 428 | "node_modules/@aws-cdk/aws-kms": { 429 | "version": "1.198.1", 430 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-kms/-/aws-kms-1.198.1.tgz", 431 | "integrity": "sha512-XtJLEVQyvPrqF7kQs+brCvC6JBb8QJPl6Ok27HG2LiZb66J+hOce4qfdeaPQAe7NF9t0K16SjyHs8ViRqfNvuA==", 432 | "dependencies": { 433 | "@aws-cdk/aws-iam": "1.198.1", 434 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 435 | "@aws-cdk/core": "1.198.1", 436 | "@aws-cdk/cx-api": "1.198.1", 437 | "constructs": "^3.3.69" 438 | }, 439 | "engines": { 440 | "node": ">= 14.15.0" 441 | }, 442 | "peerDependencies": { 443 | "@aws-cdk/aws-iam": "1.198.1", 444 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 445 | "@aws-cdk/core": "1.198.1", 446 | "@aws-cdk/cx-api": "1.198.1", 447 | "constructs": "^3.3.69" 448 | } 449 | }, 450 | "node_modules/@aws-cdk/aws-lambda": { 451 | "version": "1.198.1", 452 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda/-/aws-lambda-1.198.1.tgz", 453 | "integrity": "sha512-4hpK762sLiI536iilYdPJZMHC+sMcn35YQW741Y0fOSPrYbL3ppjjQlPGc+G6oLhOObY3YhvC5RZxXjdlS1ybQ==", 454 | "dependencies": { 455 | "@aws-cdk/aws-applicationautoscaling": "1.198.1", 456 | "@aws-cdk/aws-cloudwatch": "1.198.1", 457 | "@aws-cdk/aws-codeguruprofiler": "1.198.1", 458 | "@aws-cdk/aws-ec2": "1.198.1", 459 | "@aws-cdk/aws-ecr": "1.198.1", 460 | "@aws-cdk/aws-ecr-assets": "1.198.1", 461 | "@aws-cdk/aws-efs": "1.198.1", 462 | "@aws-cdk/aws-events": "1.198.1", 463 | "@aws-cdk/aws-iam": "1.198.1", 464 | "@aws-cdk/aws-kms": "1.198.1", 465 | "@aws-cdk/aws-logs": "1.198.1", 466 | "@aws-cdk/aws-s3": "1.198.1", 467 | "@aws-cdk/aws-s3-assets": "1.198.1", 468 | "@aws-cdk/aws-signer": "1.198.1", 469 | "@aws-cdk/aws-sns": "1.198.1", 470 | "@aws-cdk/aws-sqs": "1.198.1", 471 | "@aws-cdk/core": "1.198.1", 472 | "@aws-cdk/cx-api": "1.198.1", 473 | "@aws-cdk/region-info": "1.198.1", 474 | "constructs": "^3.3.69" 475 | }, 476 | "engines": { 477 | "node": ">= 14.15.0" 478 | }, 479 | "peerDependencies": { 480 | "@aws-cdk/aws-applicationautoscaling": "1.198.1", 481 | "@aws-cdk/aws-cloudwatch": "1.198.1", 482 | "@aws-cdk/aws-codeguruprofiler": "1.198.1", 483 | "@aws-cdk/aws-ec2": "1.198.1", 484 | "@aws-cdk/aws-ecr": "1.198.1", 485 | "@aws-cdk/aws-ecr-assets": "1.198.1", 486 | "@aws-cdk/aws-efs": "1.198.1", 487 | "@aws-cdk/aws-events": "1.198.1", 488 | "@aws-cdk/aws-iam": "1.198.1", 489 | "@aws-cdk/aws-kms": "1.198.1", 490 | "@aws-cdk/aws-logs": "1.198.1", 491 | "@aws-cdk/aws-s3": "1.198.1", 492 | "@aws-cdk/aws-s3-assets": "1.198.1", 493 | "@aws-cdk/aws-signer": "1.198.1", 494 | "@aws-cdk/aws-sns": "1.198.1", 495 | "@aws-cdk/aws-sqs": "1.198.1", 496 | "@aws-cdk/core": "1.198.1", 497 | "@aws-cdk/cx-api": "1.198.1", 498 | "@aws-cdk/region-info": "1.198.1", 499 | "constructs": "^3.3.69" 500 | } 501 | }, 502 | "node_modules/@aws-cdk/aws-logs": { 503 | "version": "1.198.1", 504 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-logs/-/aws-logs-1.198.1.tgz", 505 | "integrity": "sha512-OFp523XM9ertQnwHsYF0lmS1jH3hn9ujFbEax+gGqEi4mH6ATr8Z7k5qgBgSR5qJmbE9DLlaGu6XjCPr7/oQXQ==", 506 | "dependencies": { 507 | "@aws-cdk/aws-cloudwatch": "1.198.1", 508 | "@aws-cdk/aws-iam": "1.198.1", 509 | "@aws-cdk/aws-kms": "1.198.1", 510 | "@aws-cdk/aws-s3-assets": "1.198.1", 511 | "@aws-cdk/core": "1.198.1", 512 | "@aws-cdk/cx-api": "1.198.1", 513 | "constructs": "^3.3.69" 514 | }, 515 | "engines": { 516 | "node": ">= 14.15.0" 517 | }, 518 | "peerDependencies": { 519 | "@aws-cdk/aws-cloudwatch": "1.198.1", 520 | "@aws-cdk/aws-iam": "1.198.1", 521 | "@aws-cdk/aws-kms": "1.198.1", 522 | "@aws-cdk/aws-s3-assets": "1.198.1", 523 | "@aws-cdk/core": "1.198.1", 524 | "@aws-cdk/cx-api": "1.198.1", 525 | "constructs": "^3.3.69" 526 | } 527 | }, 528 | "node_modules/@aws-cdk/aws-route53": { 529 | "version": "1.198.1", 530 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-route53/-/aws-route53-1.198.1.tgz", 531 | "integrity": "sha512-qu6BV/YZnm1LLqUxI+Krz6JP4yNZiXkc6w9pMq45U9cdIi+yptvp19DMvQVxE1oi8afKki3cIvcwJuwrLgtAGA==", 532 | "dependencies": { 533 | "@aws-cdk/aws-ec2": "1.198.1", 534 | "@aws-cdk/aws-iam": "1.198.1", 535 | "@aws-cdk/aws-logs": "1.198.1", 536 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 537 | "@aws-cdk/core": "1.198.1", 538 | "@aws-cdk/custom-resources": "1.198.1", 539 | "constructs": "^3.3.69" 540 | }, 541 | "engines": { 542 | "node": ">= 14.15.0" 543 | }, 544 | "peerDependencies": { 545 | "@aws-cdk/aws-ec2": "1.198.1", 546 | "@aws-cdk/aws-iam": "1.198.1", 547 | "@aws-cdk/aws-logs": "1.198.1", 548 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 549 | "@aws-cdk/core": "1.198.1", 550 | "@aws-cdk/custom-resources": "1.198.1", 551 | "constructs": "^3.3.69" 552 | } 553 | }, 554 | "node_modules/@aws-cdk/aws-s3": { 555 | "version": "1.198.1", 556 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3/-/aws-s3-1.198.1.tgz", 557 | "integrity": "sha512-MAxaI4m4dtLP8koj2hErxYgwDWPuqpERmuEuqP6drzrmwnQ6YoQwpRKzPsnmtMgNHA4q6YDir//OuK5we238aw==", 558 | "dependencies": { 559 | "@aws-cdk/aws-events": "1.198.1", 560 | "@aws-cdk/aws-iam": "1.198.1", 561 | "@aws-cdk/aws-kms": "1.198.1", 562 | "@aws-cdk/core": "1.198.1", 563 | "@aws-cdk/cx-api": "1.198.1", 564 | "constructs": "^3.3.69" 565 | }, 566 | "engines": { 567 | "node": ">= 14.15.0" 568 | }, 569 | "peerDependencies": { 570 | "@aws-cdk/aws-events": "1.198.1", 571 | "@aws-cdk/aws-iam": "1.198.1", 572 | "@aws-cdk/aws-kms": "1.198.1", 573 | "@aws-cdk/core": "1.198.1", 574 | "@aws-cdk/cx-api": "1.198.1", 575 | "constructs": "^3.3.69" 576 | } 577 | }, 578 | "node_modules/@aws-cdk/aws-s3-assets": { 579 | "version": "1.198.1", 580 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.198.1.tgz", 581 | "integrity": "sha512-jTu9Lgi1OsH749iI4HDltKUdoVHv/k363z8Wy0krFgIteZyftb9FBsZAPxFWzYQPcSp3QyjevwyKteu9fKYGHA==", 582 | "dependencies": { 583 | "@aws-cdk/assets": "1.198.1", 584 | "@aws-cdk/aws-iam": "1.198.1", 585 | "@aws-cdk/aws-kms": "1.198.1", 586 | "@aws-cdk/aws-s3": "1.198.1", 587 | "@aws-cdk/core": "1.198.1", 588 | "@aws-cdk/cx-api": "1.198.1", 589 | "constructs": "^3.3.69" 590 | }, 591 | "engines": { 592 | "node": ">= 14.15.0" 593 | }, 594 | "peerDependencies": { 595 | "@aws-cdk/assets": "1.198.1", 596 | "@aws-cdk/aws-iam": "1.198.1", 597 | "@aws-cdk/aws-kms": "1.198.1", 598 | "@aws-cdk/aws-s3": "1.198.1", 599 | "@aws-cdk/core": "1.198.1", 600 | "@aws-cdk/cx-api": "1.198.1", 601 | "constructs": "^3.3.69" 602 | } 603 | }, 604 | "node_modules/@aws-cdk/aws-sam": { 605 | "version": "1.198.1", 606 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sam/-/aws-sam-1.198.1.tgz", 607 | "integrity": "sha512-rvhlcVXL5Qv/Eo726CWalEbs+4aDFHw76jlubGFG1+rbRcH0aLwPFhAtnSZ2lyZFAeFZu94Bk41mKqiQtowKkw==", 608 | "dependencies": { 609 | "@aws-cdk/core": "1.198.1", 610 | "constructs": "^3.3.69" 611 | }, 612 | "engines": { 613 | "node": ">= 14.15.0" 614 | }, 615 | "peerDependencies": { 616 | "@aws-cdk/core": "1.198.1", 617 | "constructs": "^3.3.69" 618 | } 619 | }, 620 | "node_modules/@aws-cdk/aws-secretsmanager": { 621 | "version": "1.198.1", 622 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-secretsmanager/-/aws-secretsmanager-1.198.1.tgz", 623 | "integrity": "sha512-q5jvAsrwBGm11FmK+/clV5Z3u9vGR5fE6zN/Mg/sRt3mYFWpvI7tDuNgxI3Ci/53IgvrhWSD/rytnM0IdYEoog==", 624 | "dependencies": { 625 | "@aws-cdk/aws-ec2": "1.198.1", 626 | "@aws-cdk/aws-iam": "1.198.1", 627 | "@aws-cdk/aws-kms": "1.198.1", 628 | "@aws-cdk/aws-lambda": "1.198.1", 629 | "@aws-cdk/aws-sam": "1.198.1", 630 | "@aws-cdk/core": "1.198.1", 631 | "@aws-cdk/cx-api": "1.198.1", 632 | "constructs": "^3.3.69" 633 | }, 634 | "engines": { 635 | "node": ">= 14.15.0" 636 | }, 637 | "peerDependencies": { 638 | "@aws-cdk/aws-ec2": "1.198.1", 639 | "@aws-cdk/aws-iam": "1.198.1", 640 | "@aws-cdk/aws-kms": "1.198.1", 641 | "@aws-cdk/aws-lambda": "1.198.1", 642 | "@aws-cdk/aws-sam": "1.198.1", 643 | "@aws-cdk/core": "1.198.1", 644 | "@aws-cdk/cx-api": "1.198.1", 645 | "constructs": "^3.3.69" 646 | } 647 | }, 648 | "node_modules/@aws-cdk/aws-signer": { 649 | "version": "1.198.1", 650 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-signer/-/aws-signer-1.198.1.tgz", 651 | "integrity": "sha512-x7nQhKqWjqqTwWHjbuVK378fvnINsbDGopzFdY20zMdRe5w6LURHVqAg1+iEPbSpP4QCEYu0wGbm0puysGrl9w==", 652 | "dependencies": { 653 | "@aws-cdk/core": "1.198.1", 654 | "constructs": "^3.3.69" 655 | }, 656 | "engines": { 657 | "node": ">= 14.15.0" 658 | }, 659 | "peerDependencies": { 660 | "@aws-cdk/core": "1.198.1", 661 | "constructs": "^3.3.69" 662 | } 663 | }, 664 | "node_modules/@aws-cdk/aws-sns": { 665 | "version": "1.198.1", 666 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sns/-/aws-sns-1.198.1.tgz", 667 | "integrity": "sha512-vPsbQJ1IO7zFtL5daomrHLmQTRijMWK5GrXND5uqYgBh/WoWnWTbWbL+SeFV1kcAydAphkKbWLUYd/MeOUfztw==", 668 | "dependencies": { 669 | "@aws-cdk/aws-cloudwatch": "1.198.1", 670 | "@aws-cdk/aws-codestarnotifications": "1.198.1", 671 | "@aws-cdk/aws-events": "1.198.1", 672 | "@aws-cdk/aws-iam": "1.198.1", 673 | "@aws-cdk/aws-kms": "1.198.1", 674 | "@aws-cdk/aws-sqs": "1.198.1", 675 | "@aws-cdk/core": "1.198.1", 676 | "constructs": "^3.3.69" 677 | }, 678 | "engines": { 679 | "node": ">= 14.15.0" 680 | }, 681 | "peerDependencies": { 682 | "@aws-cdk/aws-cloudwatch": "1.198.1", 683 | "@aws-cdk/aws-codestarnotifications": "1.198.1", 684 | "@aws-cdk/aws-events": "1.198.1", 685 | "@aws-cdk/aws-iam": "1.198.1", 686 | "@aws-cdk/aws-kms": "1.198.1", 687 | "@aws-cdk/aws-sqs": "1.198.1", 688 | "@aws-cdk/core": "1.198.1", 689 | "constructs": "^3.3.69" 690 | } 691 | }, 692 | "node_modules/@aws-cdk/aws-sqs": { 693 | "version": "1.198.1", 694 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sqs/-/aws-sqs-1.198.1.tgz", 695 | "integrity": "sha512-sTeypZK/guNAMeNF0ibFc90Gnpl3nP1CPAwpkO1h1/y6Q9enxs/WHN9BoR+qK+121GnjfzB5R46MITQhNkvo7Q==", 696 | "dependencies": { 697 | "@aws-cdk/aws-cloudwatch": "1.198.1", 698 | "@aws-cdk/aws-iam": "1.198.1", 699 | "@aws-cdk/aws-kms": "1.198.1", 700 | "@aws-cdk/core": "1.198.1", 701 | "constructs": "^3.3.69" 702 | }, 703 | "engines": { 704 | "node": ">= 14.15.0" 705 | }, 706 | "peerDependencies": { 707 | "@aws-cdk/aws-cloudwatch": "1.198.1", 708 | "@aws-cdk/aws-iam": "1.198.1", 709 | "@aws-cdk/aws-kms": "1.198.1", 710 | "@aws-cdk/core": "1.198.1", 711 | "constructs": "^3.3.69" 712 | } 713 | }, 714 | "node_modules/@aws-cdk/aws-ssm": { 715 | "version": "1.198.1", 716 | "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ssm/-/aws-ssm-1.198.1.tgz", 717 | "integrity": "sha512-a0RU/kv4+7OGdKEVDula34I5j1aEMBlk5CMtV56ttyBbeL/vOIlVV05dM2PDXhCL+QkqRuQ3l9N0tLRL8aUzXw==", 718 | "dependencies": { 719 | "@aws-cdk/aws-iam": "1.198.1", 720 | "@aws-cdk/aws-kms": "1.198.1", 721 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 722 | "@aws-cdk/core": "1.198.1", 723 | "constructs": "^3.3.69" 724 | }, 725 | "engines": { 726 | "node": ">= 14.15.0" 727 | }, 728 | "peerDependencies": { 729 | "@aws-cdk/aws-iam": "1.198.1", 730 | "@aws-cdk/aws-kms": "1.198.1", 731 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 732 | "@aws-cdk/core": "1.198.1", 733 | "constructs": "^3.3.69" 734 | } 735 | }, 736 | "node_modules/@aws-cdk/cloud-assembly-schema": { 737 | "version": "1.198.1", 738 | "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.198.1.tgz", 739 | "integrity": "sha512-DtX7Zw5v9nFQOgkx2eQXmdVRMy2qrUoL1XLy7GxFesUTzdMIgvE0Pc7LJJ3WQK5eVlBiTmV58qSnyPV6nKN3vA==", 740 | "bundleDependencies": [ 741 | "jsonschema", 742 | "semver" 743 | ], 744 | "dependencies": { 745 | "jsonschema": "^1.4.1", 746 | "semver": "^7.3.8" 747 | }, 748 | "engines": { 749 | "node": ">= 14.15.0" 750 | } 751 | }, 752 | "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { 753 | "version": "1.4.1", 754 | "inBundle": true, 755 | "license": "MIT", 756 | "engines": { 757 | "node": "*" 758 | } 759 | }, 760 | "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { 761 | "version": "6.0.0", 762 | "inBundle": true, 763 | "license": "ISC", 764 | "dependencies": { 765 | "yallist": "^4.0.0" 766 | }, 767 | "engines": { 768 | "node": ">=10" 769 | } 770 | }, 771 | "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { 772 | "version": "7.3.8", 773 | "inBundle": true, 774 | "license": "ISC", 775 | "dependencies": { 776 | "lru-cache": "^6.0.0" 777 | }, 778 | "bin": { 779 | "semver": "bin/semver.js" 780 | }, 781 | "engines": { 782 | "node": ">=10" 783 | } 784 | }, 785 | "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { 786 | "version": "4.0.0", 787 | "inBundle": true, 788 | "license": "ISC" 789 | }, 790 | "node_modules/@aws-cdk/core": { 791 | "version": "1.198.1", 792 | "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.198.1.tgz", 793 | "integrity": "sha512-bFqIhMMvtWg4F8X+y0y8oLKUyOyzx1IGBE0e18aP3gfENHGatNK/8EzZZPC7tVAKyt7SNJXuR7NeMBoq92nGbg==", 794 | "bundleDependencies": [ 795 | "fs-extra", 796 | "minimatch", 797 | "@balena/dockerignore", 798 | "ignore" 799 | ], 800 | "dependencies": { 801 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 802 | "@aws-cdk/cx-api": "1.198.1", 803 | "@aws-cdk/region-info": "1.198.1", 804 | "@balena/dockerignore": "^1.0.2", 805 | "constructs": "^3.3.69", 806 | "fs-extra": "^9.1.0", 807 | "ignore": "^5.2.4", 808 | "minimatch": "^3.1.2" 809 | }, 810 | "engines": { 811 | "node": ">= 14.15.0" 812 | }, 813 | "peerDependencies": { 814 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 815 | "@aws-cdk/cx-api": "1.198.1", 816 | "@aws-cdk/region-info": "1.198.1", 817 | "constructs": "^3.3.69" 818 | } 819 | }, 820 | "node_modules/@aws-cdk/core/node_modules/@balena/dockerignore": { 821 | "version": "1.0.2", 822 | "inBundle": true, 823 | "license": "Apache-2.0" 824 | }, 825 | "node_modules/@aws-cdk/core/node_modules/at-least-node": { 826 | "version": "1.0.0", 827 | "inBundle": true, 828 | "license": "ISC", 829 | "engines": { 830 | "node": ">= 4.0.0" 831 | } 832 | }, 833 | "node_modules/@aws-cdk/core/node_modules/balanced-match": { 834 | "version": "1.0.2", 835 | "inBundle": true, 836 | "license": "MIT" 837 | }, 838 | "node_modules/@aws-cdk/core/node_modules/brace-expansion": { 839 | "version": "1.1.11", 840 | "inBundle": true, 841 | "license": "MIT", 842 | "dependencies": { 843 | "balanced-match": "^1.0.0", 844 | "concat-map": "0.0.1" 845 | } 846 | }, 847 | "node_modules/@aws-cdk/core/node_modules/concat-map": { 848 | "version": "0.0.1", 849 | "inBundle": true, 850 | "license": "MIT" 851 | }, 852 | "node_modules/@aws-cdk/core/node_modules/fs-extra": { 853 | "version": "9.1.0", 854 | "inBundle": true, 855 | "license": "MIT", 856 | "dependencies": { 857 | "at-least-node": "^1.0.0", 858 | "graceful-fs": "^4.2.0", 859 | "jsonfile": "^6.0.1", 860 | "universalify": "^2.0.0" 861 | }, 862 | "engines": { 863 | "node": ">=10" 864 | } 865 | }, 866 | "node_modules/@aws-cdk/core/node_modules/graceful-fs": { 867 | "version": "4.2.10", 868 | "inBundle": true, 869 | "license": "ISC" 870 | }, 871 | "node_modules/@aws-cdk/core/node_modules/ignore": { 872 | "version": "5.2.4", 873 | "inBundle": true, 874 | "license": "MIT", 875 | "engines": { 876 | "node": ">= 4" 877 | } 878 | }, 879 | "node_modules/@aws-cdk/core/node_modules/jsonfile": { 880 | "version": "6.1.0", 881 | "inBundle": true, 882 | "license": "MIT", 883 | "dependencies": { 884 | "universalify": "^2.0.0" 885 | }, 886 | "optionalDependencies": { 887 | "graceful-fs": "^4.1.6" 888 | } 889 | }, 890 | "node_modules/@aws-cdk/core/node_modules/minimatch": { 891 | "version": "3.1.2", 892 | "inBundle": true, 893 | "license": "ISC", 894 | "dependencies": { 895 | "brace-expansion": "^1.1.7" 896 | }, 897 | "engines": { 898 | "node": "*" 899 | } 900 | }, 901 | "node_modules/@aws-cdk/core/node_modules/universalify": { 902 | "version": "2.0.0", 903 | "inBundle": true, 904 | "license": "MIT", 905 | "engines": { 906 | "node": ">= 10.0.0" 907 | } 908 | }, 909 | "node_modules/@aws-cdk/custom-resources": { 910 | "version": "1.198.1", 911 | "resolved": "https://registry.npmjs.org/@aws-cdk/custom-resources/-/custom-resources-1.198.1.tgz", 912 | "integrity": "sha512-TngoyqVS8fv+w+L5ra2+RkawLQZCNHzXqPSabf2rjQO98Gk+dAukyhmKoN0bFx3DubkriEhtOx4HlFWWe8QF6g==", 913 | "dependencies": { 914 | "@aws-cdk/aws-cloudformation": "1.198.1", 915 | "@aws-cdk/aws-ec2": "1.198.1", 916 | "@aws-cdk/aws-iam": "1.198.1", 917 | "@aws-cdk/aws-lambda": "1.198.1", 918 | "@aws-cdk/aws-logs": "1.198.1", 919 | "@aws-cdk/aws-sns": "1.198.1", 920 | "@aws-cdk/core": "1.198.1", 921 | "constructs": "^3.3.69" 922 | }, 923 | "engines": { 924 | "node": ">= 14.15.0" 925 | }, 926 | "peerDependencies": { 927 | "@aws-cdk/aws-cloudformation": "1.198.1", 928 | "@aws-cdk/aws-ec2": "1.198.1", 929 | "@aws-cdk/aws-iam": "1.198.1", 930 | "@aws-cdk/aws-lambda": "1.198.1", 931 | "@aws-cdk/aws-logs": "1.198.1", 932 | "@aws-cdk/aws-sns": "1.198.1", 933 | "@aws-cdk/core": "1.198.1", 934 | "constructs": "^3.3.69" 935 | } 936 | }, 937 | "node_modules/@aws-cdk/cx-api": { 938 | "version": "1.198.1", 939 | "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.198.1.tgz", 940 | "integrity": "sha512-A5mVgLf02KCH+yVEHSH5vt4B+uuAyQOOGRxirU7OyTIkIQSd4qOr+Q/K2OEc5+/XnV2ZMz5ji6VqqL8UbqmAMQ==", 941 | "bundleDependencies": [ 942 | "semver" 943 | ], 944 | "dependencies": { 945 | "@aws-cdk/cloud-assembly-schema": "1.198.1", 946 | "semver": "^7.3.8" 947 | }, 948 | "engines": { 949 | "node": ">= 14.15.0" 950 | }, 951 | "peerDependencies": { 952 | "@aws-cdk/cloud-assembly-schema": "1.198.1" 953 | } 954 | }, 955 | "node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { 956 | "version": "6.0.0", 957 | "inBundle": true, 958 | "license": "ISC", 959 | "dependencies": { 960 | "yallist": "^4.0.0" 961 | }, 962 | "engines": { 963 | "node": ">=10" 964 | } 965 | }, 966 | "node_modules/@aws-cdk/cx-api/node_modules/semver": { 967 | "version": "7.3.8", 968 | "inBundle": true, 969 | "license": "ISC", 970 | "dependencies": { 971 | "lru-cache": "^6.0.0" 972 | }, 973 | "bin": { 974 | "semver": "bin/semver.js" 975 | }, 976 | "engines": { 977 | "node": ">=10" 978 | } 979 | }, 980 | "node_modules/@aws-cdk/cx-api/node_modules/yallist": { 981 | "version": "4.0.0", 982 | "inBundle": true, 983 | "license": "ISC" 984 | }, 985 | "node_modules/@aws-cdk/region-info": { 986 | "version": "1.198.1", 987 | "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.198.1.tgz", 988 | "integrity": "sha512-3dLEacRu6cMbcOwfxRykGX3+MFrwpLKCNH8bQbJ+l/PAin1+OhfkjpAlQKVwECg8c3+9oKY3vDRzk9V53Xye8w==", 989 | "engines": { 990 | "node": ">= 14.15.0" 991 | } 992 | }, 993 | "node_modules/@tsconfig/node10": { 994 | "version": "1.0.9", 995 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 996 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 997 | "dev": true 998 | }, 999 | "node_modules/@tsconfig/node12": { 1000 | "version": "1.0.11", 1001 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 1002 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 1003 | "dev": true 1004 | }, 1005 | "node_modules/@tsconfig/node14": { 1006 | "version": "1.0.3", 1007 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 1008 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 1009 | "dev": true 1010 | }, 1011 | "node_modules/@tsconfig/node16": { 1012 | "version": "1.0.3", 1013 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", 1014 | "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", 1015 | "dev": true 1016 | }, 1017 | "node_modules/@types/node": { 1018 | "version": "14.17.1", 1019 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.1.tgz", 1020 | "integrity": "sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw==", 1021 | "dev": true 1022 | }, 1023 | "node_modules/@types/yaml": { 1024 | "version": "1.9.7", 1025 | "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.9.7.tgz", 1026 | "integrity": "sha512-8WMXRDD1D+wCohjfslHDgICd2JtMATZU8CkhH8LVJqcJs6dyYj5TGptzP8wApbmEullGBSsCEzzap73DQ1HJaA==", 1027 | "deprecated": "This is a stub types definition. yaml provides its own type definitions, so you do not need this installed.", 1028 | "dependencies": { 1029 | "yaml": "*" 1030 | } 1031 | }, 1032 | "node_modules/arg": { 1033 | "version": "4.1.3", 1034 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 1035 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 1036 | "dev": true 1037 | }, 1038 | "node_modules/available-typed-arrays": { 1039 | "version": "1.0.5", 1040 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 1041 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 1042 | "engines": { 1043 | "node": ">= 0.4" 1044 | }, 1045 | "funding": { 1046 | "url": "https://github.com/sponsors/ljharb" 1047 | } 1048 | }, 1049 | "node_modules/aws-cdk": { 1050 | "version": "1.198.1", 1051 | "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-1.198.1.tgz", 1052 | "integrity": "sha512-q1E6dA/9poRDbBr0pbw4ULYoqKh58LZwET2RlY5X+C25PVMPbXC+8ir+Mezdu+cuEKUPYjjV3+V+8Q3yZlb7zA==", 1053 | "dev": true, 1054 | "bin": { 1055 | "cdk": "bin/cdk" 1056 | }, 1057 | "engines": { 1058 | "node": ">= 14.15.0" 1059 | }, 1060 | "optionalDependencies": { 1061 | "fsevents": "2.3.2" 1062 | } 1063 | }, 1064 | "node_modules/aws-sdk": { 1065 | "version": "2.1356.0", 1066 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1356.0.tgz", 1067 | "integrity": "sha512-At7/tPJrAxlSIuyv/KpjgoNZSVp4y6nmrfcf89xe4KTR3+SRXnX4X0646bkCyU58jjSguqPjSJopsAFK16jdjg==", 1068 | "dependencies": { 1069 | "buffer": "4.9.2", 1070 | "events": "1.1.1", 1071 | "ieee754": "1.1.13", 1072 | "jmespath": "0.16.0", 1073 | "querystring": "0.2.0", 1074 | "sax": "1.2.1", 1075 | "url": "0.10.3", 1076 | "util": "^0.12.4", 1077 | "uuid": "8.0.0", 1078 | "xml2js": "0.5.0" 1079 | }, 1080 | "engines": { 1081 | "node": ">= 10.0.0" 1082 | } 1083 | }, 1084 | "node_modules/base64-js": { 1085 | "version": "1.5.1", 1086 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1087 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 1088 | "funding": [ 1089 | { 1090 | "type": "github", 1091 | "url": "https://github.com/sponsors/feross" 1092 | }, 1093 | { 1094 | "type": "patreon", 1095 | "url": "https://www.patreon.com/feross" 1096 | }, 1097 | { 1098 | "type": "consulting", 1099 | "url": "https://feross.org/support" 1100 | } 1101 | ] 1102 | }, 1103 | "node_modules/buffer": { 1104 | "version": "4.9.2", 1105 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 1106 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 1107 | "dependencies": { 1108 | "base64-js": "^1.0.2", 1109 | "ieee754": "^1.1.4", 1110 | "isarray": "^1.0.0" 1111 | } 1112 | }, 1113 | "node_modules/buffer-from": { 1114 | "version": "1.1.2", 1115 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1116 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 1117 | }, 1118 | "node_modules/call-bind": { 1119 | "version": "1.0.2", 1120 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1121 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1122 | "dependencies": { 1123 | "function-bind": "^1.1.1", 1124 | "get-intrinsic": "^1.0.2" 1125 | }, 1126 | "funding": { 1127 | "url": "https://github.com/sponsors/ljharb" 1128 | } 1129 | }, 1130 | "node_modules/constructs": { 1131 | "version": "3.4.293", 1132 | "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.293.tgz", 1133 | "integrity": "sha512-pUUNuJFQl8+47oFgDNLge8IupmPEKmSrdgADPmnyEqZBoqpui/yrxhIHTFEYDR1jFck9XzWHOBWnncs64mH7uw==", 1134 | "engines": { 1135 | "node": ">= 14.17.0" 1136 | } 1137 | }, 1138 | "node_modules/create-require": { 1139 | "version": "1.1.1", 1140 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 1141 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 1142 | "dev": true 1143 | }, 1144 | "node_modules/diff": { 1145 | "version": "4.0.2", 1146 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1147 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1148 | "dev": true, 1149 | "engines": { 1150 | "node": ">=0.3.1" 1151 | } 1152 | }, 1153 | "node_modules/events": { 1154 | "version": "1.1.1", 1155 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 1156 | "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", 1157 | "engines": { 1158 | "node": ">=0.4.x" 1159 | } 1160 | }, 1161 | "node_modules/for-each": { 1162 | "version": "0.3.3", 1163 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1164 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1165 | "dependencies": { 1166 | "is-callable": "^1.1.3" 1167 | } 1168 | }, 1169 | "node_modules/fsevents": { 1170 | "version": "2.3.2", 1171 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1172 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1173 | "dev": true, 1174 | "hasInstallScript": true, 1175 | "optional": true, 1176 | "os": [ 1177 | "darwin" 1178 | ], 1179 | "engines": { 1180 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1181 | } 1182 | }, 1183 | "node_modules/function-bind": { 1184 | "version": "1.1.1", 1185 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1186 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1187 | }, 1188 | "node_modules/get-intrinsic": { 1189 | "version": "1.2.0", 1190 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 1191 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 1192 | "dependencies": { 1193 | "function-bind": "^1.1.1", 1194 | "has": "^1.0.3", 1195 | "has-symbols": "^1.0.3" 1196 | }, 1197 | "funding": { 1198 | "url": "https://github.com/sponsors/ljharb" 1199 | } 1200 | }, 1201 | "node_modules/gopd": { 1202 | "version": "1.0.1", 1203 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1204 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1205 | "dependencies": { 1206 | "get-intrinsic": "^1.1.3" 1207 | }, 1208 | "funding": { 1209 | "url": "https://github.com/sponsors/ljharb" 1210 | } 1211 | }, 1212 | "node_modules/has": { 1213 | "version": "1.0.3", 1214 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1215 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1216 | "dependencies": { 1217 | "function-bind": "^1.1.1" 1218 | }, 1219 | "engines": { 1220 | "node": ">= 0.4.0" 1221 | } 1222 | }, 1223 | "node_modules/has-symbols": { 1224 | "version": "1.0.3", 1225 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1226 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1227 | "engines": { 1228 | "node": ">= 0.4" 1229 | }, 1230 | "funding": { 1231 | "url": "https://github.com/sponsors/ljharb" 1232 | } 1233 | }, 1234 | "node_modules/has-tostringtag": { 1235 | "version": "1.0.0", 1236 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1237 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1238 | "dependencies": { 1239 | "has-symbols": "^1.0.2" 1240 | }, 1241 | "engines": { 1242 | "node": ">= 0.4" 1243 | }, 1244 | "funding": { 1245 | "url": "https://github.com/sponsors/ljharb" 1246 | } 1247 | }, 1248 | "node_modules/ieee754": { 1249 | "version": "1.1.13", 1250 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 1251 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 1252 | }, 1253 | "node_modules/inherits": { 1254 | "version": "2.0.4", 1255 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1256 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1257 | }, 1258 | "node_modules/is-arguments": { 1259 | "version": "1.1.1", 1260 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 1261 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 1262 | "dependencies": { 1263 | "call-bind": "^1.0.2", 1264 | "has-tostringtag": "^1.0.0" 1265 | }, 1266 | "engines": { 1267 | "node": ">= 0.4" 1268 | }, 1269 | "funding": { 1270 | "url": "https://github.com/sponsors/ljharb" 1271 | } 1272 | }, 1273 | "node_modules/is-callable": { 1274 | "version": "1.2.7", 1275 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 1276 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 1277 | "engines": { 1278 | "node": ">= 0.4" 1279 | }, 1280 | "funding": { 1281 | "url": "https://github.com/sponsors/ljharb" 1282 | } 1283 | }, 1284 | "node_modules/is-generator-function": { 1285 | "version": "1.0.10", 1286 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 1287 | "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 1288 | "dependencies": { 1289 | "has-tostringtag": "^1.0.0" 1290 | }, 1291 | "engines": { 1292 | "node": ">= 0.4" 1293 | }, 1294 | "funding": { 1295 | "url": "https://github.com/sponsors/ljharb" 1296 | } 1297 | }, 1298 | "node_modules/is-typed-array": { 1299 | "version": "1.1.10", 1300 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 1301 | "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 1302 | "dependencies": { 1303 | "available-typed-arrays": "^1.0.5", 1304 | "call-bind": "^1.0.2", 1305 | "for-each": "^0.3.3", 1306 | "gopd": "^1.0.1", 1307 | "has-tostringtag": "^1.0.0" 1308 | }, 1309 | "engines": { 1310 | "node": ">= 0.4" 1311 | }, 1312 | "funding": { 1313 | "url": "https://github.com/sponsors/ljharb" 1314 | } 1315 | }, 1316 | "node_modules/isarray": { 1317 | "version": "1.0.0", 1318 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1319 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 1320 | }, 1321 | "node_modules/jmespath": { 1322 | "version": "0.16.0", 1323 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", 1324 | "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", 1325 | "engines": { 1326 | "node": ">= 0.6.0" 1327 | } 1328 | }, 1329 | "node_modules/make-error": { 1330 | "version": "1.3.6", 1331 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1332 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1333 | "dev": true 1334 | }, 1335 | "node_modules/punycode": { 1336 | "version": "1.3.2", 1337 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1338 | "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" 1339 | }, 1340 | "node_modules/querystring": { 1341 | "version": "0.2.0", 1342 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1343 | "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", 1344 | "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", 1345 | "engines": { 1346 | "node": ">=0.4.x" 1347 | } 1348 | }, 1349 | "node_modules/sax": { 1350 | "version": "1.2.1", 1351 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 1352 | "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" 1353 | }, 1354 | "node_modules/source-map": { 1355 | "version": "0.6.1", 1356 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1357 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1358 | "engines": { 1359 | "node": ">=0.10.0" 1360 | } 1361 | }, 1362 | "node_modules/source-map-support": { 1363 | "version": "0.5.21", 1364 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1365 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1366 | "dependencies": { 1367 | "buffer-from": "^1.0.0", 1368 | "source-map": "^0.6.0" 1369 | } 1370 | }, 1371 | "node_modules/ts-node": { 1372 | "version": "10.0.0", 1373 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz", 1374 | "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==", 1375 | "dev": true, 1376 | "dependencies": { 1377 | "@tsconfig/node10": "^1.0.7", 1378 | "@tsconfig/node12": "^1.0.7", 1379 | "@tsconfig/node14": "^1.0.0", 1380 | "@tsconfig/node16": "^1.0.1", 1381 | "arg": "^4.1.0", 1382 | "create-require": "^1.1.0", 1383 | "diff": "^4.0.1", 1384 | "make-error": "^1.1.1", 1385 | "source-map-support": "^0.5.17", 1386 | "yn": "3.1.1" 1387 | }, 1388 | "bin": { 1389 | "ts-node": "dist/bin.js", 1390 | "ts-node-cwd": "dist/bin-cwd.js", 1391 | "ts-node-script": "dist/bin-script.js", 1392 | "ts-node-transpile-only": "dist/bin-transpile.js", 1393 | "ts-script": "dist/bin-script-deprecated.js" 1394 | }, 1395 | "engines": { 1396 | "node": ">=12.0.0" 1397 | }, 1398 | "peerDependencies": { 1399 | "@swc/core": ">=1.2.45", 1400 | "@swc/wasm": ">=1.2.45", 1401 | "@types/node": "*", 1402 | "typescript": ">=2.7" 1403 | }, 1404 | "peerDependenciesMeta": { 1405 | "@swc/core": { 1406 | "optional": true 1407 | }, 1408 | "@swc/wasm": { 1409 | "optional": true 1410 | } 1411 | } 1412 | }, 1413 | "node_modules/typescript": { 1414 | "version": "4.3.2", 1415 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", 1416 | "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", 1417 | "dev": true, 1418 | "bin": { 1419 | "tsc": "bin/tsc", 1420 | "tsserver": "bin/tsserver" 1421 | }, 1422 | "engines": { 1423 | "node": ">=4.2.0" 1424 | } 1425 | }, 1426 | "node_modules/url": { 1427 | "version": "0.10.3", 1428 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 1429 | "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", 1430 | "dependencies": { 1431 | "punycode": "1.3.2", 1432 | "querystring": "0.2.0" 1433 | } 1434 | }, 1435 | "node_modules/util": { 1436 | "version": "0.12.5", 1437 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", 1438 | "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", 1439 | "dependencies": { 1440 | "inherits": "^2.0.3", 1441 | "is-arguments": "^1.0.4", 1442 | "is-generator-function": "^1.0.7", 1443 | "is-typed-array": "^1.1.3", 1444 | "which-typed-array": "^1.1.2" 1445 | } 1446 | }, 1447 | "node_modules/uuid": { 1448 | "version": "8.0.0", 1449 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", 1450 | "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", 1451 | "bin": { 1452 | "uuid": "dist/bin/uuid" 1453 | } 1454 | }, 1455 | "node_modules/which-typed-array": { 1456 | "version": "1.1.9", 1457 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 1458 | "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 1459 | "dependencies": { 1460 | "available-typed-arrays": "^1.0.5", 1461 | "call-bind": "^1.0.2", 1462 | "for-each": "^0.3.3", 1463 | "gopd": "^1.0.1", 1464 | "has-tostringtag": "^1.0.0", 1465 | "is-typed-array": "^1.1.10" 1466 | }, 1467 | "engines": { 1468 | "node": ">= 0.4" 1469 | }, 1470 | "funding": { 1471 | "url": "https://github.com/sponsors/ljharb" 1472 | } 1473 | }, 1474 | "node_modules/xml2js": { 1475 | "version": "0.5.0", 1476 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", 1477 | "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", 1478 | "dependencies": { 1479 | "sax": ">=0.6.0", 1480 | "xmlbuilder": "~11.0.0" 1481 | }, 1482 | "engines": { 1483 | "node": ">=4.0.0" 1484 | } 1485 | }, 1486 | "node_modules/xmlbuilder": { 1487 | "version": "11.0.1", 1488 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1489 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 1490 | "engines": { 1491 | "node": ">=4.0" 1492 | } 1493 | }, 1494 | "node_modules/yaml": { 1495 | "version": "2.2.2", 1496 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", 1497 | "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", 1498 | "engines": { 1499 | "node": ">= 14" 1500 | } 1501 | }, 1502 | "node_modules/yn": { 1503 | "version": "3.1.1", 1504 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1505 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1506 | "dev": true, 1507 | "engines": { 1508 | "node": ">=6" 1509 | } 1510 | } 1511 | } 1512 | } 1513 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "amazon-elasticsearch-service-with-cognito", 3 | "version": "1.1.4", 4 | "description": "Launch Amazon Elasticsearch Service with Amazon Cognito User Pools and Fine-Grained Access Control.", 5 | "author": { 6 | "name": "Steffen Grunwald" 7 | }, 8 | "license": "MIT-0", 9 | "homepage": "https://github.com/aws-samples/amazon-elasticsearch-service-with-cognito", 10 | "bin": { 11 | "search": "bin/search.js" 12 | }, 13 | "scripts": { 14 | "build": "tsc", 15 | "watch": "tsc -w", 16 | "cdk": "cdk" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "14.17.1", 20 | "aws-cdk": "^1.108.1", 21 | "ts-node": "10.0.0", 22 | "typescript": "4.3.2" 23 | }, 24 | "dependencies": { 25 | "@aws-cdk/aws-cloudformation": "^1.108.1", 26 | "@aws-cdk/aws-cognito": "^1.108.1", 27 | "@aws-cdk/aws-elasticsearch": "^1.108.1", 28 | "@aws-cdk/aws-sam": "^1.108.1", 29 | "@aws-cdk/core": "^1.108.1", 30 | "@types/yaml": "^1.2.0", 31 | "aws-sdk": "^2.1354.0", 32 | "source-map-support": "^0.5.16" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target":"ES2018", 4 | "module": "commonjs", 5 | "lib": ["es2018"], 6 | "declaration": true, 7 | "strict": true, 8 | "noImplicitAny": true, 9 | "strictNullChecks": true, 10 | "noImplicitThis": true, 11 | "alwaysStrict": true, 12 | "noUnusedLocals": false, 13 | "noUnusedParameters": false, 14 | "noImplicitReturns": true, 15 | "noFallthroughCasesInSwitch": false, 16 | "inlineSourceMap": true, 17 | "inlineSources": true, 18 | "experimentalDecorators": true, 19 | "strictPropertyInitialization":false, 20 | "typeRoots": ["./node_modules/@types"] 21 | }, 22 | "exclude": ["cdk.out"] 23 | } 24 | --------------------------------------------------------------------------------