AWSTemplateFormatVersion: "2010-09-09" Transform: AWS::Serverless-2016-10-31 Description: 3CX Ring Group After-Hours Scheduler Parameters: Timezone: Type: String Default: "America/New_York" ShiftTableName: Type: String Default: "afterhours-shifts" Description: DynamoDB table for Slack shift manager overrides Globals: Function: Runtime: python3.12 Timeout: 30 MemorySize: 128 Resources: SchedulerFunction: Type: AWS::Serverless::Function Properties: FunctionName: 3cx-ring-group-scheduler Handler: src/handler.handler CodeUri: . Environment: Variables: SSM_PREFIX: /3cx-scheduler TZ: !Ref Timezone SHIFT_TABLE: !Ref ShiftTableName Policies: - Statement: - Effect: Allow Action: - ssm:GetParametersByPath - ssm:GetParameter - ssm:GetParameters Resource: - !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/3cx-scheduler" - !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/3cx-scheduler/*" - Effect: Allow Action: - kms:Decrypt Resource: "*" Condition: StringEquals: "kms:ViaService": !Sub "ssm.${AWS::Region}.amazonaws.com" - Effect: Allow Action: - dynamodb:GetItem Resource: - !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${ShiftTableName}" Events: # EST: 8am ET = 13:00 UTC (Nov-Mar) DailyScheduleEST: Type: Schedule Properties: Schedule: cron(0 13 ? * * *) Description: "Update 3CX ring group at 8am EST (Nov-Mar)" Enabled: true # EDT: 8am ET = 12:00 UTC (Mar-Nov) DailyScheduleEDT: Type: Schedule Properties: Schedule: cron(0 12 ? * * *) Description: "Update 3CX ring group at 8am EDT (Mar-Nov)" Enabled: true # Weekend 5pm — switch from day shift to night shift person # EST: 5pm ET = 22:00 UTC (Nov-Mar) WeekendEveningEST: Type: Schedule Properties: Schedule: cron(0 22 ? * SAT,SUN *) Description: "Switch to night shift on weekends at 5pm EST (Nov-Mar)" Enabled: true # EDT: 5pm ET = 21:00 UTC (Mar-Nov) WeekendEveningEDT: Type: Schedule Properties: Schedule: cron(0 21 ? * SAT,SUN *) Description: "Switch to night shift on weekends at 5pm EDT (Mar-Nov)" Enabled: true # SSM Parameters: create these manually via CLI before deploying. # See setup instructions in the deploy section below. Outputs: FunctionArn: Value: !GetAtt SchedulerFunction.Arn FunctionName: Value: !Ref SchedulerFunction