Created
April 26, 2021 15:00
-
-
Save iconifyit/772a3b9537033bd811440d09291c0249 to your computer and use it in GitHub Desktop.
Example serverless file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| app: aws-pdf-merge | |
| org: iconify | |
| service: pdf-workflow | |
| custom: ${file(./yml/custom.yml)} | |
| # ================================================================================================ | |
| # PROVIDER | |
| # ================================================================================================ | |
| provider: | |
| name: aws | |
| runtime: nodejs12.x | |
| profile: default | |
| timeout: 10 | |
| iamRoleStatements: | |
| - Effect: Allow | |
| Action: | |
| - lambda:InvokeFunction | |
| Resource: | |
| - arn:aws:lambda:us-east-1::*:* | |
| - arn:aws:states:us-east-1::*:* | |
| - Effect: Allow | |
| Action: | |
| - sts:StartExecution | |
| Resource: | |
| - arn:aws:states:us-east-1::*:* | |
| - Effect: Allow | |
| Action: | |
| - cloudwatch:* | |
| Resource: | |
| - arn:aws:cloudwatch:us-east-1::*:* | |
| - Effect: Allow | |
| Action: | |
| - s3:* | |
| Resource: '*' | |
| # ================================================================================================ | |
| # PLUGINS | |
| # ================================================================================================ | |
| plugins: | |
| - serverless-step-functions | |
| - serverless-pseudo-parameters | |
| - serverless-vpc-plugin | |
| layers: | |
| commonLibs: | |
| path: layer | |
| compatibleRuntimes: | |
| - nodejs12.x | |
| # ================================================================================================ | |
| # LAMBDAS | |
| # ================================================================================================ | |
| functions: | |
| getLatestCursor: | |
| handler: getLatestCursor.handler | |
| layers: | |
| - {Ref: CommonLibsLambdaLayer} | |
| environment: | |
| s3BucketName: ${self:custom.s3BucketName} | |
| getStoredCursor: | |
| handler: getStoredCursor.handler | |
| layers: | |
| - {Ref: CommonLibsLambdaLayer} | |
| environment: | |
| s3BucketName: ${self:custom.s3BucketName} | |
| getFileList: | |
| handler: getFileList.handler | |
| layers: | |
| - {Ref: CommonLibsLambdaLayer} | |
| environment: | |
| s3BucketName: ${self:custom.s3BucketName} | |
| downloadFile: | |
| handler: downloadFile.handler | |
| timeout: 900 | |
| memorySize: 3008 | |
| layers: | |
| - {Ref: CommonLibsLambdaLayer} | |
| environment: | |
| s3BucketName: ${self:custom.s3BucketName} | |
| compressFile: | |
| handler: compressFile.handler | |
| timeout: 900 | |
| memorySize: 3008 | |
| layers: | |
| - {Ref: CommonLibsLambdaLayer} | |
| - arn:aws:lambda:us-east-1:764866452798:layer:ghostscript:8 | |
| # https://github.com/shelfio/ghostscript-lambda-layer | |
| environment: | |
| s3BucketName: ${self:custom.s3BucketName} | |
| clearBucket: | |
| handler: clearBucket.handler | |
| timeout: 300 | |
| layers: | |
| - {Ref: CommonLibsLambdaLayer} | |
| environment: | |
| s3BucketName: ${self:custom.s3BucketName} | |
| mergePdfs: | |
| handler: mergePdfs.handler | |
| timeout: 900 | |
| memorySize: 3008 | |
| layers: | |
| - {Ref: CommonLibsLambdaLayer} | |
| environment: | |
| s3BucketName: ${self:custom.s3BucketName} | |
| uploadToDropbox: | |
| handler: uploadToDropbox.handler | |
| timeout: 900 | |
| memorySize: 3008 | |
| layers: | |
| - {Ref: CommonLibsLambdaLayer} | |
| environment: | |
| s3BucketName: ${self:custom.s3BucketName} | |
| # ================================================================================================ | |
| # STEP FUNCTIONS | |
| # ================================================================================================ | |
| stepFunctions: | |
| stateMachines: | |
| getLatestCursor: | |
| name: sfGetLatestCursor | |
| definition: | |
| Comment: 'Get the latest cursor' | |
| StartAt: Get_Latest_Cursor | |
| States: | |
| Get_Latest_Cursor: | |
| Type: Task | |
| Resource: | |
| Fn::GetAtt: [getLatestCursor, Arn] | |
| TimeoutSeconds: 120 | |
| HeartbeatSeconds: 30 | |
| Catch: | |
| - ErrorEquals: [States.ALL] | |
| ResultPath: $.error | |
| Next: Send_Cursor_Error_Message | |
| Next : Send_Cursor_Success_Message | |
| Send_Cursor_Success_Message: | |
| Type: Task | |
| Resource: | |
| arn:aws:states:::sns:publish | |
| Parameters: | |
| Subject: '[SUCCESS] Saved Latest Cursor' | |
| Message: | |
| - Input.$ : $ | |
| TopicArn: | |
| !Join [':', ['arn:aws:sns', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'GoodHumansNotifications']] | |
| Next: End_Cursor_Process | |
| Send_Cursor_Error_Message: | |
| Type: Task | |
| Resource: | |
| arn:aws:states:::sns:publish | |
| Parameters: | |
| Subject: '[FAILED] Get Latest Cursor Error' | |
| Message: | |
| - Input.$: $.error | |
| TopicArn: | |
| !Join [':', ['arn:aws:sns', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'GoodHumansNotifications']] | |
| Next: End_Cursor_Process | |
| End_Cursor_Process: | |
| Type: Pass | |
| End: true | |
| Merge_File_List: | |
| name: sfMergeFileList | |
| definition: | |
| Comment: 'Get the stored cursor' | |
| StartAt: Send_Merge_Started_Message | |
| States: | |
| Send_Merge_Started_Message: | |
| Type: Task | |
| Resource: | |
| arn:aws:states:::sns:publish | |
| Parameters: | |
| Subject: 'PDF Merge Started' | |
| Message: '[START] GoodHumans.co.uk PDF merge has started. You will be notified via email when the process is complete' | |
| TopicArn: | |
| !Join [':', ['arn:aws:sns', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'GoodHumansNotifications']] | |
| Next: Get_Stored_Cursor | |
| Get_Stored_Cursor: | |
| Type: Task | |
| Resource: | |
| Fn::GetAtt: [getStoredCursor, Arn] | |
| Catch: | |
| - ErrorEquals : [States.ALL] | |
| ResultPath : $.error | |
| Next : Send_Error_Message | |
| Next : Clear_PDF_Bucket | |
| Clear_PDF_Bucket: | |
| Type: Task | |
| Resource: | |
| Fn::GetAtt: [clearBucket, Arn] | |
| Catch: | |
| - ErrorEquals : [States.ALL] | |
| ResultPath : $.error | |
| Next : Send_Error_Message | |
| Next : Get_File_List | |
| Get_File_List: | |
| Type: Task | |
| Resource: | |
| Fn::GetAtt: [getFileList, Arn] | |
| Catch: | |
| - ErrorEquals : [States.ALL] | |
| ResultPath : $.error | |
| Next : Send_Error_Message | |
| Next : Has_Files_To_Download | |
| Has_Files_To_Download: | |
| Type: Choice | |
| Choices : | |
| - Variable : $.body.has_files | |
| BooleanEquals : true | |
| Next : Download_Files | |
| Default : Send_No_Files_Message | |
| Download_Files : | |
| Type : Map | |
| InputPath : $.body | |
| ItemsPath : $.files | |
| Parameters : | |
| 'Index.$' : $$.Map.Item.Index | |
| 'Value.$' : $$.Map.Item.Value | |
| MaxConcurrency : 3 | |
| Iterator : | |
| StartAt : Download_File | |
| States : | |
| Download_File: | |
| Type: Task | |
| Resource: !Join [':', ['arn:aws:lambda', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'function:pdf-workflow-downloadFile']] | |
| TimeoutSeconds : 900 | |
| HeartbeatSeconds : 30 | |
| Retry: | |
| - ErrorEquals: [ States.ALL ] | |
| IntervalSeconds: 1 | |
| BackoffRate: 2 | |
| MaxAttempts: 3 | |
| Next: Cool_Down_1 | |
| Cool_Down_1: | |
| Type : Wait | |
| Seconds : 2 | |
| Next : Compress_File | |
| Compress_File: | |
| Type: Task | |
| Resource: !Join [':', ['arn:aws:lambda', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'function:pdf-workflow-compressFile']] | |
| Parameters: | |
| 'Key.$': $.body.Key | |
| TimeoutSeconds: 900 | |
| HeartbeatSeconds: 30 | |
| Retry: | |
| - ErrorEquals: [ States.ALL ] | |
| IntervalSeconds: 1 | |
| BackoffRate: 2 | |
| MaxAttempts: 3 | |
| Next : Cool_Down_2 | |
| Cool_Down_2: | |
| Type : Wait | |
| Seconds : 2 | |
| End : true | |
| Catch: | |
| - ErrorEquals : [States.ALL] | |
| ResultPath : $ | |
| Next : Send_Error_Message | |
| Next : Merge_PDFs_in_Parallel | |
| Merge_PDFs_in_Parallel: | |
| Type: Parallel | |
| Next : End_Process | |
| Branches: | |
| - StartAt: Merge_HR_PDFs | |
| States: | |
| Merge_HR_PDFs: | |
| Type: Task | |
| Parameters: | |
| Resolution: 'HR' | |
| Resource: | |
| Fn::GetAtt: [mergePdfs, Arn] | |
| Catch: | |
| - ErrorEquals: [States.ALL] | |
| ResultPath: $ | |
| Next: Send_HR_Process_Error_Message | |
| Next: Merge_PDFs_Cool_Down_1 | |
| Merge_PDFs_Cool_Down_1: | |
| Type: Wait | |
| Seconds: 3 | |
| Next : Upload_HR_PDF_to_Dropbox | |
| Upload_HR_PDF_to_Dropbox: | |
| Type: Task | |
| Resource: | |
| Fn::GetAtt: [uploadToDropbox, Arn] | |
| Catch: | |
| - ErrorEquals: [States.ALL] | |
| ResultPath: $ | |
| Next: Send_HR_Process_Error_Message | |
| Next: Send_HR_Process_Finished_Message | |
| Send_HR_Process_Finished_Message: | |
| Type: Task | |
| InputPath: $ | |
| Resource: | |
| arn:aws:states:::sns:publish | |
| Parameters: | |
| Subject: '[SUCCESS] `03 Final Artwork` PDFs Merged' | |
| Message: | |
| - Input.$: $.body.message | |
| TopicArn: | |
| !Join [':', ['arn:aws:sns', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'GoodHumansNotifications']] | |
| Next: End_HR_Process | |
| Send_HR_Process_Error_Message: | |
| Type: Task | |
| InputPath: $ | |
| Resource: | |
| arn:aws:states:::sns:publish | |
| Parameters: | |
| Subject: '[FAILED] Merge HR File List Error' | |
| Message: | |
| - Input.$: $ | |
| TopicArn: | |
| !Join [':', ['arn:aws:sns', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'GoodHumansNotifications']] | |
| Next: Exit_HR_Process_with_Failure | |
| Exit_HR_Process_with_Failure: | |
| Type: Fail | |
| Cause: 'Merge `03 Final Artwork` PDFs Error' | |
| Error: $ | |
| End_HR_Process: | |
| Type: Pass | |
| End: true | |
| - StartAt: Merge_LR_PDFs | |
| States: | |
| Merge_LR_PDFs: | |
| Type: Task | |
| Parameters: | |
| Resolution: 'LR' | |
| ResultPath: $ | |
| Resource: | |
| Fn::GetAtt: [mergePdfs, Arn] | |
| Catch: | |
| - ErrorEquals: [States.ALL] | |
| ResultPath: $ | |
| Next: Send_LR_Process_Error_Message | |
| Next: Upload_LR_PDF_to_Dropbox | |
| Upload_LR_PDF_to_Dropbox: | |
| Type: Task | |
| Resource: | |
| Fn::GetAtt: [uploadToDropbox, Arn] | |
| Catch: | |
| - ErrorEquals: [States.ALL] | |
| ResultPath: $ | |
| Next: Send_LR_Process_Error_Message | |
| Next: Send_LR_Process_Finished_Message | |
| Send_LR_Process_Finished_Message: | |
| Type: Task | |
| InputPath: $ | |
| Resource: | |
| arn:aws:states:::sns:publish | |
| Parameters: | |
| Subject: '[SUCCESS] `Proofs` PDFs Merged' | |
| Message: | |
| - Input.$: $.body.message | |
| TopicArn: | |
| !Join [':', ['arn:aws:sns', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'GoodHumansNotifications']] | |
| Next: End_LR_Process | |
| Send_LR_Process_Error_Message: | |
| Type: Task | |
| InputPath: $ | |
| Resource: | |
| arn:aws:states:::sns:publish | |
| Parameters: | |
| Subject: '[FAILED] Merge LR File List Error' | |
| Message: | |
| - Input.$: $ | |
| TopicArn: | |
| !Join [':', ['arn:aws:sns', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'GoodHumansNotifications']] | |
| Next: Exit_LR_Process_with_Failure | |
| Exit_LR_Process_with_Failure: | |
| Type: Fail | |
| Cause: 'Merge `Proofs` PDFs Error' | |
| Error: $ | |
| End_LR_Process: | |
| Type: Pass | |
| End: true | |
| Send_No_Files_Message: | |
| Type: Task | |
| Resource: | |
| arn:aws:states:::sns:publish | |
| Parameters: | |
| Subject: 'No Files to Download' | |
| Message: '[EXITED] This is not an error, it simply means there were no files found to merge since the last time we checked.' | |
| TopicArn: | |
| !Join [':', ['arn:aws:sns', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'GoodHumansNotifications']] | |
| Next: End_Process | |
| Send_Error_Message: | |
| Type: Task | |
| Resource: | |
| arn:aws:states:::sns:publish | |
| Parameters: | |
| Subject : '[FAILED] Merge File List Error' | |
| Message: | |
| - Input.$ : $ | |
| TopicArn: | |
| !Join [':', ['arn:aws:sns', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'GoodHumansNotifications']] | |
| Next: Exit_With_Failure | |
| Exit_With_Failure: | |
| Type : Fail | |
| Cause : 'Merge File List Error' | |
| Error : '' | |
| End_Process: | |
| Type: Pass | |
| End : true | |
| # ================================================================================================ | |
| # RESOURCES | |
| # ================================================================================================ | |
| resources: | |
| Resources: | |
| TriggerGetLatestCursor: | |
| Type: AWS::Events::Rule | |
| Properties: | |
| Name: 'Trigger-Get-Latest-Cursor' | |
| Description : 'Triggers getLatestCursor step function' | |
| ScheduleExpression : 'cron(30 5 ? * 1-6 *)' | |
| State : 'ENABLED' | |
| Targets : | |
| - Arn : !Join [ ':', [ 'arn:aws:states', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'stateMachine:sfGetLatestCursor' ]] | |
| Id : TriggerGetLatestCursorStepFunction | |
| RoleArn : !Join [ ':', [ 'arn:aws:iam:', !Ref 'AWS::AccountId', 'role/pdf-workflow-SfGetLatestCursorRole-1GXNYMTHZZLNX' ] ] | |
| TriggerMergePdfs: | |
| Type: AWS::Events::Rule | |
| Properties: | |
| Name: 'Trigger-Merge-PDFs' | |
| Description : 'Triggers mergePdfs step function' | |
| ScheduleExpression : 'cron(0 15 ? * 1-5 *)' | |
| State : 'ENABLED' | |
| Targets : | |
| - Arn : !Join [ ':', [ 'arn:aws:states', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'stateMachine:sfMergeFileList' ]] | |
| Id : TriggerMergePdfsStepFunction | |
| RoleArn : !Join [ ':', [ 'arn:aws:iam:', !Ref 'AWS::AccountId', 'role/pdf-workflow-SfMergeFileListRole-12UIYA0MAZF0R' ] ] | |
| errorMessages: | |
| Type: AWS::SNS::Topic | |
| Properties: | |
| DisplayName: 'Good Humans Workflow Notifications' | |
| TopicName: GoodHumansNotifications | |
| Subscription: | |
| - Endpoint: [email protected] | |
| Protocol: email | |
| storageBucket: | |
| Type: AWS::S3::Bucket | |
| Properties: | |
| BucketName: ${self:custom.s3BucketName} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment