130 lines
3.6 KiB
TypeScript
130 lines
3.6 KiB
TypeScript
import { PythonFunction, PythonFunctionProps } from '@aws-cdk/aws-lambda-python-alpha';
|
|
import { aws_apigateway, aws_dynamodb, aws_iam, aws_lambda, Duration } from 'aws-cdk-lib';
|
|
import { LambdaIntegration } from 'aws-cdk-lib/aws-apigateway';
|
|
import { Effect } from 'aws-cdk-lib/aws-iam';
|
|
import { Architecture, Runtime } from 'aws-cdk-lib/aws-lambda';
|
|
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
import { Construct } from 'constructs';
|
|
import { ApiModels } from '../../shared/models';
|
|
|
|
|
|
export interface GetPrepareApiProps {
|
|
httpMethod: string;
|
|
router: aws_apigateway.Resource;
|
|
s3Bucket: s3.Bucket;
|
|
syncTable: aws_dynamodb.Table;
|
|
instanceMonitorTable: aws_dynamodb.Table;
|
|
commonLayer: aws_lambda.LayerVersion;
|
|
}
|
|
|
|
|
|
export class GetPrepareApi {
|
|
public lambdaIntegration: aws_apigateway.LambdaIntegration;
|
|
private readonly baseId: string;
|
|
private readonly router: aws_apigateway.Resource;
|
|
private readonly httpMethod: string;
|
|
private readonly scope: Construct;
|
|
private readonly layer: aws_lambda.LayerVersion;
|
|
private readonly s3Bucket: s3.Bucket;
|
|
private readonly syncTable: aws_dynamodb.Table;
|
|
private readonly instanceMonitorTable: aws_dynamodb.Table;
|
|
|
|
constructor(scope: Construct, id: string, props: GetPrepareApiProps) {
|
|
this.scope = scope;
|
|
this.httpMethod = props.httpMethod;
|
|
this.baseId = id;
|
|
this.router = props.router;
|
|
this.s3Bucket = props.s3Bucket;
|
|
this.syncTable = props.syncTable;
|
|
this.instanceMonitorTable = props.instanceMonitorTable;
|
|
this.layer = props.commonLayer;
|
|
|
|
const lambdaFunction = this.apiLambda();
|
|
|
|
this.lambdaIntegration = new LambdaIntegration(
|
|
lambdaFunction,
|
|
{
|
|
proxy: true,
|
|
},
|
|
);
|
|
|
|
this.router.addMethod(this.httpMethod, this.lambdaIntegration, {
|
|
apiKeyRequired: true,
|
|
operationName: 'GetPrepare',
|
|
methodResponses: [
|
|
ApiModels.methodResponses400(),
|
|
ApiModels.methodResponses401(),
|
|
ApiModels.methodResponses403(),
|
|
],
|
|
});
|
|
}
|
|
|
|
private apiLambda() {
|
|
return new PythonFunction(this.scope, `${this.baseId}-lambda`, <PythonFunctionProps>{
|
|
entry: '../middleware_api/comfy',
|
|
architecture: Architecture.X86_64,
|
|
runtime: Runtime.PYTHON_3_10,
|
|
index: 'get_prepare.py',
|
|
handler: 'handler',
|
|
timeout: Duration.seconds(900),
|
|
role: this.iamRole(),
|
|
memorySize: 2048,
|
|
tracing: aws_lambda.Tracing.ACTIVE,
|
|
environment: {
|
|
SYNC_TABLE: this.syncTable.tableName,
|
|
INSTANCE_MONITOR_TABLE: this.instanceMonitorTable.tableName,
|
|
},
|
|
layers: [this.layer],
|
|
});
|
|
}
|
|
|
|
private iamRole(): aws_iam.Role {
|
|
const newRole = new aws_iam.Role(this.scope, `${this.baseId}-role`, {
|
|
assumedBy: new aws_iam.ServicePrincipal('lambda.amazonaws.com'),
|
|
});
|
|
|
|
newRole.addToPolicy(new aws_iam.PolicyStatement({
|
|
effect: Effect.ALLOW,
|
|
actions: [
|
|
'dynamodb:BatchGetItem',
|
|
'dynamodb:GetItem',
|
|
'dynamodb:Scan',
|
|
'dynamodb:Query',
|
|
],
|
|
resources: [
|
|
this.syncTable.tableArn,
|
|
this.instanceMonitorTable.tableArn,
|
|
],
|
|
}));
|
|
|
|
newRole.addToPolicy(new aws_iam.PolicyStatement({
|
|
effect: Effect.ALLOW,
|
|
actions: [
|
|
's3:GetObject',
|
|
's3:PutObject',
|
|
's3:DeleteObject',
|
|
's3:ListBucket',
|
|
],
|
|
resources: [
|
|
`${this.s3Bucket.bucketArn}/*`,
|
|
`${this.s3Bucket.bucketArn}`,
|
|
],
|
|
}));
|
|
|
|
newRole.addToPolicy(new aws_iam.PolicyStatement({
|
|
effect: Effect.ALLOW,
|
|
actions: [
|
|
'logs:CreateLogGroup',
|
|
'logs:CreateLogStream',
|
|
'logs:PutLogEvents',
|
|
],
|
|
resources: ['*'],
|
|
}));
|
|
|
|
return newRole;
|
|
}
|
|
|
|
|
|
}
|
|
|