Last active
January 17, 2019 09:25
-
-
Save kangks/1e5995c73779abedbf311c6c2de6baab to your computer and use it in GitHub Desktop.
AWS Cloudformation for Ec2 with Postgres 96
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "AWSTemplateFormatVersion": "2010-09-09", | |
| "Description": "Create Linux EC2 with postgresql96", | |
| "Metadata": { | |
| "Comment": "Postgres 9.6 on a r3.8xlarge + 20G EBS in a privateSubnet, and pgbench in publicSubnet" | |
| }, | |
| "Parameters": { | |
| "Ec2KeyNameParam": { | |
| "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instance", | |
| "Type": "AWS::EC2::KeyPair::KeyName", | |
| "ConstraintDescription": "must be the name of an existing EC2 KeyPair." | |
| }, | |
| "Ec2Az": { | |
| "Description": "EC2 Availability Zone", | |
| "Type": "AWS::EC2::AvailabilityZone::Name", | |
| "ConstraintDescription": "AZ for Ec2" | |
| }, | |
| "DBInstanceType": { | |
| "Description": "Postgres EC2 instance type", | |
| "Type": "String", | |
| "Default": "r3.8xlarge", | |
| "AllowedValues": [ | |
| "t1.micro", | |
| "t2.micro", | |
| "t2.small", | |
| "t2.medium", | |
| "m1.small", | |
| "m1.medium", | |
| "m1.large", | |
| "m1.xlarge", | |
| "m2.xlarge", | |
| "m2.2xlarge", | |
| "m2.4xlarge", | |
| "m3.medium", | |
| "m3.large", | |
| "m3.xlarge", | |
| "m3.2xlarge", | |
| "c1.medium", | |
| "c1.xlarge", | |
| "c3.large", | |
| "c3.xlarge", | |
| "c3.2xlarge", | |
| "c3.4xlarge", | |
| "c3.8xlarge", | |
| "g2.2xlarge", | |
| "r3.large", | |
| "r3.xlarge", | |
| "r3.2xlarge", | |
| "r3.4xlarge", | |
| "r3.8xlarge", | |
| "i2.xlarge", | |
| "i2.2xlarge", | |
| "i2.4xlarge", | |
| "i2.8xlarge", | |
| "hi1.4xlarge", | |
| "hs1.8xlarge", | |
| "cr1.8xlarge", | |
| "cc2.8xlarge", | |
| "cg1.4xlarge" | |
| ], | |
| "ConstraintDescription": "Must be a valid EC2 instance type" | |
| }, | |
| "BenchmarckInstanceType": { | |
| "Description": "Postbench EC2 instance type", | |
| "Type": "String", | |
| "Default": "t2.micro", | |
| "AllowedValues": [ | |
| "t1.micro", | |
| "t2.micro", | |
| "t2.small", | |
| "t2.medium", | |
| "m1.small", | |
| "m1.medium", | |
| "m1.large", | |
| "m1.xlarge", | |
| "m2.xlarge", | |
| "m2.2xlarge", | |
| "m2.4xlarge", | |
| "m3.medium", | |
| "m3.large", | |
| "m3.xlarge", | |
| "m3.2xlarge", | |
| "c1.medium", | |
| "c1.xlarge", | |
| "c3.large", | |
| "c3.xlarge", | |
| "c3.2xlarge", | |
| "c3.4xlarge", | |
| "c3.8xlarge", | |
| "g2.2xlarge", | |
| "r3.large", | |
| "r3.xlarge", | |
| "r3.2xlarge", | |
| "r3.4xlarge", | |
| "r3.8xlarge", | |
| "i2.xlarge", | |
| "i2.2xlarge", | |
| "i2.4xlarge", | |
| "i2.8xlarge", | |
| "hi1.4xlarge", | |
| "hs1.8xlarge", | |
| "cr1.8xlarge", | |
| "cc2.8xlarge", | |
| "cg1.4xlarge" | |
| ], | |
| "ConstraintDescription": "Must be a valid EC2 instance type" | |
| } | |
| }, | |
| "Mappings": { | |
| "AWSInstanceType2Arch": { | |
| "t1.micro": { | |
| "Arch": "PV64" | |
| }, | |
| "t2.micro": { | |
| "Arch": "HVM64" | |
| }, | |
| "t2.small": { | |
| "Arch": "HVM64" | |
| }, | |
| "t2.medium": { | |
| "Arch": "HVM64" | |
| }, | |
| "m1.small": { | |
| "Arch": "PV64" | |
| }, | |
| "m1.medium": { | |
| "Arch": "PV64" | |
| }, | |
| "m1.large": { | |
| "Arch": "PV64" | |
| }, | |
| "m1.xlarge": { | |
| "Arch": "PV64" | |
| }, | |
| "m2.xlarge": { | |
| "Arch": "PV64" | |
| }, | |
| "m2.2xlarge": { | |
| "Arch": "PV64" | |
| }, | |
| "m2.4xlarge": { | |
| "Arch": "PV64" | |
| }, | |
| "m3.medium": { | |
| "Arch": "HVM64" | |
| }, | |
| "m3.large": { | |
| "Arch": "HVM64" | |
| }, | |
| "m3.xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "m3.2xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "c1.medium": { | |
| "Arch": "PV64" | |
| }, | |
| "c1.xlarge": { | |
| "Arch": "PV64" | |
| }, | |
| "c3.large": { | |
| "Arch": "HVM64" | |
| }, | |
| "c3.xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "c3.2xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "c3.4xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "c3.8xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "g2.2xlarge": { | |
| "Arch": "HVMG2" | |
| }, | |
| "r3.large": { | |
| "Arch": "HVM64" | |
| }, | |
| "r3.xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "r3.2xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "r3.4xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "r3.8xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "i2.xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "i2.2xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "i2.4xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "i2.8xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "hi1.4xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "hs1.8xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "cr1.8xlarge": { | |
| "Arch": "HVM64" | |
| }, | |
| "cc2.8xlarge": { | |
| "Arch": "HVM64" | |
| } | |
| }, | |
| "AWSRegionArch2AMI": { | |
| "us-east-1": { | |
| "PV64": "ami-0b4cfd60", | |
| "HVM64": "ami-2ccae744" | |
| }, | |
| "us-west-2": { | |
| "PV64": "", | |
| "HVM64": "" | |
| }, | |
| "us-west-1": { | |
| "PV64": "", | |
| "HVM64": "" | |
| }, | |
| "eu-west-1": { | |
| "PV64": "", | |
| "HVM64": "" | |
| }, | |
| "ap-southeast-1": { | |
| "PV64": "", | |
| "HVM64": "" | |
| }, | |
| "ap-northeast-1": { | |
| "PV64": "", | |
| "HVM64": "" | |
| }, | |
| "ap-southeast-2": { | |
| "PV64": "", | |
| "HVM64": "" | |
| }, | |
| "sa-east-1": { | |
| "PV64": "", | |
| "HVM64": "" | |
| }, | |
| "cn-north-1": { | |
| "PV64": "", | |
| "HVM64": "" | |
| }, | |
| "eu-central-1": { | |
| "PV64": "", | |
| "HVM64": "" | |
| } | |
| } | |
| }, | |
| "Outputs": {}, | |
| "Resources": { | |
| "PostgresVPC" : { | |
| "Type" : "AWS::EC2::VPC", | |
| "Properties" : { | |
| "CidrBlock" : "10.10.0.0/16", | |
| "Tags" : [ | |
| { | |
| "Key" : "Name", | |
| "Value" : | |
| { "Fn::Join": | |
| [ | |
| "-", | |
| [ | |
| {"Ref": "AWS::StackName" }, | |
| "vpc" | |
| ] | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| "SGSSHPostgresSecurityGroup": { | |
| "Type": "AWS::EC2::SecurityGroup", | |
| "Properties": { | |
| "GroupDescription": "Security group for ingress SSH and Postgres traffic", | |
| "SecurityGroupIngress": [ | |
| { | |
| "CidrIp": "0.0.0.0/0", | |
| "IpProtocol": "tcp", | |
| "FromPort": "22", | |
| "ToPort": "22" | |
| }, | |
| { | |
| "CidrIp": "0.0.0.0/0", | |
| "IpProtocol": "tcp", | |
| "FromPort": "5432", | |
| "ToPort": "5432" | |
| }, | |
| { | |
| "CidrIp": "10.10.0.0/16", | |
| "IpProtocol": "-1", | |
| "FromPort": "0", | |
| "ToPort": "65535" | |
| } | |
| ], | |
| "SecurityGroupEgress": [ | |
| { | |
| "CidrIp": "10.10.0.0/16", | |
| "IpProtocol": "-1", | |
| "FromPort": "0", | |
| "ToPort": "65535" | |
| }, | |
| { | |
| "CidrIp": "0.0.0.0/0", | |
| "IpProtocol": "tcp", | |
| "FromPort": "80", | |
| "ToPort": "80" | |
| }, | |
| { | |
| "CidrIp": "0.0.0.0/0", | |
| "IpProtocol": "tcp", | |
| "FromPort": "443", | |
| "ToPort": "443" | |
| }, | |
| { | |
| "CidrIp": "0.0.0.0/0", | |
| "IpProtocol": "icmp", | |
| "FromPort": "-1", | |
| "ToPort": "-1" | |
| } | |
| ], | |
| "VpcId": { "Ref": "PostgresVPC"} | |
| } | |
| }, | |
| "publicSubnet" : { | |
| "Type" : "AWS::EC2::Subnet", | |
| "Properties" : { | |
| "VpcId" : { "Ref" : "PostgresVPC" }, | |
| "CidrBlock" : "10.10.1.0/24", | |
| "AvailabilityZone" : { | |
| "Ref": "Ec2Az" | |
| }, | |
| "Tags" : [ | |
| { | |
| "Key" : "Name", | |
| "Value" : | |
| { "Fn::Join": | |
| [ | |
| "-", | |
| [ | |
| {"Ref": "AWS::StackName" }, | |
| "public" | |
| ] | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| "privateSubnet" : { | |
| "Type" : "AWS::EC2::Subnet", | |
| "Properties" : { | |
| "VpcId" : { "Ref" : "PostgresVPC" }, | |
| "CidrBlock" : "10.10.2.0/24", | |
| "AvailabilityZone" : { | |
| "Ref": "Ec2Az" | |
| }, | |
| "Tags" : [ | |
| { | |
| "Key" : "Name", | |
| "Value" : | |
| { "Fn::Join": | |
| [ | |
| "-", | |
| [ | |
| {"Ref": "AWS::StackName" }, | |
| "private" | |
| ] | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| "PostgresEc2": { | |
| "Type": "AWS::EC2::Instance", | |
| "Properties": { | |
| "ImageId": { | |
| "Fn::FindInMap": [ | |
| "AWSRegionArch2AMI", | |
| { | |
| "Ref": "AWS::Region" | |
| }, | |
| { | |
| "Fn::FindInMap": [ | |
| "AWSInstanceType2Arch", | |
| { | |
| "Ref": "DBInstanceType" | |
| }, | |
| "Arch" | |
| ] | |
| } | |
| ] | |
| }, | |
| "InstanceType": { | |
| "Ref": "DBInstanceType" | |
| }, | |
| "KeyName": { | |
| "Ref": "Ec2KeyNameParam" | |
| }, | |
| "AvailabilityZone": { | |
| "Ref": "Ec2Az" | |
| }, | |
| "BlockDeviceMappings": [ | |
| { | |
| "DeviceName": "/dev/sdm", | |
| "Ebs": { | |
| "VolumeType": "io1", | |
| "Iops": "200", | |
| "DeleteOnTermination": "false", | |
| "VolumeSize": "20" | |
| } | |
| } | |
| ], | |
| "NetworkInterfaces": [ | |
| { | |
| "AssociatePublicIpAddress": "false", | |
| "DeviceIndex": "0", | |
| "GroupSet": [ | |
| { | |
| "Ref": "SGSSHPostgresSecurityGroup" | |
| } | |
| ], | |
| "SubnetId": { | |
| "Ref": "privateSubnet" | |
| } | |
| } | |
| ], | |
| "Tags" : [ | |
| { | |
| "Key" : "Name", | |
| "Value" : | |
| { "Fn::Join": | |
| [ | |
| "-", | |
| [ | |
| "postgres", | |
| {"Ref": "AWS::StackName" } | |
| ] | |
| ] | |
| } | |
| } | |
| ], | |
| "UserData": { | |
| "Fn::Base64": { | |
| "Fn::Join": [ | |
| "", | |
| [ | |
| "#!/bin/bash -xe\n", | |
| "mkfs -t ext4 /dev/xvdm\n", | |
| "mkdir /opt/mount1\n", | |
| "echo \"/dev/xvdm /opt/mount1 ext4 defaults,nofail 0 2\" >> /etc/fstab \n", | |
| "mount -a\n", | |
| "rpm -i https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-ami201503-96-9.6-2.noarch.rpm && ", | |
| "yum update -y && ", | |
| "yum install -y postgresql96 postgresql96-server postgresql96-libs postgresql96-contrib openssh-clients git\n", | |
| "mkdir -p /opt/mount1/pg96 && chown postgres:postgres /opt/mount1/pg96 &&", | |
| "echo \"PGDATA=/opt/mount1/pg96\" > /etc/sysconfig/pgsql/postgresql-9.6\n", | |
| "/etc/init.d/postgresql-9.6 initdb && ", | |
| "cp -p /opt/mount1/pg96/postgresql.conf /opt/mount1/pg96/postgresql.conf.bak && ", | |
| "echo \"listen_addresses '*'\" >> /opt/mount1/pg96/postgresql.conf;\n", | |
| "echo \"host all all 10.10.0.0/16 trust\" >> /opt/mount1/pg96/pg_hba.conf;\n", | |
| "/etc/init.d/postgresql-9.6 start && ", | |
| "chkconfig postgresql-9.6 on && ", | |
| "sudo -u postgres psql -c 'SELECT version();'" | |
| ] | |
| ] | |
| } | |
| } | |
| } | |
| }, | |
| "PostbenchEc2": { | |
| "Type": "AWS::EC2::Instance", | |
| "Properties": { | |
| "ImageId": { | |
| "Fn::FindInMap": [ | |
| "AWSRegionArch2AMI", | |
| { | |
| "Ref": "AWS::Region" | |
| }, | |
| { | |
| "Fn::FindInMap": [ | |
| "AWSInstanceType2Arch", | |
| { | |
| "Ref": "BenchmarckInstanceType" | |
| }, | |
| "Arch" | |
| ] | |
| } | |
| ] | |
| }, | |
| "InstanceType": { | |
| "Ref": "BenchmarckInstanceType" | |
| }, | |
| "KeyName": { | |
| "Ref": "Ec2KeyNameParam" | |
| }, | |
| "AvailabilityZone":{ | |
| "Ref": "Ec2Az" | |
| }, | |
| "BlockDeviceMappings": [ | |
| { | |
| "DeviceName": "/dev/sdm", | |
| "Ebs": { | |
| "VolumeType": "io1", | |
| "Iops": "200", | |
| "DeleteOnTermination": "false", | |
| "VolumeSize": "20" | |
| } | |
| } | |
| ], | |
| "NetworkInterfaces": [ | |
| { | |
| "AssociatePublicIpAddress": "false", | |
| "DeviceIndex": "0", | |
| "GroupSet": [ | |
| { | |
| "Ref": "SGSSHPostgresSecurityGroup" | |
| } | |
| ], | |
| "SubnetId": { | |
| "Ref": "publicSubnet" | |
| } | |
| } | |
| ], | |
| "Tags" : [ | |
| { | |
| "Key" : "Name", | |
| "Value" : | |
| { "Fn::Join": | |
| [ | |
| "-", | |
| [ | |
| "pgbench", | |
| {"Ref": "AWS::StackName" } | |
| ] | |
| ] | |
| } | |
| } | |
| ], | |
| "UserData": { | |
| "Fn::Base64": { | |
| "Fn::Join": [ | |
| "", | |
| [ | |
| "#!/bin/bash -xe\n", | |
| "rpm -i https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-ami201503-96-9.6-2.noarch.rpm && ", | |
| "yum update -y && ", | |
| "yum install -y postgresql96 postgresql96-libs postgresql96-contrib openssh-clients git\n", | |
| "echo '/usr/pgsql-9.6/bin/pgbench -h ${PGHOST} -U postgres -p 5432 -i -s 100 && /usr/pgsql-9.6/bin/pgbench -U postgres -c16 -j8 -T60 -h ${PGHOST} -p 5432' > /tmp/pgbench.bash;" | |
| ] | |
| ] | |
| } | |
| } | |
| } | |
| }, | |
| "publicEc2EIP": { | |
| "Type": "AWS::EC2::EIP", | |
| "DependsOn": [ "PostbenchEc2" ], | |
| "Properties": { | |
| "InstanceId": { | |
| "Ref": "PostbenchEc2" | |
| } | |
| } | |
| }, | |
| "postgresIGW" : { | |
| "Type" : "AWS::EC2::InternetGateway", | |
| "Properties" : { | |
| "Tags" : [ | |
| { | |
| "Key" : "Name", | |
| "Value" : {"Ref": "AWS::StackName" } | |
| } | |
| ] | |
| } | |
| }, | |
| "AttachInternetGateway" : { | |
| "Type" : "AWS::EC2::VPCGatewayAttachment", | |
| "Properties" : { | |
| "VpcId" : { "Ref" : "PostgresVPC" }, | |
| "InternetGatewayId" : { "Ref" : "postgresIGW" } | |
| } | |
| }, | |
| "publicRouteTable" : { | |
| "Type" : "AWS::EC2::RouteTable", | |
| "Properties" : { | |
| "VpcId" : { "Ref" : "PostgresVPC" }, | |
| "Tags" : [ | |
| { | |
| "Key" : "Name", | |
| "Value" : | |
| { "Fn::Join": | |
| [ | |
| "-", | |
| [ | |
| "public", | |
| {"Ref": "AWS::StackName" } | |
| ] | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| "publicRouteTableAssociation" : { | |
| "Type" : "AWS::EC2::SubnetRouteTableAssociation", | |
| "Properties" : { | |
| "SubnetId" : { "Ref" : "publicSubnet" }, | |
| "RouteTableId" : { "Ref" : "publicRouteTable" } | |
| } | |
| }, | |
| "publicIgwRoute" : { | |
| "Type" : "AWS::EC2::Route", | |
| "DependsOn" : "postgresIGW", | |
| "Properties" : { | |
| "RouteTableId" : { "Ref" : "publicRouteTable" }, | |
| "DestinationCidrBlock" : "0.0.0.0/0", | |
| "GatewayId" : { "Ref" : "postgresIGW" } | |
| } | |
| }, | |
| "NAT" : { | |
| "DependsOn" : "PostgresVPC", | |
| "Type" : "AWS::EC2::NatGateway", | |
| "Properties" : { | |
| "AllocationId" : { "Fn::GetAtt" : ["NatEIP", "AllocationId"]}, | |
| "SubnetId" : { "Ref" : "publicSubnet"} | |
| } | |
| }, | |
| "NatEIP" : { | |
| "Type" : "AWS::EC2::EIP", | |
| "Properties" : { | |
| "Domain" : "vpc" | |
| } | |
| }, | |
| "privateRouteTable" : { | |
| "Type" : "AWS::EC2::RouteTable", | |
| "Properties" : { | |
| "VpcId" : { "Ref" : "PostgresVPC" }, | |
| "Tags" : [ | |
| { | |
| "Key" : "Name", | |
| "Value" : | |
| { "Fn::Join": | |
| [ | |
| "-", | |
| [ | |
| "private", | |
| {"Ref": "AWS::StackName" } | |
| ] | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| "privateRoute" : { | |
| "Type" : "AWS::EC2::Route", | |
| "Properties" : { | |
| "RouteTableId" : { "Ref" : "privateRouteTable" }, | |
| "DestinationCidrBlock" : "0.0.0.0/0", | |
| "NatGatewayId" : { "Ref" : "NAT" } | |
| } | |
| }, | |
| "privateRouteTableAssociation" : { | |
| "Type" : "AWS::EC2::SubnetRouteTableAssociation", | |
| "Properties" : { | |
| "SubnetId" : { "Ref" : "privateSubnet" }, | |
| "RouteTableId" : { "Ref" : "privateRouteTable" } | |
| } | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment