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.
- package/.devcontainer/devcontainer.json +4 -0
- package/.github/workflows/build.yaml +73 -0
- package/.github/workflows/conventional-pr.yaml +26 -0
- package/.github/workflows/distribute.yaml +45 -0
- package/.github/workflows/docs.yaml +26 -0
- package/.github/workflows/test.yaml +13 -0
- package/.github/workflows/tox.yaml +24 -0
- package/.jsii +5058 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +195 -0
- package/README.md +50 -0
- package/diagrams/bastion_diagram.excalidraw +1416 -0
- package/diagrams/bastion_diagram.png +0 -0
- package/diagrams/ingestor_diagram.excalidraw +2274 -0
- package/diagrams/ingestor_diagram.png +0 -0
- package/lib/bastion-host/index.d.ts +117 -0
- package/lib/bastion-host/index.js +162 -0
- package/lib/bootstrapper/index.d.ts +57 -0
- package/lib/bootstrapper/index.js +73 -0
- package/lib/bootstrapper/runtime/Dockerfile +18 -0
- package/lib/bootstrapper/runtime/handler.py +235 -0
- package/lib/database/index.d.ts +60 -0
- package/lib/database/index.js +84 -0
- package/lib/database/instance-memory.json +525 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +19 -0
- package/lib/ingestor-api/index.d.ts +54 -0
- package/lib/ingestor-api/index.js +147 -0
- package/lib/ingestor-api/runtime/dev_requirements.txt +2 -0
- package/lib/ingestor-api/runtime/requirements.txt +12 -0
- package/lib/ingestor-api/runtime/src/__init__.py +0 -0
- package/lib/ingestor-api/runtime/src/collection.py +36 -0
- package/lib/ingestor-api/runtime/src/config.py +46 -0
- package/lib/ingestor-api/runtime/src/dependencies.py +94 -0
- package/lib/ingestor-api/runtime/src/handler.py +9 -0
- package/lib/ingestor-api/runtime/src/ingestor.py +82 -0
- package/lib/ingestor-api/runtime/src/loader.py +21 -0
- package/lib/ingestor-api/runtime/src/main.py +125 -0
- package/lib/ingestor-api/runtime/src/schemas.py +148 -0
- package/lib/ingestor-api/runtime/src/services.py +44 -0
- package/lib/ingestor-api/runtime/src/utils.py +52 -0
- package/lib/ingestor-api/runtime/src/validators.py +72 -0
- package/lib/ingestor-api/runtime/tests/__init__.py +0 -0
- package/lib/ingestor-api/runtime/tests/conftest.py +271 -0
- package/lib/ingestor-api/runtime/tests/test_collection.py +35 -0
- package/lib/ingestor-api/runtime/tests/test_collection_endpoint.py +41 -0
- package/lib/ingestor-api/runtime/tests/test_ingestor.py +60 -0
- package/lib/ingestor-api/runtime/tests/test_registration.py +198 -0
- package/lib/ingestor-api/runtime/tests/test_utils.py +35 -0
- package/lib/stac-api/index.d.ts +50 -0
- package/lib/stac-api/index.js +60 -0
- package/lib/stac-api/runtime/requirements.txt +8 -0
- package/lib/stac-api/runtime/src/__init__.py +0 -0
- package/lib/stac-api/runtime/src/app.py +58 -0
- package/lib/stac-api/runtime/src/config.py +96 -0
- package/lib/stac-api/runtime/src/handler.py +9 -0
- package/lib/titiler-pgstac-api/index.d.ts +33 -0
- package/lib/titiler-pgstac-api/index.js +67 -0
- package/lib/titiler-pgstac-api/runtime/Dockerfile +20 -0
- package/lib/titiler-pgstac-api/runtime/dev_requirements.txt +1 -0
- package/lib/titiler-pgstac-api/runtime/requirements.txt +3 -0
- package/lib/titiler-pgstac-api/runtime/src/__init__.py +3 -0
- package/lib/titiler-pgstac-api/runtime/src/handler.py +23 -0
- package/lib/titiler-pgstac-api/runtime/src/utils.py +26 -0
- package/package.json +81 -0
- package/tox.ini +52 -0
- 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 @@
|
|
|
1
|
+
uvicorn
|
|
@@ -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
|