eoapi-cdk 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.devcontainer/devcontainer.json +4 -0
  2. package/.github/workflows/build.yaml +73 -0
  3. package/.github/workflows/conventional-pr.yaml +26 -0
  4. package/.github/workflows/distribute.yaml +45 -0
  5. package/.github/workflows/docs.yaml +26 -0
  6. package/.github/workflows/test.yaml +13 -0
  7. package/.github/workflows/tox.yaml +24 -0
  8. package/.jsii +5058 -0
  9. package/.nvmrc +1 -0
  10. package/CHANGELOG.md +195 -0
  11. package/README.md +50 -0
  12. package/diagrams/bastion_diagram.excalidraw +1416 -0
  13. package/diagrams/bastion_diagram.png +0 -0
  14. package/diagrams/ingestor_diagram.excalidraw +2274 -0
  15. package/diagrams/ingestor_diagram.png +0 -0
  16. package/lib/bastion-host/index.d.ts +117 -0
  17. package/lib/bastion-host/index.js +162 -0
  18. package/lib/bootstrapper/index.d.ts +57 -0
  19. package/lib/bootstrapper/index.js +73 -0
  20. package/lib/bootstrapper/runtime/Dockerfile +18 -0
  21. package/lib/bootstrapper/runtime/handler.py +235 -0
  22. package/lib/database/index.d.ts +60 -0
  23. package/lib/database/index.js +84 -0
  24. package/lib/database/instance-memory.json +525 -0
  25. package/lib/index.d.ts +6 -0
  26. package/lib/index.js +19 -0
  27. package/lib/ingestor-api/index.d.ts +54 -0
  28. package/lib/ingestor-api/index.js +147 -0
  29. package/lib/ingestor-api/runtime/dev_requirements.txt +2 -0
  30. package/lib/ingestor-api/runtime/requirements.txt +12 -0
  31. package/lib/ingestor-api/runtime/src/__init__.py +0 -0
  32. package/lib/ingestor-api/runtime/src/collection.py +36 -0
  33. package/lib/ingestor-api/runtime/src/config.py +46 -0
  34. package/lib/ingestor-api/runtime/src/dependencies.py +94 -0
  35. package/lib/ingestor-api/runtime/src/handler.py +9 -0
  36. package/lib/ingestor-api/runtime/src/ingestor.py +82 -0
  37. package/lib/ingestor-api/runtime/src/loader.py +21 -0
  38. package/lib/ingestor-api/runtime/src/main.py +125 -0
  39. package/lib/ingestor-api/runtime/src/schemas.py +148 -0
  40. package/lib/ingestor-api/runtime/src/services.py +44 -0
  41. package/lib/ingestor-api/runtime/src/utils.py +52 -0
  42. package/lib/ingestor-api/runtime/src/validators.py +72 -0
  43. package/lib/ingestor-api/runtime/tests/__init__.py +0 -0
  44. package/lib/ingestor-api/runtime/tests/conftest.py +271 -0
  45. package/lib/ingestor-api/runtime/tests/test_collection.py +35 -0
  46. package/lib/ingestor-api/runtime/tests/test_collection_endpoint.py +41 -0
  47. package/lib/ingestor-api/runtime/tests/test_ingestor.py +60 -0
  48. package/lib/ingestor-api/runtime/tests/test_registration.py +198 -0
  49. package/lib/ingestor-api/runtime/tests/test_utils.py +35 -0
  50. package/lib/stac-api/index.d.ts +50 -0
  51. package/lib/stac-api/index.js +60 -0
  52. package/lib/stac-api/runtime/requirements.txt +8 -0
  53. package/lib/stac-api/runtime/src/__init__.py +0 -0
  54. package/lib/stac-api/runtime/src/app.py +58 -0
  55. package/lib/stac-api/runtime/src/config.py +96 -0
  56. package/lib/stac-api/runtime/src/handler.py +9 -0
  57. package/lib/titiler-pgstac-api/index.d.ts +33 -0
  58. package/lib/titiler-pgstac-api/index.js +67 -0
  59. package/lib/titiler-pgstac-api/runtime/Dockerfile +20 -0
  60. package/lib/titiler-pgstac-api/runtime/dev_requirements.txt +1 -0
  61. package/lib/titiler-pgstac-api/runtime/requirements.txt +3 -0
  62. package/lib/titiler-pgstac-api/runtime/src/__init__.py +3 -0
  63. package/lib/titiler-pgstac-api/runtime/src/handler.py +23 -0
  64. package/lib/titiler-pgstac-api/runtime/src/utils.py +26 -0
  65. package/package.json +81 -0
  66. package/tox.ini +52 -0
  67. package/tsconfig.tsbuildinfo +18116 -0
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.TitilerPgstacApiLambda = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_apigatewayv2_alpha_1 = require("@aws-cdk/aws-apigatewayv2-alpha");
8
+ const aws_apigatewayv2_integrations_alpha_1 = require("@aws-cdk/aws-apigatewayv2-integrations-alpha");
9
+ const constructs_1 = require("constructs");
10
+ class TitilerPgstacApiLambda extends constructs_1.Construct {
11
+ constructor(scope, id, props) {
12
+ super(scope, id);
13
+ const titilerPgstacEnv = {
14
+ "CPL_VSIL_CURL_ALLOWED_EXTENSIONS": ".tif,.TIF,.tiff",
15
+ "GDAL_CACHEMAX": "200",
16
+ "GDAL_DISABLE_READDIR_ON_OPEN": "EMPTY_DIR",
17
+ "GDAL_INGESTED_BYTES_AT_OPEN": "32768",
18
+ "GDAL_HTTP_MERGE_CONSECUTIVE_RANGES": "YES",
19
+ "GDAL_HTTP_MULTIPLEX": "YES",
20
+ "GDAL_HTTP_VERSION": "2",
21
+ "PYTHONWARNINGS": "ignore",
22
+ "VSI_CACHE": "TRUE",
23
+ "VSI_CACHE_SIZE": "5000000",
24
+ "DB_MIN_CONN_SIZE": "1",
25
+ "DB_MAX_CONN_SIZE": "1",
26
+ "PGSTAC_SECRET_ARN": props.dbSecret.secretArn,
27
+ };
28
+ this.titilerPgstacLambdaFunction = new aws_cdk_lib_1.aws_lambda.Function(this, "lambda", {
29
+ handler: "handler.handler",
30
+ runtime: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_10,
31
+ code: aws_cdk_lib_1.aws_lambda.Code.fromDockerBuild(__dirname, {
32
+ file: "runtime/Dockerfile",
33
+ buildArgs: { PYTHON_VERSION: '3.10' },
34
+ }),
35
+ timeout: aws_cdk_lib_1.Duration.seconds(30),
36
+ vpc: props.vpc,
37
+ vpcSubnets: props.subnetSelection,
38
+ allowPublicSubnet: true,
39
+ memorySize: 3008,
40
+ logRetention: aws_cdk_lib_1.aws_logs.RetentionDays.ONE_WEEK,
41
+ environment: titilerPgstacEnv,
42
+ });
43
+ // grant access to buckets using addToRolePolicy
44
+ if (props.buckets) {
45
+ props.buckets.forEach(bucket => {
46
+ this.titilerPgstacLambdaFunction.addToRolePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
47
+ actions: ["s3:GetObject"],
48
+ resources: [`arn:aws:s3:::${bucket}/*`],
49
+ }));
50
+ });
51
+ }
52
+ props.dbSecret.grantRead(this.titilerPgstacLambdaFunction);
53
+ this.titilerPgstacLambdaFunction.connections.allowTo(props.db, aws_cdk_lib_1.aws_ec2.Port.tcp(5432), "allow connections from titiler");
54
+ const stacApi = new aws_apigatewayv2_alpha_1.HttpApi(this, `${aws_cdk_lib_1.Stack.of(this).stackName}-titiler-pgstac-api`, {
55
+ defaultIntegration: new aws_apigatewayv2_integrations_alpha_1.HttpLambdaIntegration("integration", this.titilerPgstacLambdaFunction),
56
+ });
57
+ this.url = stacApi.url;
58
+ new aws_cdk_lib_1.CfnOutput(this, "titiler-pgstac-api-output", {
59
+ exportName: `${aws_cdk_lib_1.Stack.of(this).stackName}-titiler-pgstac-url`,
60
+ value: this.url,
61
+ });
62
+ }
63
+ }
64
+ exports.TitilerPgstacApiLambda = TitilerPgstacApiLambda;
65
+ _a = JSII_RTTI_SYMBOL_1;
66
+ TitilerPgstacApiLambda[_a] = { fqn: "eoapi-cdk.TitilerPgstacApiLambda", version: "5.0.0" };
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQVV1QjtBQUNyQiw0RUFBMEQ7QUFDMUQsc0dBQXFGO0FBQ3JGLDJDQUF1QztBQUV2QyxNQUFhLHNCQUF1QixTQUFRLHNCQUFTO0lBSW5ELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0M7UUFDMUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLGdCQUFnQixHQUFHO1lBQ3JCLGtDQUFrQyxFQUFFLGlCQUFpQjtZQUNyRCxlQUFlLEVBQUUsS0FBSztZQUN0Qiw4QkFBOEIsRUFBRSxXQUFXO1lBQzNDLDZCQUE2QixFQUFFLE9BQU87WUFDdEMsb0NBQW9DLEVBQUUsS0FBSztZQUMzQyxxQkFBcUIsRUFBRSxLQUFLO1lBQzVCLG1CQUFtQixFQUFFLEdBQUc7WUFDeEIsZ0JBQWdCLEVBQUUsUUFBUTtZQUMxQixXQUFXLEVBQUUsTUFBTTtZQUNuQixnQkFBZ0IsRUFBRSxTQUFTO1lBQzNCLGtCQUFrQixFQUFFLEdBQUc7WUFDdkIsa0JBQWtCLEVBQUUsR0FBRztZQUN2QixtQkFBbUIsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVM7U0FDaEQsQ0FBQTtRQUdELElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLHdCQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDckUsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixPQUFPLEVBQUUsd0JBQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxJQUFJLEVBQUUsd0JBQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRTtnQkFDM0MsSUFBSSxFQUFFLG9CQUFvQjtnQkFDMUIsU0FBUyxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRTthQUN0QyxDQUFDO1lBQ0YsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxVQUFVLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDakMsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixVQUFVLEVBQUUsSUFBSTtZQUNoQixZQUFZLEVBQUUsc0JBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUTtZQUM3QyxXQUFXLEVBQUUsZ0JBQWdCO1NBQzlCLENBQUMsQ0FBQztRQUVILGdEQUFnRDtRQUNoRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzdCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxlQUFlLENBQUMsSUFBSSxxQkFBRyxDQUFDLGVBQWUsQ0FBQztvQkFDdkUsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO29CQUN6QixTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsTUFBTSxJQUFJLENBQUM7aUJBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUscUJBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFFckgsTUFBTSxPQUFPLEdBQUcsSUFBSSxnQ0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMscUJBQXFCLEVBQUU7WUFDbEYsa0JBQWtCLEVBQUUsSUFBSSwyREFBcUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDO1NBQy9GLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUksQ0FBQztRQUV4QixJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFFO1lBQy9DLFVBQVUsRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMscUJBQXFCO1lBQzVELEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDOztBQS9ESCx3REFnRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFN0YWNrLFxuICAgIGF3c19pYW0gYXMgaWFtLFxuICAgIGF3c19lYzIgYXMgZWMyLFxuICAgIGF3c19yZHMgYXMgcmRzLFxuICAgIGF3c19sYW1iZGEgYXMgbGFtYmRhLFxuICAgIGF3c19zZWNyZXRzbWFuYWdlciBhcyBzZWNyZXRzbWFuYWdlcixcbiAgICBDZm5PdXRwdXQsXG4gICAgRHVyYXRpb24sXG4gICAgYXdzX2xvZ3MsXG4gIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG4gIGltcG9ydCB7IEh0dHBBcGkgfSBmcm9tIFwiQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1hbHBoYVwiO1xuICBpbXBvcnQgeyBIdHRwTGFtYmRhSW50ZWdyYXRpb24gfSBmcm9tIFwiQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnMtYWxwaGFcIjtcbiAgaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbiAgXG4gIGV4cG9ydCBjbGFzcyBUaXRpbGVyUGdzdGFjQXBpTGFtYmRhIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgdGl0aWxlclBnc3RhY0xhbWJkYUZ1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG4gIFxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUaXRpbGVyUGdTdGFjQXBpTGFtYmRhUHJvcHMpIHtcbiAgICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gIFxuICAgICAgY29uc3QgdGl0aWxlclBnc3RhY0VudiA9IHtcbiAgICAgICAgICBcIkNQTF9WU0lMX0NVUkxfQUxMT1dFRF9FWFRFTlNJT05TXCI6IFwiLnRpZiwuVElGLC50aWZmXCIsXG4gICAgICAgICAgXCJHREFMX0NBQ0hFTUFYXCI6IFwiMjAwXCIsIFxuICAgICAgICAgIFwiR0RBTF9ESVNBQkxFX1JFQURESVJfT05fT1BFTlwiOiBcIkVNUFRZX0RJUlwiLFxuICAgICAgICAgIFwiR0RBTF9JTkdFU1RFRF9CWVRFU19BVF9PUEVOXCI6IFwiMzI3NjhcIixcbiAgICAgICAgICBcIkdEQUxfSFRUUF9NRVJHRV9DT05TRUNVVElWRV9SQU5HRVNcIjogXCJZRVNcIixcbiAgICAgICAgICBcIkdEQUxfSFRUUF9NVUxUSVBMRVhcIjogXCJZRVNcIixcbiAgICAgICAgICBcIkdEQUxfSFRUUF9WRVJTSU9OXCI6IFwiMlwiLFxuICAgICAgICAgIFwiUFlUSE9OV0FSTklOR1NcIjogXCJpZ25vcmVcIixcbiAgICAgICAgICBcIlZTSV9DQUNIRVwiOiBcIlRSVUVcIixcbiAgICAgICAgICBcIlZTSV9DQUNIRV9TSVpFXCI6IFwiNTAwMDAwMFwiLCBcbiAgICAgICAgICBcIkRCX01JTl9DT05OX1NJWkVcIjogXCIxXCIsXG4gICAgICAgICAgXCJEQl9NQVhfQ09OTl9TSVpFXCI6IFwiMVwiLFxuICAgICAgICAgIFwiUEdTVEFDX1NFQ1JFVF9BUk5cIjogcHJvcHMuZGJTZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgfVxuICAgIFxuICAgICAgXG4gICAgICB0aGlzLnRpdGlsZXJQZ3N0YWNMYW1iZGFGdW5jdGlvbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgXCJsYW1iZGFcIiwge1xuICAgICAgICBoYW5kbGVyOiBcImhhbmRsZXIuaGFuZGxlclwiLFxuICAgICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xMCxcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbURvY2tlckJ1aWxkKF9fZGlybmFtZSwge1xuICAgICAgICAgIGZpbGU6IFwicnVudGltZS9Eb2NrZXJmaWxlXCIsXG4gICAgICAgICAgYnVpbGRBcmdzOiB7IFBZVEhPTl9WRVJTSU9OOiAnMy4xMCcgfSxcbiAgICAgICAgfSksXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMzApLFxuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgdnBjU3VibmV0czogcHJvcHMuc3VibmV0U2VsZWN0aW9uLFxuICAgICAgICBhbGxvd1B1YmxpY1N1Ym5ldDogdHJ1ZSxcbiAgICAgICAgbWVtb3J5U2l6ZTogMzAwOCxcbiAgICAgICAgbG9nUmV0ZW50aW9uOiBhd3NfbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgICBlbnZpcm9ubWVudDogdGl0aWxlclBnc3RhY0VudixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBncmFudCBhY2Nlc3MgdG8gYnVja2V0cyB1c2luZyBhZGRUb1JvbGVQb2xpY3lcbiAgICAgIGlmIChwcm9wcy5idWNrZXRzKSB7XG4gICAgICAgIHByb3BzLmJ1Y2tldHMuZm9yRWFjaChidWNrZXQgPT4ge1xuICAgICAgICAgIHRoaXMudGl0aWxlclBnc3RhY0xhbWJkYUZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJzMzpHZXRPYmplY3RcIl0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpzMzo6OiR7YnVja2V0fS8qYF0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcHJvcHMuZGJTZWNyZXQuZ3JhbnRSZWFkKHRoaXMudGl0aWxlclBnc3RhY0xhbWJkYUZ1bmN0aW9uKTtcbiAgICAgIHRoaXMudGl0aWxlclBnc3RhY0xhbWJkYUZ1bmN0aW9uLmNvbm5lY3Rpb25zLmFsbG93VG8ocHJvcHMuZGIsIGVjMi5Qb3J0LnRjcCg1NDMyKSwgXCJhbGxvdyBjb25uZWN0aW9ucyBmcm9tIHRpdGlsZXJcIik7XG4gIFxuICAgICAgY29uc3Qgc3RhY0FwaSA9IG5ldyBIdHRwQXBpKHRoaXMsIGAke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0tdGl0aWxlci1wZ3N0YWMtYXBpYCwge1xuICAgICAgICBkZWZhdWx0SW50ZWdyYXRpb246IG5ldyBIdHRwTGFtYmRhSW50ZWdyYXRpb24oXCJpbnRlZ3JhdGlvblwiLCB0aGlzLnRpdGlsZXJQZ3N0YWNMYW1iZGFGdW5jdGlvbiksXG4gICAgICB9KTtcbiAgXG4gICAgICB0aGlzLnVybCA9IHN0YWNBcGkudXJsITtcbiAgXG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwidGl0aWxlci1wZ3N0YWMtYXBpLW91dHB1dFwiLCB7XG4gICAgICAgIGV4cG9ydE5hbWU6IGAke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0tdGl0aWxlci1wZ3N0YWMtdXJsYCxcbiAgICAgICAgdmFsdWU6IHRoaXMudXJsLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICBleHBvcnQgaW50ZXJmYWNlIFRpdGlsZXJQZ1N0YWNBcGlMYW1iZGFQcm9wcyB7XG5cbiAgICAvKipcbiAgICAgKiBWUEMgaW50byB3aGljaCB0aGUgbGFtYmRhIHNob3VsZCBiZSBkZXBsb3llZC5cbiAgICAgKi9cbiAgICByZWFkb25seSB2cGM6IGVjMi5JVnBjO1xuICBcbiAgICAvKipcbiAgICAgKiBSRFMgSW5zdGFuY2Ugd2l0aCBpbnN0YWxsZWQgcGdTVEFDLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRiOiByZHMuSURhdGFiYXNlSW5zdGFuY2U7XG4gIFxuICAgIC8qKlxuICAgICAqIFN1Ym5ldCBpbnRvIHdoaWNoIHRoZSBsYW1iZGEgc2hvdWxkIGJlIGRlcGxveWVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHN1Ym5ldFNlbGVjdGlvbjogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcbiAgXG4gICAgLyoqXG4gICAgICogU2VjcmV0IGNvbnRhaW5pbmcgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgcGdTVEFDIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRiU2VjcmV0OiBzZWNyZXRzbWFuYWdlci5JU2VjcmV0O1xuXG4gICAgLyoqXG4gICAgICogQ3VzdG9taXplZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2VuZCB0byB0aXRpbGVyLXBnc3RhYyBydW50aW1lLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFwaUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBsaXN0IG9mIGJ1Y2tldHMgdGhlIGxhbWJkYSB3aWxsIGJlIGdyYW50ZWQgYWNjZXNzIHRvLiBcbiAgICAgKi9cbiAgICByZWFkb25seSBidWNrZXRzPzogc3RyaW5nW107XG5cbiAgfSJdfQ==
@@ -0,0 +1,20 @@
1
+ ARG PYTHON_VERSION
2
+
3
+ FROM --platform=linux/amd64 public.ecr.aws/lambda/python:${PYTHON_VERSION}
4
+
5
+ WORKDIR /tmp
6
+ RUN python -m pip install pip -U
7
+
8
+ COPY runtime/requirements.txt requirements.txt
9
+ RUN python -m pip install -r requirements.txt "mangum>=0.14,<0.15" -t /asset
10
+
11
+ # Reduce package size and remove useless files
12
+ RUN find /asset -type f -name '*.pyc' | while read f; do n=$(echo $f | sed 's/__pycache__\///' | sed 's/.cpython-[0-9]*//'); cp $f $n; done;
13
+ RUN find /asset -type d -name '__pycache__' -print0 | xargs -0 rm -rf
14
+ RUN find /asset -type f -name '*.py' -print0 | xargs -0 rm -f
15
+ RUN find /asset -type d -name 'tests' -print0 | xargs -0 rm -rf
16
+ RUN rm -rdf /asset/numpy/doc/ /asset/boto3* /asset/botocore* /asset/bin /asset/geos_license /asset/Misc
17
+
18
+ COPY runtime/src/*.py /asset/
19
+
20
+ CMD ["echo", "hello world"]
@@ -0,0 +1,3 @@
1
+ titiler.pgstac==0.3.3
2
+ boto3>=1.26.139
3
+ psycopg[binary, pool]
@@ -0,0 +1,3 @@
1
+ """eoapi.raster."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,23 @@
1
+ """
2
+ Handler for AWS Lambda.
3
+ """
4
+
5
+ import os
6
+ from mangum import Mangum
7
+ from utils import get_secret_dict
8
+ from titiler.pgstac.main import app
9
+
10
+ pgstac_secret_arn = os.environ["PGSTAC_SECRET_ARN"]
11
+
12
+ secret = get_secret_dict(pgstac_secret_arn)
13
+ os.environ.update(
14
+ {
15
+ "postgres_host": secret["host"],
16
+ "postgres_dbname": secret["dbname"],
17
+ "postgres_user": secret["username"],
18
+ "postgres_pass": secret["password"],
19
+ "postgres_port": str(secret["port"]),
20
+ }
21
+ )
22
+
23
+ handler = Mangum(app)
@@ -0,0 +1,26 @@
1
+ import base64
2
+ import json
3
+ import boto3
4
+
5
+
6
+ def get_secret_dict(secret_name: str):
7
+ """Retrieve secrets from AWS Secrets Manager
8
+
9
+ Args:
10
+ secret_name (str): name of aws secrets manager secret containing database connection secrets
11
+ profile_name (str, optional): optional name of aws profile for use in debugger only
12
+
13
+ Returns:
14
+ secrets (dict): decrypted secrets in dict
15
+ """
16
+
17
+ # Create a Secrets Manager client
18
+ session = boto3.session.Session()
19
+ client = session.client(service_name="secretsmanager")
20
+
21
+ get_secret_value_response = client.get_secret_value(SecretId=secret_name)
22
+
23
+ if "SecretString" in get_secret_value_response:
24
+ return json.loads(get_secret_value_response["SecretString"])
25
+ else:
26
+ return json.loads(base64.b64decode(get_secret_value_response["SecretBinary"]))
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "eoapi-cdk",
3
+ "version": "5.0.0",
4
+ "description": "A set of constructs deploying pgSTAC with CDK",
5
+ "main": "lib/index.js",
6
+ "types": "lib/index.d.ts",
7
+ "scripts": {
8
+ "build": "jsii",
9
+ "dev": "run-p dev:*",
10
+ "dev:build": "jsii --watch",
11
+ "dev:docgen": "nodemon -w .jsii -e .jsii --exec npm run docgen",
12
+ "dev:package": "nodemon -w .jsii -e .jsii --exec npm run package",
13
+ "clean": "git clean -Xdf lib",
14
+ "package": "jsii-pacmak -v",
15
+ "docgen": "mkdir -p docs && jsii-docgen -o docs/index.md",
16
+ "test": "echo \"Error: no test specified\" && exit 1",
17
+ "semantic-release": "semantic-release"
18
+ },
19
+ "keywords": [],
20
+ "author": {
21
+ "name": "Anthony Lukach",
22
+ "email": "anthony@developmentseed.org"
23
+ },
24
+ "repository": {
25
+ "url": "https://github.com/developmentseed/eoapi-cdk.git"
26
+ },
27
+ "license": "ISC",
28
+ "stability": "experimental",
29
+ "jsii": {
30
+ "outdir": "dist",
31
+ "versionFormat": "full",
32
+ "targets": {
33
+ "python": {
34
+ "distName": "eoapi-cdk",
35
+ "module": "eoapi_cdk"
36
+ }
37
+ }
38
+ },
39
+ "devDependencies": {
40
+ "@qiwi/semantic-release-gh-pages-plugin": "^5.2.3",
41
+ "@semantic-release/changelog": "^6.0.1",
42
+ "@semantic-release/git": "^10.0.1",
43
+ "@types/node": "^18.7.23",
44
+ "jsii": "^1.68.0",
45
+ "jsii-docgen": "^7.0.119",
46
+ "jsii-pacmak": "^1.68.0",
47
+ "nodemon": "^2.0.20",
48
+ "npm-run-all": "^4.1.5",
49
+ "prettier": "^2.7.1",
50
+ "semantic-release": "^19.0.5"
51
+ },
52
+ "dependencies": {
53
+ "@aws-cdk/aws-apigatewayv2-integrations-alpha": "^2.47.0-alpha.0",
54
+ "@aws-cdk/aws-lambda-python-alpha": "^2.47.0-alpha.0",
55
+ "aws-cdk-lib": "^2.75.0",
56
+ "constructs": "^10.1.113"
57
+ },
58
+ "peerDependencies": {
59
+ "aws-cdk-lib": "^2.75.0",
60
+ "constructs": "^10.1.113"
61
+ },
62
+ "release": {
63
+ "branches": [
64
+ "main",
65
+ "next"
66
+ ],
67
+ "plugins": [
68
+ "@semantic-release/commit-analyzer",
69
+ "@semantic-release/changelog",
70
+ "@semantic-release/release-notes-generator",
71
+ [
72
+ "@semantic-release/npm",
73
+ {
74
+ "npmPublish": false
75
+ }
76
+ ],
77
+ "@semantic-release/git",
78
+ "@semantic-release/github"
79
+ ]
80
+ }
81
+ }
package/tox.ini ADDED
@@ -0,0 +1,52 @@
1
+ [tox]
2
+ skipsdist = True
3
+ envlist = py39
4
+
5
+ [testenv]
6
+ extras = test
7
+ envdir = toxenv
8
+ passenv = AWS_DEFAULT_REGION
9
+ commands =
10
+ pip install flake8 isort black pytest
11
+ pip install -r ./lib/ingestor-api/runtime/requirements.txt
12
+ pip install -r ./lib/ingestor-api/runtime/dev_requirements.txt
13
+ flake8
14
+ black lib --diff
15
+ isort lib
16
+ python -m pytest -s
17
+
18
+
19
+ [flake8]
20
+ ignore = E203, E266, E501, W503, F403, E231
21
+ exclude =
22
+ node_modules
23
+ __pycache__
24
+ .git
25
+ .tox
26
+ venv*
27
+ toxenv*
28
+ devenv*
29
+ cdk.out
30
+ *.egg-info
31
+ max-line-length = 90
32
+ max-complexity = 18
33
+ select = B,C,E,F,W,T4,B9
34
+
35
+ [black]
36
+ line-length = 90
37
+ exclude =
38
+ __pycache__
39
+ .git
40
+ .tox
41
+ venv*
42
+ toxenv*
43
+ devenv*
44
+ cdk.out
45
+ *.egg-info
46
+
47
+ [isort]
48
+ profile = black
49
+
50
+ [pytest]
51
+ addopts = -ra -q
52
+ testpaths = lib/ingestor-api