"RedshiftCluster",
    ClusterType=Ref("ClusterType"),
    NumberOfNodes=If("IsMultiNodeCluster",
                     Ref("NumberOfNodes"), Ref("AWS::NoValue")),
    NodeType=Ref("NodeType"),
    DBName=Ref("DatabaseName"),
    MasterUsername=Ref("MasterUsername"),
    MasterUserPassword=Ref("MasterUserPassword"),
    ClusterParameterGroupName=Ref("RedshiftClusterParameterGroup"),
    VpcSecurityGroupIds=Ref("SecurityGroup"),
    ClusterSubnetGroupName=Ref("RedshiftClusterSubnetGroup"),
))

amazonredshiftparameter1 = AmazonRedshiftParameter(
    "AmazonRedshiftParameter1",
    ParameterName="enable_user_activity_logging",
    ParameterValue="true",
)

redshiftclusterparametergroup = t.add_resource(ClusterParameterGroup(
    "RedshiftClusterParameterGroup",
    Description="Cluster parameter group",
    ParameterGroupFamily="redshift-1.0",
    Parameters=[amazonredshiftparameter1],
))

redshiftclustersubnetgroup = t.add_resource(ClusterSubnetGroup(
    "RedshiftClusterSubnetGroup",
    Description="Cluster subnet group",
    SubnetIds=Ref("Subnet"),
))
Exemple #2
0
def emit_configuration():
    vpc = cfn.vpcs[0]

    dbname = template.add_parameter(
        Parameter('RedshiftDatabaseName',
                  Description='The name of database to create within redshift',
                  Type="String",
                  Default="farragut",
                  AllowedPattern="[a-z0-9]*",
                  ConstraintDescription="Must be alphanumeric"))

    clustertype = template.add_parameter(
        Parameter('RedshiftClusterType',
                  Description="The type of cluster to build",
                  Type="String",
                  Default="single-node",
                  AllowedValues=["single-node", "multi-node"]))

    numberofnodes = template.add_parameter(
        Parameter(
            "RedshiftNumberOfNodes",
            Description="The number of compute nodes in the redshift cluster. "
            "When cluster type is specified as: 1) single-node, the NumberOfNodes "
            "parameter should be specified as 1, 2) multi-node, the NumberOfNodes "
            "parameter should be greater than 1",
            Type="Number",
            Default="1",
        ))

    nodetype = template.add_parameter(
        Parameter(
            "RedshiftNodeType",
            Description=
            "The node type to be provisioned for the redshift cluster",
            Type="String",
            Default="dw2.large",
        ))

    masterusername = template.add_parameter(
        Parameter("RedshiftMasterUsername",
                  Description=
                  "The user name associated with the master user account for "
                  "the redshift cluster that is being created",
                  Type="String",
                  Default="sa",
                  AllowedPattern="([a-z])([a-z]|[0-9])*"))

    masteruserpassword = template.add_parameter(
        Parameter(
            "RedshiftMasterUserPassword",
            Description=
            "The password associated with the master user account for the "
            "redshift cluster that is being created.",
            Type="String",
            NoEcho=True,
            Default="LeafLeaf123"))

    ingress_rules = [
        SecurityGroupRule(IpProtocol=p[0],
                          CidrIp=DEFAULT_ROUTE,
                          FromPort=p[1],
                          ToPort=p[1]) for p in [('tcp', 5439)]
    ]

    rs_security_group = template.add_resource(
        SecurityGroup(
            "RedshiftSecurityGroup",
            GroupDescription="SecurityGroup for the {0} Redshift cluster".
            format(CLOUDENV),
            VpcId=Ref(vpc),
            SecurityGroupIngress=ingress_rules,
            DependsOn=vpc.title))

    cluster_subnet_group = template.add_resource(
        ClusterSubnetGroup(
            "RedshiftClusterSubnetGroup",
            Description="Redshift {0} cluster subnet group".format(CLOUDENV),
            SubnetIds=[
                Ref(sn)
                for sn in cfn.get_vpc_subnets(vpc, cfn.SubnetTypes.DATABASE)
            ],
            DependsOn=[
                sn.title
                for sn in cfn.get_vpc_subnets(vpc, cfn.SubnetTypes.DATABASE)
            ]))

    conditions = {
        "IsMultiNodeCluster": Equals(Ref("RedshiftClusterType"), "multi-mode"),
    }

    for k in conditions:
        template.add_condition(k, conditions[k])

    redshiftcluster = template.add_resource(
        Cluster("RedshiftCluster",
                ClusterType=Ref("RedshiftClusterType"),
                NumberOfNodes=If("IsMultiNodeCluster",
                                 Ref("RedshiftNumberOfNodes"),
                                 Ref("AWS::NoValue")),
                NodeType=Ref("RedshiftNodeType"),
                DBName=Ref("RedshiftDatabaseName"),
                MasterUsername=Ref("RedshiftMasterUsername"),
                MasterUserPassword=Ref("RedshiftMasterUserPassword"),
                ClusterParameterGroupName=Ref("RedshiftClusterParameterGroup"),
                DeletionPolicy="Snapshot",
                ClusterSubnetGroupName=Ref(cluster_subnet_group),
                VpcSecurityGroupIds=[Ref("RedshiftSecurityGroup")],
                DependsOn=[
                    cluster_subnet_group.title, rs_security_group.title
                ]))

    log_activity_parameter = AmazonRedshiftParameter(
        "AmazonRedshiftParameterEnableUserLogging",
        ParameterName="enable_user_activity_logging",
        ParameterValue="true",
    )

    redshiftclusterparametergroup = template.add_resource(
        ClusterParameterGroup(
            "RedshiftClusterParameterGroup",
            Description="Cluster parameter group",
            ParameterGroupFamily="redshift-1.0",
            Parameters=[log_activity_parameter],
        ))

    template.add_output(
        Output(
            "RedshiftClusterEndpoint",
            Value=Join(":", [
                GetAtt(redshiftcluster, "Endpoint.Address"),
                GetAtt(redshiftcluster, "Endpoint.Port")
            ]),
        ))