AWSTemplateFormatVersion: "2010-09-09"
Description: "Lambda function to check status for emr job and to update dynamodb."
Parameters:
  paramCheckEmrStatusLambdaFunctionName:
    Type: "String"
    AllowedPattern: "^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$"
    Default: "makeshift-aws-blog-check-emr-status-lambda"
    AllowedValues: ["makeshift-aws-blog-check-emr-status-lambda"]
  paramGetJobStatusLambdaFunctionName:
    Type: "String"
    AllowedPattern: "^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$"
    Default: "makeshift-aws-blog-get-job-status-lambda"
    AllowedValues: ["makeshift-aws-blog-get-job-status-lambda"]

Resources:
  LambdaExecutionRole:
    Type: "AWS::IAM::Role"
    Properties:
      RoleName: "makeshift-aws-blog-iam-role"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Action:
              - "sts:AssumeRole"
            Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
      Policies:
        - PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action:
                  - "logs:CreateLogGroup"
                  - "logs:CreateLogStream"
                  - "logs:PutLogEvents"
                Effect: "Allow"
                Resource:
                  - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${paramCheckEmrStatusLambdaFunctionName}:*"
          PolicyName: "makeshift-lambda-loggroup-iam-policy"

        - PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action:
                  - "elasticmapreduce:DescribeStep"
                  - "elasticmapreduce:ListSteps"
                  - "elasticmapreduce:DescribeCluster"
                  - "elasticmapreduce:AddTags"
                  - "elasticmapreduce:ListClusters"
                Effect: "Allow"
                Resource:
                  - "*"
                Condition:
                  ForAllValues:StringEquals:
                    "elasticmapreduce:ResourceTag/created-by": makeshift-demo
          PolicyName: "makeshift-lambda-emr-iam-policy"

        - PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action:
                  - "dynamodb:PutItem"
                  - "dynamodb:UpdateItem"
                Effect: "Allow"
                Resource:
                  Fn::ImportValue: "MakeshiftBlogDynamodbTableArn"
                  #- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/makeshift-jobstatus-table"
          PolicyName: "makeshift-lambda-ddb-iam-policy"

  GetJobStatusLambdaExecutionRole:
    Type: "AWS::IAM::Role"
    Properties:
      RoleName: "makeshift-lambda-getjobstatus-iam-role"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Action:
              - "sts:AssumeRole"
            Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
      Policies:
        - PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action:
                  - "logs:CreateLogGroup"
                  - "logs:CreateLogStream"
                  - "logs:PutLogEvents"
                Effect: "Allow"
                Resource:
                  - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${paramGetJobStatusLambdaFunctionName}:*"
          PolicyName: "makeshift-lambda-getjobstatus-loggroup-iam-policy"

        - PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action:
                  - "dynamodb:GetItem"
                  - "dynamodb:Scan"
                Effect: "Allow"
                Resource:
                  Fn::ImportValue: "MakeshiftBlogDynamodbTableArn"
                  #- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/makeshift-jobstatus-table"
          PolicyName: "makeshift-lambda-getjobstatus-ddb-iam-policy"

  UpdateStatusLambda:
    Type: "AWS::Lambda::Function"
    Properties:
      FunctionName: !Ref paramCheckEmrStatusLambdaFunctionName
      Code:
        #S3Bucket: !Sub 'makeshift-demo-${AWS::Region}-${AWS::AccountId}'
        S3Bucket:
            Fn::ImportValue: "MakeshiftDemoBucketName"
        S3Key: "makeshift-lambdas.jar"
      Description: "check status of EMR job."
      Handler: "com.dataanalytics.awsblogs.UpdateStatusLambda::handleRequest"
      MemorySize: 256
      Role: !GetAtt "LambdaExecutionRole.Arn"
      Runtime: "java8"
      Timeout: 300

  GetJobStatusLambda:
      Type: "AWS::Lambda::Function"
      Properties:
        FunctionName: !Ref "paramGetJobStatusLambdaFunctionName"
        Code:
          #S3Bucket: !Sub 'makeshift-demo-${AWS::Region}-${AWS::AccountId}'
          S3Bucket:
              Fn::ImportValue: "MakeshiftDemoBucketName"
          S3Key: "makeshift-lambdas.jar"
        Description: "check status of EMR job."
        Handler: "com.dataanalytics.awsblogs.GetStatusLambda::handleRequest"
        MemorySize: 256
        Role: !GetAtt "GetJobStatusLambdaExecutionRole.Arn"
        Runtime: "java8"
        Timeout: 300

Outputs:
  UpdateStatusLambdaArn:
    Description: "The check job status Lambda Arn"
    Value: !GetAtt UpdateStatusLambda.Arn
    Export:
      Name: "UpdateStatusLambdaArn"

  UpdateStatusLambdaName:
    Description: "The check job status Lambda Name"
    Value: !Ref UpdateStatusLambda
    Export:
      Name: "UpdateStatusLambdaName"

  LambdaExecutionRoleArn:
    Description: "The Lambda execution role Arn"
    Value: !GetAtt LambdaExecutionRole.Arn
    Export:
        Name: "UpdateStatusLambdaExecutionRoleArn"

  GetJobStatusLambdaArn:
    Description: "The check job status Lambda Arn"
    Value: !GetAtt GetJobStatusLambda.Arn
    Export:
      Name: "GetJobStatusLambdaArn"

  GetJobStatusLambdaName:
    Description: "The check job status Lambda Name"
    Value: !Ref GetJobStatusLambda
    Export:
      Name: "GetJobStatusLambdaName"

  GetJobStatusLambdaExecutionRoleArn:
    Description: "The Lambda execution role Arn"
    Value: !GetAtt GetJobStatusLambdaExecutionRole.Arn
    Export:
        Name: "makeshift-lambda-getjobstatus-iam-role-arn"