AWSTemplateFormatVersion: 2010-09-09 Description: AppSync setup Parameters: FunctionStack: Description: The stack name that deploys the Lambda functions to invoke. Type: String Resources: DataSourceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: appsync.amazonaws.com Policies: - PolicyName: LambdaInvoker PolicyDocument: Version: 2012-10-17 Statement: - Action: lambda:InvokeFunction Effect: Allow Resource: - Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-Healthcheck' - Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-Healthcheck' - ':*' - Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-Process' - Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-Process' - ':*' - Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-ProcessDefinition' - Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-ProcessDefinition' - ':*' - Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-Task' - Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-Task' - ':*' RoleName: !Sub '${AWS::StackName}-lambda-role' GqlApi: Type: AWS::AppSync::GraphQLApi Properties: AuthenticationType: AWS_IAM Name: !Ref AWS::StackName GqlSchema: Type: AWS::AppSync::GraphQLSchema Properties: ApiId: !GetAtt GqlApi.ApiId Definition: | type Mutation { postProcess(processId: String, cognitoIdentityId__: String): ! postProcess(processId: String, cognitoIdentityId__: String): ! deleteProcessDefinition(processDefinitionName: String, cognitoIdentityId__: String): ! postProcessDefinition(processDefinitionName: String, taskDefinitionName: String, cognitoIdentityId__: String): ! postProcessDefinition(processDefinitionName: String, cognitoIdentityId__: String): ! postProcessDefinition(processDefinitionName: String, cognitoIdentityId__: String): ! putProcessDefinition(processDefinition: ProcessDefinitionInput! , processDefinitionName: String, cognitoIdentityId__: String): ProcessDefinition! postTask(logEntry: LogEntryInput! , taskId: String, cognitoIdentityId__: String): ! postTask(metadataEntry: MetadataEntryInput! , taskId: String, cognitoIdentityId__: String): ! postTask(taskId: String, cognitoIdentityId__: String): ! postTask(taskId: String, cognitoIdentityId__: String): ! } type Query { getHealthcheck(cognitoIdentityId__: String): getProcess(processDefinitionName: String, startTime: AWSDateTime, endTime: AWSDateTime, maxRecords: Int, allowedStatuses: [process_status], cognitoIdentityId__: String): getProcess(processId: String, cognitoIdentityId__: String): Process getProcessDefinition(cognitoIdentityId__: String): getProcessDefinition(processDefinitionName: String, cognitoIdentityId__: String): ProcessDefinition getTask(processDefinitionName: String, taskDefinitionName: String, allowedStatuses: [task_status], startTime: AWSDateTime, endTime: AWSDateTime, limit: Int, cognitoIdentityId__: String): } input BatchImageCommandInput { command: [String] environmentVariables: [environment_variableInput] image: String jobQueue: String jobRoleArn: String memory: Int tag: String vCpus: Int } type BatchImageCommand { command: [String]! environmentVariables: [environment_variable]! image: String! jobQueue: String jobRoleArn: String memory: Int! tag: String! vCpus: Int! } input ContinuousScheduleInput { bufferSeconds: Int } type ContinuousSchedule { bufferSeconds: Int } input CronScheduleInput { dayOfMonth: String dayOfWeek: String hours: String minutes: String month: String } type CronSchedule { dayOfMonth: String! dayOfWeek: String! hours: String! minutes: String! month: String! } input CustomEmrJobFlowRoleInput { roleName: String } type CustomEmrJobFlowRole { roleName: String! } input CustomEmrServiceRoleInput { roleName: String } type CustomEmrServiceRole { roleName: String! } input EmailInput { email: String name: String notifyWhen: notification_options } type Email { email: String! name: String! notifyWhen: notification_options! } input EmrCommandInput { args: [String] class: String emrCluster: jobName: String loadData: [s3_cpInput] region: String s3JarPath: String s3LogDetails: s3_log_detailsInput saveResults: [s3_cpInput] sparkConf: [String] sparkPackages: [maven_packageInput] } type EmrCommand { args: [String]! class: String! emrCluster: ! jobName: String! loadData: [s3_cp] region: String! s3JarPath: String! s3LogDetails: s3_log_details saveResults: [s3_cp] sparkConf: [String]! sparkPackages: [maven_package]! } input EmrConfigurationInput { classification: String configurations: [emr_configurationInput] properties: [String] } type EmrConfiguration { classification: String configurations: [emr_configuration] properties: [String] } input EmrInstanceGroupDetailsInput { awsMarket: ebsVolumeSize: Int emrInstanceType: String instanceCount: Int } type EmrInstanceGroupDetails { awsMarket: ! ebsVolumeSize: Int emrInstanceType: String! instanceCount: Int! } input EnvironmentVariableInput { value: String variableName: String } type EnvironmentVariable { value: String! variableName: String! } input ExistingEmrClusterInput { clusterId: String } type ExistingEmrCluster { clusterId: String! } input HealthcheckInput { status: String } type Healthcheck { status: String! } input LogEntryInput { logEntryId: String message: String source: String when: AWSDateTime } type LogEntry { logEntryId: String! message: String! source: String! when: AWSDateTime! } input MavenPackageInput { artifactId: String groupId: String version: String } type MavenPackage { artifactId: String! groupId: String! version: String! } input MetadataEntryInput { key: String metadataEntryId: String value: String when: AWSDateTime } type MetadataEntry { key: String! metadataEntryId: String! value: String! when: AWSDateTime! } input NewEmrClusterInput { applications: [emr_application] configurations: [emr_configurationInput] coreInstance: emr_instance_group_detailsInput ec2Subnet: String emrJobFlowRole: emrServiceRole: masterInstance: emr_instance_group_detailsInput name: String releaseLabel: emr_release_label s3LogUri: String securityConfiguration: String taskInstance: emr_instance_group_detailsInput visibleToAllUsers: Boolean } type NewEmrCluster { applications: [emr_application]! configurations: [emr_configuration] coreInstance: emr_instance_group_details ec2Subnet: String emrJobFlowRole: ! emrServiceRole: ! masterInstance: emr_instance_group_details! name: String! releaseLabel: emr_release_label! s3LogUri: String! securityConfiguration: String taskInstance: emr_instance_group_details visibleToAllUsers: Boolean! } input PagerdutyInput { apiUrl: String numConsecutiveFailures: Int serviceKey: String } type Pagerduty { apiUrl: String! numConsecutiveFailures: Int! serviceKey: String! } input ProcessInput { processDefinitionName: String processId: String startTime: AWSDateTime status: process_status task: [taskInput] } type Process { processDefinitionName: String! processId: String! startTime: AWSDateTime! status: process_status! task: [task]! } input ProcessDefinitionInput { notifications: [] overlapAction: process_overlap_action paused: Boolean processDefinitionName: String processDescription: String schedule: taskDefinitions: [task_definitionInput] } type ProcessDefinition { notifications: [] overlapAction: process_overlap_action! paused: Boolean processDefinitionName: String! processDescription: String schedule: taskDefinitions: [task_definition]! } input S3CpInput { destination: String source: String } type S3Cp { destination: String! source: String! } input S3LogDetailsInput { logGroupName: String logStreamName: String } type S3LogDetails { logGroupName: String! logStreamName: String! } input ShellScriptCommandInput { environmentVariables: [environment_variableInput] script: String } type ShellScriptCommand { environmentVariables: [environment_variable] script: String! } input SpotInput { bidPrice: Float } type Spot { bidPrice: Float! } input TaskInput { endTime: AWSDateTime executionState: [metadata_entryInput] logEntries: [log_entryInput] metadataEntries: [metadata_entryInput] previousAttemptCount: Int processDefinitionName: String processId: String startTime: AWSDateTime status: task_status taskDefinitionName: String taskId: String } type Task { endTime: AWSDateTime executionState: [metadata_entry] logEntries: [log_entry]! metadataEntries: [metadata_entry]! previousAttemptCount: Int! processDefinitionName: String! processId: String! startTime: AWSDateTime! status: task_status! taskDefinitionName: String! taskId: String! } input TaskDefinitionInput { backoffBaseSeconds: Int backoffExponent: Float dependencies: [task_dependencyInput] executable: maxAttempts: Int maxRuntimeSeconds: Int requireExplicitSuccess: Boolean taskDefinitionName: String } type TaskDefinition { backoffBaseSeconds: Int! backoffExponent: Float! dependencies: [task_dependency]! executable: ! maxAttempts: Int! maxRuntimeSeconds: Int requireExplicitSuccess: Boolean! taskDefinitionName: String! } input TaskDependencyInput { successRequired: Boolean taskDefinitionName: String } type TaskDependency { successRequired: Boolean! taskDefinitionName: String! } enum DefaultEmrJobFlowRole { DEFAULT_EMR_JOB_FLOW_ROLE } enum DefaultEmrServiceRole { DEFAULT_EMR_SERVICE_ROLE } enum EmrApplication { GANGLIA HADOOP HIVE MAHOUT PIG SPARK } enum EmrReleaseLabel { EMR-4.9.1 EMR-4.9.2 EMR-5.10.0 EMR-5.11.0 EMR-5.11.1 EMR-5.12.0 EMR-5.12.1 EMR-5.13.0 EMR-5.14.0 EMR-5.15.0 EMR-5.16.0 EMR-5.17.0 EMR-5.18.0 EMR-5.19.0 EMR-5.20.0 EMR-5.9.0 } enum NotificationOptions { ALWAYS NEVER ON_FAILURE ON_STATE_CHANGE ON_STATE_CHANGE_AND_FAILURES } enum OnDemand { ON_DEMAND } enum ProcessOverlapAction { TERMINATE WAIT } enum ProcessStatus { FAILED RUNNING SUCCEEDED } enum TaskStatus { FAILED PENDING RUNNABLE RUNNING STARTING SUBMITTED SUCCEEDED } schema { query: Query mutation: Mutation } DependsOn: - GqlApi HealthcheckDataSource: Type: AWS::AppSync::DataSource Properties: ApiId: !GetAtt GqlApi.ApiId LambdaConfig: LambdaFunctionArn: Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-Healthcheck' Name: healthcheck_lambda ServiceRoleArn: !GetAtt DataSourceRole.Arn Type: AWS_LAMBDA DependsOn: - DataSourceRole - GqlApi GetHealthcheckResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: getHealthcheck TypeName: Query DataSourceName: !GetAtt HealthcheckDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "get", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - HealthcheckDataSource ProcessDataSource: Type: AWS::AppSync::DataSource Properties: ApiId: !GetAtt GqlApi.ApiId LambdaConfig: LambdaFunctionArn: Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-Process' Name: process_lambda ServiceRoleArn: !GetAtt DataSourceRole.Arn Type: AWS_LAMBDA DependsOn: - DataSourceRole - GqlApi GetProcessResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: getProcess TypeName: Query DataSourceName: !GetAtt ProcessDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "get", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { }, "queryStringParameters": { "allowed_statuses": "$util.escapeJavaScript($context.args.allowedStatuses)", "end_time": "$util.escapeJavaScript($context.args.endTime)", "max_records": "$util.escapeJavaScript($context.args.maxRecords)", "process_definition_name": "$util.escapeJavaScript($context.args.processDefinitionName)", "start_time": "$util.escapeJavaScript($context.args.startTime)" } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDataSource GetProcessResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: getProcess TypeName: Query DataSourceName: !GetAtt ProcessDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "get", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "process_id": "$util.escapeJavaScript($context.args.processId)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDataSource PostProcessResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: postProcess TypeName: Mutation DataSourceName: !GetAtt ProcessDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "post", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "process_id": "$util.escapeJavaScript($context.args.processId)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDataSource PostProcessResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: postProcess TypeName: Mutation DataSourceName: !GetAtt ProcessDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "post", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "process_id": "$util.escapeJavaScript($context.args.processId)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDataSource GetTasksByProcessIdResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: task TypeName: Process DataSourceName: !GetAtt ProcessDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "BatchInvoke", "payload": { "source": "AppSync", "resource": "getTasksByProcessId", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "processId": "$util.escapeJavaScript($context.source.id)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $tasks = $util.parseJson($context.result.body) ) #foreach( $task in $tasks ) #if($context.args.cognitoIdentityId__) #set( $task.cognitoIdentityId__ = $context.args.cognitoIdentityId__) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end #end $util.toJson($tasks) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDataSource ProcessDefinitionDataSource: Type: AWS::AppSync::DataSource Properties: ApiId: !GetAtt GqlApi.ApiId LambdaConfig: LambdaFunctionArn: Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-ProcessDefinition' Name: process_definition_lambda ServiceRoleArn: !GetAtt DataSourceRole.Arn Type: AWS_LAMBDA DependsOn: - DataSourceRole - GqlApi DeleteProcessDefinitionResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: deleteProcessDefinition TypeName: Mutation DataSourceName: !GetAtt ProcessDefinitionDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "delete", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "process_definition_name": "$util.escapeJavaScript($context.args.processDefinitionName)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDefinitionDataSource GetProcessDefinitionResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: getProcessDefinition TypeName: Query DataSourceName: !GetAtt ProcessDefinitionDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "get", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDefinitionDataSource GetProcessDefinitionResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: getProcessDefinition TypeName: Query DataSourceName: !GetAtt ProcessDefinitionDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "get", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "process_definition_name": "$util.escapeJavaScript($context.args.processDefinitionName)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDefinitionDataSource PostProcessDefinitionResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: postProcessDefinition TypeName: Mutation DataSourceName: !GetAtt ProcessDefinitionDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "post", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "process_definition_name": "$util.escapeJavaScript($context.args.processDefinitionName)" }, "queryStringParameters": { "task_definition_name": "$util.escapeJavaScript($context.args.taskDefinitionName)" } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDefinitionDataSource PostProcessDefinitionResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: postProcessDefinition TypeName: Mutation DataSourceName: !GetAtt ProcessDefinitionDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "post", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "process_definition_name": "$util.escapeJavaScript($context.args.processDefinitionName)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDefinitionDataSource PostProcessDefinitionResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: postProcessDefinition TypeName: Mutation DataSourceName: !GetAtt ProcessDefinitionDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "post", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "process_definition_name": "$util.escapeJavaScript($context.args.processDefinitionName)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDefinitionDataSource PutProcessDefinitionResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: putProcessDefinition TypeName: Mutation DataSourceName: !GetAtt ProcessDefinitionDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "put", "body": "$util.escapeJavaScript($util.toJson($context.args.processDefinition))", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "process_definition_name": "$util.escapeJavaScript($context.args.processDefinitionName)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - ProcessDefinitionDataSource TaskDataSource: Type: AWS::AppSync::DataSource Properties: ApiId: !GetAtt GqlApi.ApiId LambdaConfig: LambdaFunctionArn: Fn::Join: - '' - - 'arn:aws:lambda:' - !Ref AWS::Region - ':' - !Ref AWS::AccountId - ':function:' - Fn::ImportValue: !Sub '${FunctionStack}-functions-Task' Name: task_lambda ServiceRoleArn: !GetAtt DataSourceRole.Arn Type: AWS_LAMBDA DependsOn: - DataSourceRole - GqlApi GetTaskResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: getTask TypeName: Query DataSourceName: !GetAtt TaskDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "get", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { }, "queryStringParameters": { "allowed_statuses": "$util.escapeJavaScript($context.args.allowedStatuses)", "end_time": "$util.escapeJavaScript($context.args.endTime)", "limit": "$util.escapeJavaScript($context.args.limit)", "process_definition_name": "$util.escapeJavaScript($context.args.processDefinitionName)", "start_time": "$util.escapeJavaScript($context.args.startTime)", "task_definition_name": "$util.escapeJavaScript($context.args.taskDefinitionName)" } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - TaskDataSource PostTaskResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: postTask TypeName: Mutation DataSourceName: !GetAtt TaskDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "post", "body": "$util.escapeJavaScript($util.toJson($context.args.logEntry))", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "task_id": "$util.escapeJavaScript($context.args.taskId)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - TaskDataSource PostTaskResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: postTask TypeName: Mutation DataSourceName: !GetAtt TaskDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "post", "body": "$util.escapeJavaScript($util.toJson($context.args.metadataEntry))", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "task_id": "$util.escapeJavaScript($context.args.taskId)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - TaskDataSource PostTaskResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: postTask TypeName: Mutation DataSourceName: !GetAtt TaskDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "post", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "task_id": "$util.escapeJavaScript($context.args.taskId)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - TaskDataSource PostTaskResolver: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt GqlApi.ApiId FieldName: postTask TypeName: Mutation DataSourceName: !GetAtt TaskDataSource.Name RequestMappingTemplate: | #set( $cognitoIdentityId = $context.identity.cognitoIdentityId ) #if($context.identity.userArn.matches('arn:aws:iam::\d+:user/.*')) #if($context.args.cognitoIdentityId__) #set( $cognitoIdentityId = $context.args.cognitoIdentityId__ ) #elseif( $context.source.cognitoIdentityId__ ) #set( $cognitoIdentityId = $context.source.cognitoIdentityId__ ) #end #end #set( $unamepwd = "$util.urlEncode($cognitoIdentityId):" ) { "version" : "2017-02-28", "operation": "Invoke", "payload": { "source": "AppSync", "httpMethod": "post", "headers": { "Authorization": "Basic $util.base64Encode($unamepwd)", }, "pathParameters": { "task_id": "$util.escapeJavaScript($context.args.taskId)" }, "queryStringParameters": { } } } ResponseMappingTemplate: | #if($context.result.statusCode >= 200 && $context.result.statusCode <= 299) #set( $result = $util.parseJson($context.result.body) ) #if($context.args.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.args.cognitoIdentityId__ ) #elseif($context.source.cognitoIdentityId__) #set( $result.cognitoIdentityId__ = $context.source.cognitoIdentityId__ ) #end $util.toJson($result) #else $utils.error($util.parseJson($context.result.body).message, $context.result.statusCode.toString(), $util.parseJson($context.result.body)) #end DependsOn: - GqlApi - GqlSchema - TaskDataSource Outputs: ApiEndpoint: Description: The endpoint for the AppSync API. Value: !GetAtt GqlApi.GraphQLUrl