Using AWS CLI to create our Cassandra EC2 instance from our custom AMI (Amazon image)
Earlier we used packer to create an Amazon Cassandra image - Amazon image (AMI).
Packer installs Cassandra on the AMI. Then we use the AMI to produce Amazon Cassandra EC2 instances. Now we can use that Amazon Cassandra AMI to create an Amazon Cassandra instance.
Packer building Amazon Cassandra AMI
We built the Amazon Cassandra image using
packer build
as follows.Building the AWS AMI
$ packer build packer-ec2.json
After the packer build completes, it will print out the name of the AMI image it created, e.g.,
ami-6db33abc
. Now it is time to use the Amazon CLI (aws cli) to create the ec2 instance.Using AWS CLI to create our Cassandra EC2 instance
The AWS Command Line Interface is the ultimate utility to DevOp manage your AWS services.
“With just one tool to download and configure, you can control multiple AWS services from the command line and automate them through scripts.” –AWS CLI Docs
The AWS command line tool does it all. You can create VPCs. You can run CloudFormations. You can even use it to back up the Amazon Cassandra Database snapshot files to S3. If you are working with AWS and doing DevOps, you must master the AWS CLI.
Automating Amazon Cassandra EC2 instance creation
Starting up an EC2 instance with the right, AMI id, IAM instance role, into the correct subnet, using the appropriate security groups, with the right AWS key-pair name can be tedious. We must automate as using the AWS console (GUI) is error prone (requires too much human intervention).
Instead of using the AWS console, we use the
aws
command line. We create four scripts to automate creating and connecting to EC2 instances:- bin/ec2-env.sh - setups common AWS references to subnets, security groups, key pairs
- bin/create-ec2-instance.sh - uses aws command line to create an ec2 instance
- bin/login-ec2-cassandra.sh Uses ssh to log into Cassandra node we are testing
- bin/get-IP-cassandra.sh Uses aws command line to get the public IP address of the cassandra instance
Note to parse the JSON coming back from the *aws command line we use
jq
. Note that jq is a lightweight command-line JSON processor. To download and install jq
see the jq download documents.bin/create-ec2-instance.sh Create an EC2 instance based on our new AMI from Packer
#!/bin/bash
set -e
source bin/ec2-env.sh
instance_id=$(aws ec2 run-instances --image-id "$AMI_CASSANDRA" --subnet-id "$SUBNET_CLUSTER" \
--instance-type m4.large --iam-instance-profile "Name=$IAM_PROFILE_CASSANDRA" \
--associate-public-ip-address --security-group-ids "$VPC_SECURITY_GROUP" \
--key-name "$KEY_NAME_CASSANDRA" | jq --raw-output .Instances[].InstanceId)
echo "${instance_id} is being created"
aws ec2 wait instance-exists --instance-ids "$instance_id"
aws ec2 create-tags --resources "${instance_id}" --tags Key=Name,Value="${EC2_INSTANCE_NAME}"
echo "${instance_id} was tagged waiting to login"
aws ec2 wait instance-status-ok --instance-ids "$instance_id"
bin/login-ec2-cassandra.sh
Notice we use the
aws ec2 wait
to ensure the instance is ready before we tag it and before we log into it.
All of the ids for the servers AWS resources we need to refer to are in
scripts/ec2-ens.sh
. Notice that all of our AWS/EC2 shell scripts load this env file source bin/ec2-env.sh
as follows:bin/ec2-env.sh common AWS resources exposed as ENV Vars
#!/bin/bash
set -e
export AMI_CASSANDRA=ami-6db33abc
export VPC_SECURITY_GROUP=sg-a8653123
export SUBNET_CLUSTER=subnet-dc0f2123
export KEY_NAME_CASSANDRA=cloudurable-us-west-2
export PEM_FILE="${HOME}/.ssh/${KEY_NAME_CASSANDRA}.pem"
export IAM_PROFILE_CASSANDRA=IAM_PROFILE_CASSANDRA
export EC2_INSTANCE_NAME=cassandra-node
Earlier we created an AWS key pair called
cloudurable-us-west-2
. You will need to create a VPC security group with ssh access. You should lock it down to only accept ssh connections from your IP. At this stage, you can use a default VPC, and for now use a public subnet. Replace the ids above with your subnet (SUBNET_CLUSTER
), your key pair (KEY_NAME_CASSANDRA
), your AMI (AMI_CASSANDRA
), and your IAM instance role (IAM_PROFILE_CASSANDRA
). The IAM instance role should have access to create logs and metrics for AWS CloudWatch.
The login script (
login-ec2-cassandra.sh
) uses ssh to log into the instance, but to know what IP to use, it uses get-IP-cassandra.sh
bin/login-ec2-cassandra.sh Log into new EC2 Cassandra Database instance using ssh
#!/bin/bash
set -e
source bin/ec2-env.sh
if [ ! -f "$PEM_FILE" ]; then
echo "Put your key file $PEM_FILE in your .ssh directory."
exit 1
fi
ssh -i "$PEM_FILE" centos@`bin/get-IP-cassandra.sh`
Ensure you create a key pair in AWS. Copy it to
~/.ssh
and then run chmod 400
on the pem file. Note the above script uses bin/get-IP-cassandra.sh
to get the IP address of the server as follows:bin/get-IP-cassandra.sh Get public IP address of new EC2 instance using aws cmdline
#!/bin/bash
set -e
source bin/ec2-env.sh
aws ec2 describe-instances --filters "Name=tag:Name,Values=${EC2_INSTANCE_NAME}" \
| jq --raw-output .Reservations[].Instances[].PublicIpAddress
Running bin/create-ec2-instance.sh
To run
bin/create-ec2-instance.sh
Running bin/create-ec2-instance.sh
$ bin/create-ec2-instance.sh
Let’s show how to check to see if everything is up and running.
Interactive session showing everything running
$ pwd
~/github/cassandra-image
$ bin/create-ec2-instance.sh
i-013daca3d11137a8c is being created
i-013daca3d11137a8c was tagged waiting to login
The authenticity of host '54.202.110.114 (54.202.110.114)' can't be established.
ECDSA key fingerprint is SHA256:asdfasdfasdfasdfasdf.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '54.202.110.114' (ECDSA) to the list of known hosts.
[centos@ip-172-31-5-57 ~]$ systemctl status cassandra
● cassandra.service - Cassandra Service
Loaded: loaded (/etc/systemd/system/cassandra.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2017-03-01 02:15:10 UTC; 14min ago
Process: 456 ExecStart=/opt/cassandra/bin/cassandra -p /opt/cassandra/PID (code=exited, status=0/SUCCESS)
Main PID: 5240 (java)
CGroup: /system.slice/cassandra.service
└─5240 java -Xloggc:/opt/cassandra/bin/../logs/gc.log -ea -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -XX:+HeapDumpOnOutOfMemoryError -Xss256k -XX:StringTableSize=1000003 -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:+U...
Mar 01 02:14:13 ip-172-31-22-103.us-west-2.compute.internal systemd[1]: Starting Cassandra Service...
Mar 01 02:15:10 ip-172-31-5-57 systemd[1]: Started Cassandra Service.
[centos@ip-172-31-5-57 ~]$ systemctl status metricds
Unit metricds.service could not be found.
[centos@ip-172-31-5-57 ~]$ systemctl status metricsd
● metricsd.service - MetricsD OS Metrics
Loaded: loaded (/etc/systemd/system/metricsd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2017-03-01 02:15:10 UTC; 14min ago
Main PID: 5243 (metricsd)
CGroup: /system.slice/metricsd.service
└─5243 /opt/cloudurable/bin/metricsd
Mar 01 02:25:15 ip-172-31-5-57 metricsd[5243]: INFO : [worker] - 2017/03/01 02:25:15 config.go:30: Loading config /etc/metricsd.conf
Mar 01 02:25:15 ip-172-31-5-57 metricsd[5243]: INFO : [worker] - 2017/03/01 02:25:15 config.go:46: Loading log...
[centos@ip-172-31-5-57 ~]$ systemctl status systemd-cloud-watch
● systemd-cloud-watch.service - SystemD Cloud Watch Sends Journald logs to CloudWatch
Loaded: loaded (/etc/systemd/system/systemd-cloud-watch.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2017-03-01 02:15:10 UTC; 15min ago
Main PID: 5241 (systemd-cloud-w)
CGroup: /system.slice/systemd-cloud-watch.service
└─5241 /opt/cloudurable/bin/systemd-cloud-watch /etc/systemd-cloud-watch.conf
Mar 01 02:30:44 ip-172-31-5-57 systemd-cloud-watch[5241]: main INFO: 2017/03/01 02:30:44 workers.go:138: Read record &{i-013daca3d11137a8c 1488335194775 5241 0 0 systemd-cloud-w /opt/cloudurable/bin/systemd-cloud-watch /opt/cloudurable/bin...
...
Mar 01 02:30:44 ip-172-31-5-57 systemd-cloud-watch[5241]: main INFO: 2017/03/01 02:30:44 workers.go:138: Read record &{i-013daca3d11137a8c 1488335194776 5241 0 0 systemd-cloud-w /opt/cloudurable/bin/systemd-cloud-watch /opt...7f10a2c35de4098
Mar 01 02:30:44 ip-172-31-5-57 systemd-cloud-watch[5241]: repeater INFO: 2017/03/01 02:30:44 cloudwatch_journal_repeater.go:209: SENT SUCCESSFULLY
Mar 01 02:30:44 ip-172-31-5-57 systemd-cloud-watch[5241]: repeater
We used
systemctl status systemd-cloud-watch
, systemctl status cassandra
, and systemctl status metricsd
to ensure it is all working.Cassandra Tutorial: Cassandra Cluster DevOps/DBA series
The first tutorial in this Cassandra tutorial series focused on setting up a Cassandra Cluster. The first Cassandra tutorial setting up a Cassandra cluster with Vagrant (also appeared on DZone with some additional content DZone Setting up a Cassandra Cluster with Vagrant. The second article in this series was about setting up SSL for a Cassandra cluster using Vagrant (which also appeared with more content as DZone Setting up a Cassandra Cluster with SSL). The third article in this series was about configuring and using Ansible (building on the first two articles). This article (the 4th) will cover applying the tools and techniques from the first three articles to produce an image (EC2 AMI to be precise) that we can deploy to AWS/EC2. To do this explanation, we will use Packer, Ansible, and the Aws Command Line tools. The AWS command line tools are essential for doing DevOps with AWS.
Check out more information about the Cassandra Database
- Cassandra Consulting: Architecture Analysis
- Cassandra Consulting: Quick Start
- Cassandra Course
- Amazon Cassandra Support
Thanks for sharing this articla.
ReplyDeleteAWS Training In Hyderabad
AWS Training
AWS Online Training
AWS Training Online
AWS Training In Bangalore
Blog commenting can be a valuable tool for building relationships
ReplyDeleteblog commenting is valuable tool thankyou for shareing
ReplyDeleteThis comment has been removed by the author.
ReplyDeletenice article
ReplyDeletethanks for sharing with us
nice article
ReplyDeletethanks for sharing with us
Orthodontist In Hyderabad
This is web site is very useful and also very like this domain our web site https.//sclinbio.com
ReplyDeleteVery nice I will try it…but could work with this is very good domain love it https://sclinbio.com/
ReplyDelete