constructor()

in transcribe-ui-backend/provisioning/lib/construct/api.ts [19:107]


  constructor(scope: cdk.Construct, id: string, props: ApiProps) {
    super(scope, id)

    const logGroup = new logs.LogGroup(this, `${id}-api-log`, {
      retention: logs.RetentionDays.INFINITE
    })

    const api = new apigateway.RestApi(this, `${id}-rest-api`, {
      restApiName: 'Transcribe-API',
      defaultCorsPreflightOptions: {
        allowOrigins: apigateway.Cors.ALL_ORIGINS,
        allowMethods: apigateway.Cors.ALL_METHODS
      },
      deployOptions: {
        accessLogDestination: new apigateway.LogGroupLogDestination(logGroup)
      }
    })

    // WAF IP Restriction
    const ipRestriction = new IpRestriction(this, `${id}-ip-restriction`)
    ipRestriction.applyApi(api)

    // POST  /transcribe
    const transFunc = new LambdaFunction(this, `${id}-trans-func`, {
      entry: './lambda/transcribe.ts',
      environment: {
        JOB_TABLE: props.jobTable.tableName,
        TRANSCRIBE_BUCKET: props.transBucket.bucketName
      }
    })
    transFunc.role!.addToPrincipalPolicy(
      new iam.PolicyStatement({
        effect: iam.Effect.ALLOW,
        resources: ['*'],
        actions: [
          'transcribe:StartTranscriptionJob',
          'transcribe:GetVocabulary'
        ]
      })
    )
    props.jobTable.grantReadWriteData(transFunc)
    props.transBucket.grantReadWrite(transFunc)

    const transIntegration = new apigateway.LambdaIntegration(transFunc)
    api.root.addResource('transcribe').addMethod('POST', transIntegration)

    // GET  /sign
    const secretName = 'Transcribe-Secret'
    const secret = new secretsmanager.Secret(this, `${id}-secret-manager`, {
      secretName
    })

    const signFunc = new LambdaFunction(this, `${id}-sign-func`, {
      entry: './lambda/sign.ts',
      environment: {
        TRANSCRIBE_BUCKET: props.transBucket.bucketName,
        SECRET_NAME: secretName
      }
    })
    signFunc.role!.addToPrincipalPolicy(
      new iam.PolicyStatement({
        effect: iam.Effect.ALLOW,
        resources: [secret.secretArn],
        actions: [
          'secretsmanager:GetSecretValue',
          'secretsmanager:DescribeSecret'
        ]
      })
    )
    props.transBucket.grantReadWrite(signFunc)

    const signIntegration = new apigateway.LambdaIntegration(signFunc)
    api.root.addResource('sign').addMethod('GET', signIntegration)

    // ANY  /vocabularies
    const vocabFunc = new LambdaFunction(this, `${id}-vocab-func`, {
      entry: './lambda/vocabularies.ts',
      environment: {
        VOCABULARY_TABLE: props.vocabTable.tableName
      }
    })
    props.vocabTable.grantReadWriteData(vocabFunc)

    const vocabIntegration = new apigateway.LambdaIntegration(vocabFunc)
    const vocab = api.root.addResource('vocabularies')
    vocab.addMethod('GET', vocabIntegration)
    vocab.addMethod('POST', vocabIntegration)
    vocab.addMethod('DELETE', vocabIntegration)
  }