1) Creating ECR to hold the docker image





2) Set up Code Build to build image through Dockerfile







đây mình chọn push

nó run trên con code build có hệ điều hành tương ứng.

bạn chỉ để ý thôi



giờ vào phần Build detail để khám phá





3) Recheck log of Code Build on CloudWatch

File buildspec.yml
version: 0.2
phases:
pre_build:
commands:
- echo Connecting to Amazon ECR...
- aws --version
# - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
- aws ecr get-login-password --region us-east-1 | docker login
--username AWS --password-stdin
250887682577.dkr.ecr.us-east-1.amazonaws.com
- REPOSITORY_URI=250887682577.dkr.ecr.us-east-1.amazonaws.com/demo-codebuild
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=build-$(echo $CODEBUILD_BUILD_ID | awk -F":" '{print $2}')
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build --platform linux/amd64 -t $REPOSITORY_URI:latest .
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- docker push $REPOSITORY_URI:latest
- docker push $REPOSITORY_URI:$IMAGE_TAG
- echo Writing image definitions file...
- printf '[{"name":"simple-app","imageUri":"%s"}]'
$REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
- cat imagedefinitions.json
artifacts:
files: imagedefinitions.json
4) Provisioning CodeBuild(aws) through terraform
Giờ chúng ta sẽ đến với việc demo code build bằng terraform.
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/codebuild_project
Đầu Tiên là file demo_codebuild.tf
resource "aws_codebuild_project" "demo_codebuild" {
name = "demo_codebuild_${var.environment}"
service_role = aws_iam_role.codebuild_role.arn
environment {
compute_type = var.linux_compute_type
image = var.linux_compute_image
type = "LINUX_CONTAINER"
image_pull_credentials_type = "CODEBUILD"
privileged_mode = true
# dynamic "environment_variable" {
# for_each = var.env_variables_deploy_image
# content {
# name = environment_variable.value["name"]
# type = "PLAINTEXT"
# value = environment_variable.value["value"]
# }
# }
}
artifacts {
type = "NO_ARTIFACTS"
}
logs_config {
cloudwatch_logs {
group_name = aws_cloudwatch_log_group.demo_codebuild_group.name
}
}
source {
type = "NO_SOURCE"
buildspec = <<EOT
version: 0.2
env:
# parameter-store:
# BEARER_TOKEN: "/nimtechnology-provision/BEARER_TOKEN"
# build_ssh_key: "/nimtechnology-provision/build_ssh_key"
variables:
ENVIRONMENT: "${var.environment}"
phases:
pre_build:
commands:
- echo "ahihi pre_build"
build:
commands:
- echo "ahihi build"
EOT
}
tags = {
Owner = "CloudOps"
Env = var.environment
}
cache {
type = var.cache_type
modes = var.cache_modes
}
lifecycle { ignore_changes = [project_visibility] }
}
Đầu tiên bạn để ý service_role = aws_iam_role.codebuild_role.arn
Trong đây là mình sẽ các role để codebuild này có thể access vào các resource khác (cloudwatch, SSM,…)
Chúng ta có 1 file iam.tf
# ## Role: codebuild_role
resource "aws_iam_role" "codebuild_role" {
name = "${var.environment}-${var.aws_region}-codebuild-role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "codebuild.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}
resource "aws_iam_role_policy" "codebuild_policy" {
name = "${var.environment}-codebuild-policy"
role = aws_iam_role.codebuild_role.id
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Resource": [
"*"
],
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ssm:GetParameters"
]
}
]
}
EOF
}
Ở trên thì mình cấp quyền cho CodeBuild được phép tương tác với CloudWatch.
vời block environment {} thì cũng khá dễ hiều là biến môi trường.
và bạn cần chú ý dynamic Blocks: Nó đơn giản bạn dụng for để load nhiều biến môi trường
https://www.terraform.io/language/expressions/dynamic-blocks
Phần logs_config {} chúng ta tạo 1 log_group cụ thể để cho codebuild gửi sang.
Mình có file logging.tf
resource "aws_cloudwatch_log_group" "demo_codebuild_group" {
name = "${var.environment}-deploy"
retention_in_days = 14
tags = {
Owner = "CloudOps"
Env = var.environment
}
}