Terraform is an infrastructure orchestration tool for creating web services in AWS automatically. You can use Terraform for provisioning any resources in AWS. We will learn how to create S3 bucket in AWS using Terraform.
You can provision resources in AWS cloud using Terraform by two ways as mentioned below:
AWS Access keys + secret keys (un-secure way)
Create an IAM Role with AmazonS3FullAccess Policy. (more secure way)
Option 2 is recommended approach as we already installed Terraform on EC2 instance that is inside AWS cloud. So we do not need to use Access Keys + secret keys. But if you have installed Terraform on your local machine you would need to go with Option1.
variable "aws_region" { description = "The AWS region to use to create resources." default = "us-east-2" } variable "bucket_prefix" { type = string description = "(required since we are not using 'bucket') Creates a unique bucket name beginning with the specified prefix" default = "my-s3bucket-" } variable "tags" { type = map description = "(Optional) A mapping of tags to assign to the bucket." default = { environment = "DEV" terraform = "true" } } variable "versioning" { type = bool description = "(Optional) A state of versioning." default = true } variable "acl" { type = string description = " Defaults to private " default = "private" }
Create output.tf file
sudo vi outputs.tf
output "s3_bucket_name" {
value = aws_s3_bucket.my-s3-bucket.id
}
output "s3_bucket_region" {
value = aws_s3_bucket.my-s3-bucket.region
}
Create main.tf file
sudo vi main.tf
provider "aws" {
region = var.aws_region
}
resource "aws_s3_bucket" "my-s3-bucket" {
bucket_prefix = var.bucket_prefix
acl = var.acl
versioning {
enabled = var.versioning
}
tags = var.tags
}
Execute Terraform commands
Now execute the below command:
terraform init
you should see like below screenshot.
Execute the below command
terraform plan
the above command will show how many resources will be added.
Plan: 1 to add, 0 to change, 0 to destroy.
Execute the below command
terraform apply
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve.
Now login to AWS--> S3, to see the new bucket created.
If you are having any errors related to credentials make sure you have access to AWS by attaching IAM role with AmazonS3FullAccess or access keys + secret keys are setup.
Terraform is an open-source tool for provisioning and managing cloud
infrastructure. Terraform can provision resources on any cloud platform.
Terraform allows you to create infrastructure in configuration files(tf files)
that describe the topology of cloud resources. These resources include virtual
machines, storage accounts, networking interfaces, etc.
You can provision resources in AWS cloud using Terraform by two ways
as mentioned below:
AWS Access keys + secret keys (un-secure way)
IAM Role with AmazonEC2FullAccess Policy. (more secure way)
Option 2 is recommended approach as we already installed Terraform on
EC2 instance that is inside AWS cloud. So we do not need Access Keys +
secret keys. But if you have installed Terraform on your local machine
you would need to go with Option1.
We will see how you can use Terraform to provision EC2 instance.
Please do the below steps for provisioning EC2 instances on AWS.
Step - 1 Create an IAM role to provision EC2 instance in AWS
Go to AWS console, click on IAM
Select AWS service, EC2, Click on Next Permissions
Type EC2 and choose AmazonEC2FullAccess as policy
Click on Next tags, Next Review
give some role name and click on Create role.
Step - 2 Assign IAM role to EC2 instance
Go back to Jenkins EC2 instance, click on EC2 instance, Security,
Modify IAM role
Type your IAM role name my-ec2-terraform-role and Save to attach that role to EC2 instance.
Login to EC2 instance where you have installed Terraform.
Step 3 - Create Terraform files
cd ~
mkdir project-terraform
cd project-terraform
Create Terraform Files
make sure you change what ever is high lighted in red color below per
your settings.
sudo vi variables.tf
variable "aws_region" {
description = "The AWS
region to create things in."
default
= "us-east-1"
}
variable "key_name" {
description = " SSH keys to
connect to ec2 instance"
Now login to EC2 console, to see the new
instances up and running List of Resources created by
Terraform
Execute the below command to view list of the
resources created by Terraform.
terraform state list
The above command will list four resources
created.
You should be able to see EC2 instance up and
running in AWS console.
Cleanup resources after creation:
Execute the below command
terraform destroy
Plan: 0 to add, 0 to change, 4 to destroy.
Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve.
Enter a value: yes
this will go ahead and delete all the resources created from Terraform.
How to push Terraform files
into GitHub All Terraform files should be
checked into version control systems
such as GitHub, BitBucket or
GitLab. Let us see how to push code changes
into GitHub. Make sure you are in the
directory where Terraform files are
created.
Create Remote repo in GitHub Create a new repo with below name, make
sure it is a private repo. Also do not click on
initialize this repository with a README
option.
Note down the remote url under SSH as highlighted
below:
Note: If you have any issues in uploading tf
files, you may not have created ssh-keys
and uploaded into GitHub. Create ssh
keys using ssh-keygen command:
ssh-keygen
This should generate both public and private
keys.
Copy the public keys by executing the below
command:
sudo cat ~/.ssh/id_rsa.pub
Initialize the directory first git init
The above command will create local git
repository. Now add terraform files. add only tf files, not other files. git add *.tf
git commit -m "Added terraform
files" Copy the below red highlighted url from
above screenshots circled in red. git remote add origin your remote repo SSH url per above
screenshot, not https url Now push the code into GitHub git push -u origin master Now Login to GitHub to view the Terraform
files
You may get this error if you have not uploaded
ssh keys into GitHub/BitBucket. try creating SSH keys by executing ssh-keygen command and upload public keys into GitHub.
ec2_securitygroup { 'mySecurityGroup': region => 'us-east-2', ensure => present, description => 'Security group for aws Ec2 instance', ingress => [{ protocol => 'tcp', port => 8080, cidr => '0.0.0.0/0', },{ protocol => 'tcp', port => 80, cidr => '0.0.0.0/0', },{ protocol => 'tcp', port => 22, cidr => '0.0.0.0/0', }], tags => { tag_name => 'mySecurityGroup', }, }
You need to change all the values (high lighted above) per your settings. Make sure you also change the subnet id per your settings. you need to follow the below steps
13. Now execute the below command to create EC2 instance.
Jenkins job can be triggered in many ways using poll SCM, webhooks. Well, you can also trigger a Jenkins job from Slack as well. We will be leveraging Slash commands feature from Slack.
Slash Commands allow users to invoke your app by typing a string into the message composer box.
Make sure you have already created a channel in Slack.
Steps in Jenkins:
Create a Token for the build job you want to trigger from Slack
Go to Jenkins --> Click on the Job you would like to trigger from Slack --> Configure
Go to build triggers section.
We will be using the following URL to trigger builds from Slack http://jenkins_dns_name/job/jobName/build?token=myToken
Allow anonymous read only access
Go to Manage Jenkins --> Configure Global security, click on Allow anonymous read only access.
Apply, Save.
Steps in Slack:
1. Go to the channel from where you would like to trigger builds.
2. Channel settings --> Click on Integrations --> Add an app
Type slash commands and add it
Click on view in app directory
Click on Add to Slack
Enter a command - single word something like /build(it should be one word no spaces or characters)
Click on Add Slash command integration
Enter Jenkins URL, like mentioned below: http://jenkins_dns_name/job/jobName/build?token=myToken
Method as GET
and scroll down click on the check box like below
And click Save integration
Go to channel, enter the command as shown below: /build
and press enter
Now your build job should run instantly in Jenkins.
You can watch the steps in my YouTube channel as well: