text: #!/usr/bin/python3
  
  import sys
  import configparser
  import boto3
  import pandas as pd
  import time
  
  import cluster_status
  
  
  def main():
      # Get configuration data
      config = configparser.ConfigParser()
      config.read_file(open('../config/dwh.cfg'))
  
      KEY = config.get('AWS', 'KEY')
      SECRET = config.get('AWS', 'SECRET')
  
      DWH_CLUSTER_TYPE = config.get("DWH", "DWH_CLUSTER_TYPE")
      DWH_NUM_NODES = config.get("DWH", "DWH_NUM_NODES")
      DWH_NODE_TYPE = config.get("DWH", "DWH_NODE_TYPE")
  
      DWH_CLUSTER_IDENTIFIER = config.get("DWH", "DWH_CLUSTER_IDENTIFIER")
      DWH_DB = config.get("DWH", "DWH_DB")
      DWH_DB_USER = config.get("DWH", "DWH_DB_USER")
      DWH_DB_PASSWORD = config.get("DWH", "DWH_DB_PASSWORD")
      DWH_PORT = config.get("DWH", "DWH_PORT")
  
      DWH_IAM_ROLE_NAME = config.get("DWH", "DWH_IAM_ROLE_NAME")
  
      # Create clients for AWS services
      ec2 = boto3.resource('ec2',
                           region_name="us-west-2",
                           aws_access_key_id=KEY,
                           aws_secret_access_key=SECRET
                           )
  
      s3 = boto3.resource('s3',
                          region_name="us-west-2",
                          aws_access_key_id=KEY,
                          aws_secret_access_key=SECRET
                          )
      iam = boto3.client('iam',
                         region_name="us-east-1",
                         aws_access_key_id=KEY,
                         aws_secret_access_key=SECRET)
      redshift = boto3.client('redshift',
                              region_name="us-east-1",
                              aws_access_key_id=KEY,
                              aws_secret_access_key=SECRET)
  
      print("Cluster status prior to creation: ")
      # cluster_status.main()
  
      # Create IAM role if it does not exist
      try:
          print('1.1 Creating a new IAM Role')
          dwhRole = iam.create_role(
              Path='/',
              RoleName=DWH_IAM_ROLE_NAME,
              Description="allows redshift clusters to call AWS services on my behalf",
              AssumeRolePolicyDocument=json.dumps(
                  {'Statement': [{'Action': 'sts:AssumeRole',
                                  'Effect': 'Allow',
                                  'Principal': {'Service': 'redshift.amazonaws.com'}}],
                   'Version': '2012-10-17'})
          )
  
      except Exception as e:
          print(e)
  
      print('1.2 Attaching Policy')
      iam.attach_role_policy(RoleName=DWH_IAM_ROLE_NAME,
                             PolicyArn="arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
                             )['ResponseMetadata']['HTTPStatusCode']
  
      print("1.3 Get the IAM role ARN")
      roleArn = iam.get_role(RoleName=DWH_IAM_ROLE_NAME)['Role']['Arn']
  
      # Create Redshift cluster
      try:
          response = redshift.create_cluster(
              # HW
              ClusterType=DWH_CLUSTER_TYPE,
              NodeType=DWH_NODE_TYPE,
              NumberOfNodes=int(DWH_NUM_NODES),
  
              #Identifiers & Credentials
              DBName=DWH_DB,
              ClusterIdentifier=DWH_CLUSTER_IDENTIFIER,
              MasterUsername=DWH_DB_USER,
              MasterUserPassword=DWH_DB_PASSWORD,
  
              # Roles (for s3 access)
              IamRoles=[roleArn]
          )
          print("Cluster creating...")
      except Exception as e:
          print(e)
  
      # Wait a moment for cluster to spin up
      time.sleep(1.5)
      print("Cluster status after creation: ")
      cluster_status.main()
  
      # Ensure VPC is configured correctly. See below code if
      # troubleshooting needed. Only run code when cluster is
      # available.
      '''
      DWH_ENDPOINT = myClusterProps['Endpoint']['Address']
      DWH_ROLE_ARN = myClusterProps['IamRoles'][0]['IamRoleArn']
      print("DWH_ENDPOINT :: ", endpoint)
      print("DWH_ROLE_ARN :: ", roleArn)
  
      try:
          vpc = ec2.Vpc(id=myClusterProps['VpcId'])
          defaultSg = list(vpc.security_groups.all())[0]
          print(defaultSg)
          defaultSg.authorize_ingress(
              GroupName=defaultSg.group_name,
              CidrIp='0.0.0.0/0',
              IpProtocol='TCP',
              FromPort=int(DWH_PORT),
              ToPort=int(DWH_PORT)
          )
      except Exception as e:
          print(e)
      '''
  
  
  if __name__ == "__main__":
      main()
  