code: 
  import pandas as pd
  import boto3
  import json
  
  
  
  import configparser
  config = configparser.ConfigParser()
  config.read_file(open('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")
  
  (DWH_DB_USER, DWH_DB_PASSWORD, DWH_DB)
  
  pd.DataFrame({"Param":
                    ["DWH_CLUSTER_TYPE", "DWH_NUM_NODES", "DWH_NODE_TYPE", "DWH_CLUSTER_IDENTIFIER", "DWH_DB", "DWH_DB_USER", "DWH_DB_PASSWORD", "DWH_PORT", "DWH_IAM_ROLE_NAME"],
                "Value":
                    [DWH_CLUSTER_TYPE, DWH_NUM_NODES, DWH_NODE_TYPE, DWH_CLUSTER_IDENTIFIER, DWH_DB, DWH_DB_USER, DWH_DB_PASSWORD, DWH_PORT, DWH_IAM_ROLE_NAME]
               })
  
  
  # # Create clients for IAM, EC2, S3 and Redshift
  
  # In[69]:
  
  
  import boto3
  
  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',aws_access_key_id=KEY,
                       aws_secret_access_key=SECRET,
                       region_name='us-west-2'
                    )
  
  redshift = boto3.client('redshift',
                         region_name="us-west-2",
                         aws_access_key_id=KEY,
                         aws_secret_access_key=SECRET
                         )
  
  
  
  sampleDbBucket =  s3.Bucket("awssampledbuswest2")
  for obj in sampleDbBucket.objects.filter(Prefix="ssbgz"):
      print(obj)
  
  
  
  from botocore.exceptions import ClientError
  
  #1.1 Create the role, 
  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 your 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']
  
  print(roleArn)
  
  
  # # STEP 2:  Redshift Cluster
  # 
  # - Create a RedShift Cluster
  
  
  # In[83]:
  
  
  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]  
      )
  except Exception as e:
      print(e)
  
  
  # ## 2.1 *Describe* the cluster to see its status
  
  
  
  
  def prettyRedshiftProps(props):
      pd.set_option('display.max_colwidth', -1)
      keysToShow = ["ClusterIdentifier", "NodeType", "ClusterStatus", "MasterUsername", "DBName", "Endpoint", "NumberOfNodes", 'VpcId']
      x = [(k, v) for k,v in props.items() if k in keysToShow]
      return pd.DataFrame(data=x, columns=["Key", "Value"])
  
  myClusterProps = redshift.describe_clusters(ClusterIdentifier=DWH_CLUSTER_IDENTIFIER)['Clusters'][0]
  prettyRedshiftProps(myClusterProps)
  
  
  # 2.2 Take note of the cluster <font color='red'> endpoint and role ARN </font> </h2>
  
  
  DWH_ENDPOINT = myClusterProps['Endpoint']['Address']
  DWH_ROLE_ARN = myClusterProps['IamRoles'][0]['IamRoleArn']
  print("DWH_ENDPOINT :: ", endpoint)
  print("DWH_ROLE_ARN :: ", roleArn)
  
  
  # ## STEP 3: Open an incoming  TCP port to access the cluster ednpoint
  
  # In[84]:
  
  
  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)
  
  
  # # STEP 4: Make sure you can connect to the cluster
  
  
  
  get_ipython().run_line_magic('load_ext', 'sql')
  
  
  
  
  conn_string="postgresql://{}:{}@{}:{}/{}".format(DWH_DB_USER, DWH_DB_PASSWORD, DWH_ENDPOINT, DWH_PORT,DWH_DB)
  print(conn_string)
  get_ipython().run_line_magic('sql', '$conn_string')
  
  
  
apis: pandas.DataFrame pandas.set_option