export AWS_PROFILE=profile_name
Security Researcher, DevOps, SRE
export AWS_PROFILE=profile_name
AWS Codebuild is fully managed build service that compiles source code, run tests, and produces software packages that are ready to reploy. To make it easier, we can create it’s infrastructure using terraform.
Before we begin, we can create our own directory structure for the infrastructure. Why this is important? because whenever we setup something and we want to change it, when revisit these files and change what necessary. To do this, we can just simply create the one just like this:
$ mkdir test-codebuild $ cd test-codebuild ~test-codebuild$ touch main.tf vars.tf terraform.tfvars buildspec.yml
Let’s do the code! fill each one of the files we created :
main.tf
provider "aws" { region = "ap-southeast-1" } terraform { backend "s3" { bucket = "terraform-state-test-pulpn" key = "test-codebuild-project" region = "ap-southeast-1" } } module "codebuild" { source = "git::ssh://git@github.com/muffat/tf-codebuild-module.git?ref=master" project_name = "${var.project_name}" description = "${var.description}" bucket_name = "${var.bucket_name}" repo_type = "${var.repo_type}" repo_url = "${var.repo_url}" team = "${var.team}" image_name = "${var.image_name}" buildspec = "${file("buildspec.yml")}" }
terraform.tfvars
In this file, we should define our project based on what we need. You might need to change the each variables according with what fits you needs.
project_name = "test-project" description = "test python project" bucket_name = "python-artifact" repo_type = "GITHUB" repo_url = "https://github.com/muffat/test-python-pulpn" team = "pulpn" image_name = "aws/codebuild/python:3.6.5"
vars.tf
variable "project_name" {} variable "description" {} variable "bucket_name" {} variable "repo_type" {} variable "repo_url" {} variable "team" {} variable "image_name" {}
buildspec.yml
Buildspec is list of steps that should be doing during the build process.
version: 0.1 phases: build: commands: - pip install flask
$ cd test-codebuild ~test-codebuild$ terraform init ~test-codebuild$ terraform plan ...................... TL;DR ...................... Plan: 4 to add, 0 to change, 0 to destroy. ------------------------------------------------------------------------ Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.
You should be able to seen anything like above. Terraform attemps to create the infrastructure that we’ve defined in the codes before.
~test-codebuild$ terraform apply ............... TL;DR ............... Plan: 4 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. Enter a value:
After we ran command terraform apply, we should be prompted to accept the action that terraform asked. To pass this, enter the value with yes or no to cancel it.
Accept the action by enter, yes. Then terraform will be created the codebuild infrastructure in AWS.
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
Feeling lazy? Use the links below to get your codebuild deployed with terraform
References:
find . -type d -exec bash -c 'cd "$0" && terraform fmt' {} \;
Datadog
$ terraform import module.timeboard_system.datadog_timeboard.system 111xxx
SQS
$ terraform import module.resource-name.aws_sqs_queue.main https://sqs.ap-southeast-1.amazonaws.com/123xxx/xxxx
Notes:
If you cannot find the resource address, try:
$ terraform plan
#!/bin/bash cd prd && ls -d */ declare -a dirs i=1 for d in */ do dirs[i++]="${d%/}" done echo "There are ${#dirs[@]} dirs in the current path" for((i=1;i<=${#dirs[@]};i++)) do cd "${dirs[i]}" && rm -rf .terraform \ && echo "terraform {" > backend.tf \ && echo "backend \"consul\" {" >> backend.tf \ && echo "}" >> backend.tf \ && echo "}" >> backend.tf \ && terraform get -update=true \ && terraform init -backend=true \ -backend-config "address=consul-ip" \ -backend-config "path=prd/${dirs[i]}" \ && terraform apply -auto-approve \ && rm backend.tf \ && cd .. done
provider "aws" { access_key = "" secret_key = "" region = "ap-southeast-1" } resource "aws_instance" "web-1" { vpc_security_group_ids = ["sg-xxxxxxxx"] subnet_id = "subnet-xxxxxxxx" ami = "ami-xxxxxxxx" availability_zone = "ap-southeast-1a" instance_type = "t2.micro" tags { Name = "test-terraform-1" } }