stable-diffusion-aws-extension/infrastructure/src/api/comfy/get_prepare.ts

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;
}
}