GitHub 작업과 HashiCorp Packer를 사용한 AWS AMI 구축
22935 단어 packerawsgithubgithubactions
또한 각 조직에는 지정된 이미지에 대해 설치된 표준 소프트웨어 목록이 있습니다.보안 측면에서 볼 때 필요한 소프트웨어만이 폭발 표면을 줄일 수 있다.이 소프트웨어 목록은 가상 시스템을 만든 후 또는 가상 시스템을 만드는 동안 설치할 수 있습니다.그러나 이 두 가지 기술은 모두 시간이 많이 걸리기 때문에 사용을 추천하지 않는다.
기본 이미지 자체에서 이 소프트웨어 목록을 베이킹하는 것이 좋습니다.HashiCorp Packer은 하나의 소스에서 여러 플랫폼으로 구성하여 자동화 기계 이미지를 구축하는 데 전문적으로 사용되는 소스 오픈 도구이다.
HashiCorp 차단기 설치
HashiCorp documentation을 참조하여 하드웨어 운영체제 기반 차단기 설치에 대해 알아보십시오.
GitHub 작업
이 프레젠테이션에서 GitHub 작업으로 CI/CD 파이프를 만들어서 이 작업 흐름을 자동화하고 최종적으로 AWS에서 베이킹 이미지 (AMI) 를 전송할 것입니다.그것은 소프트웨어 개발의 생명 주기 내에 임무를 자동화하는 플랫폼이다.이것은
event-driven
프레임워크입니다. 이것은 우리가 주어진 사건을 위해 일련의 명령을 집행할 수도 있고, 일회성 또는 중복적인 임무를 배정할 수도 있다는 것을 의미합니다.(예를 들어 Pull 요청 생성 시 테스트 세트를 실행하고 문제에 라벨을 추가하며 헤드 검사를 한다)동작은 YAML 파일에 정의되어 있으며, GitHub 이벤트를 사용하여 파이프 작업 흐름을 촉발할 수 있습니다. 예를 들어 요청 작성, 코드 제출 등입니다.
선결 조건
참조 GitHub 저장소 - pkr-aws-ubuntu-java
인코딩 시간
포장기 설정을 작성하기 시작합시다.(
Linux
시스템을 사용하여 데모 중)차단기 구성
프로젝트 폴더 만들기
pkr-aws-ubuntu-java
mkdir pkr-aws-ubuntu-java && cd $_
aws-demo.pkr.hcl
이라는 파일을 만듭니다.touch aws-demo.pkr.hcl
좋아하는 IDE(예: VScode)를 엽니다.다음 코드를 aws-demo.pkr.hcl
파일로 복사합니다.packer {
required_plugins {
amazon = {
version = ">= 0.0.2"
source = "github.com/hashicorp/amazon"
}
}
}
packer {}
블록은 차단기 설정을 포함하고 필요한 차단기 버전을 포함합니다.Packer 블록의 required_plugins
블록은 템플릿을 사용하여 이미지를 구성하는 데 필요한 플러그인을 지정합니다.플러그인 블록은 version
및 source
속성을 포함합니다.소스 블록
원본 블록은 특정한
builder
플러그인을 설정한 다음 build
블록에서 호출합니다.소스 코드 블록은 구축기와 통신기를 사용하여 가상화 유형, 이미지 시작 유형 등을 정의한다.다음 코드를
aws-demo.pkr.hcl
파일로 복사합니다.variable "ami_prefix" {
type = string
default = "packer-aws-ubuntu-java"
}
locals {
timestamp = regex_replace(timestamp(), "[- TZ:]", "")
}
source "amazon-ebs" "ubuntu_java" {
ami_name = "${var.ami_prefix}-${local.timestamp}"
instance_type = "t2.micro"
region = "us-east-1"
source_ami_filter {
filters = {
name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
owners = ["099720109477"]
}
ssh_username = "ubuntu"
}
변수 ami_prefix
은 AMI 이미지를 정의하는 데 사용됩니다.로컬 변수 timestamp
은 AMI 이름의 고유성을 보장하는 데 도움이 됩니다.amazon-ebs
빌더가 소스 AMI를 시작하고 이 인스턴스에서 provisioners를 실행한 다음 EBS에서 지원하는 AMI로 다시 패키지화합니다.이 빌더 구성은 기본 이미지로 t2.micro
AMI를 사용하고 us-east-1 영역에서 ubuntu:xenial
AMI를 시작합니다.packer-aws-ubuntu-java+timestamp
이라는 AMI가 만들어졌습니다.AMI 이름은 고유해야 합니다. 그렇지 않으면 오류가 발생합니다.또한
ssh_username
속성을 지정하여 SSH 통신기를 사용합니다.그런 다음 Packer는 임시 키 쌍과 보안 그룹을 사용하여 EC2 인스턴스에 SSH를 연결하여 인스턴스를 제공할 수 있습니다.집짓기
build
블록은 EC2 실례가 시작된 후에 차단기가 무엇을 해야 하는지를 정의합니다.build {
name = "packer-ubuntu"
sources = [
"source.amazon-ebs.ubuntu_java"
]
provisioner "shell" {
inline = [
"echo Install Open JDK 8 - START",
"sleep 10",
"sudo apt-get update",
"sudo apt-get install -y openjdk-8-jdk",
"echo Install Open JDK 8 - SUCCESS",
]
}
}
provisioner
블록은 기본 이미지를 자동으로 수정하는 데 도움이 됩니다.셸 스크립트, 파일 업로드, 현대 설정 관리 도구 (예: Ansible, Chef 등) 와 통합됩니다.위의 provisioner는 셸 provisioner를 정의하고 기본 이미지에 OpenJDK 8을 설치합니다.
최종 문건
aws-demo.pkr.hcl
은 다음과 같다.packer {
required_plugins {
amazon = {
version = ">= 0.0.2"
source = "github.com/hashicorp/amazon"
}
}
}
variable "ami_prefix" {
type = string
default = "packer-aws-ubuntu-java"
}
locals {
timestamp = regex_replace(timestamp(), "[- TZ:]", "")
}
source "amazon-ebs" "ubuntu_java" {
ami_name = "${var.ami_prefix}-${local.timestamp}"
instance_type = "t2.micro"
region = "us-east-1"
source_ami_filter {
filters = {
name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
owners = ["099720109477"]
}
ssh_username = "ubuntu"
}
build {
name = "packer-ubuntu"
sources = [
"source.amazon-ebs.ubuntu_java"
]
provisioner "shell" {
inline = [
"echo Install Open JDK 8 - START",
"sleep 10",
"sudo apt-get update",
"sudo apt-get install -y openjdk-8-jdk",
"echo Install Open JDK 8 - SUCCESS",
]
}
}
GitHub 작업
에서 새 파일을 만듭니다.
github-actions-packer.yml
이라는 github/workflows 디렉터리우리는 이 업무 흐름을 새벽 4시와 같이 운행하도록 안배할 것이다.
name
- 워크플로우의 이름입니다.GitHub은 저장소의 작업 페이지에 워크플로의 이름을 표시합니다. "AWS AMI 사용 패키지 구성"name: AWS AMI using Packer Config
on- 워크플로우를 트리거하는 GitHub 이벤트의 이름입니다.워크플로우를 계획대로 트리거하도록 구성했습니다.on:
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '0 4 * * *'
jobs
- 워크플로우 실행은 하나 이상의 작업으로 구성됩니다.이 작업들은 병행 또는 순서대로 운행할 수 있다.모든 작업은runson이 지정한 실행 프로그램 환경에서 실행됩니다.job name
-GitHub에 표시되는 작업 이름입니다.runs-on
-(필수) 운행 작업의 기계 유형을 확정한다.기계는 GitHub에서 위탁 관리하는 운행 프로그램일 수도 있고, 스스로 위탁 관리하는 운행 프로그램일 수도 있다.사용 가능한 GitHub 트랜잭션 프로그램 형식은 윈도우즈 최신 버전/윈도우즈-2019/윈도우즈-2016/ubuntu 최신 버전/ubuntu-20.04 등입니다.jobs:
packer:
runs-on: ubuntu-latest
name: packer
steps
- 작업에서 단계라고 하는 작업 시퀀스입니다.저장소, 공용 저장소 또는 Docker 레지스트리에 게시된 작업에서 명령을 실행하거나 작업을 설정하거나 작업을 실행할 수 있습니다.첫 번째 단계는 runner 환경에서 원본 코드를 검사하는 것입니다.
Checkout V2
- 이 작업은 $GITHUB WORKSPACE에서 저장소를 체크 아웃하여 워크플로에 액세스할 수 있도록 합니다. steps:
- name: Checkout Repository
uses: actions/checkout@v2
AWS 클라우드 환경에 접근할 수 있도록, 우리는 루너 환경에서 AWS_ACCESS_KEY_ID
과 AWS_SECRET_ACCESS_KEY
을 설정해야 한다.이러한 변수의 값은 다음 섹션에서 GitHub 비밀로 구성됩니다.Configure AWS Credentials
- 이 작업은 AWS 자격 증명 및 지역 환경 변수를 구성하여 다른 GitHub 작업에서 사용할 수 있도록 합니다. - name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }}
# if you have/need it
aws-region: us-east-1
Init
은 GitHub 작업 흐름에 사용되는 패키지 구성을 초기화합니다. # Initialize Packer templates
- name: Initialize Packer Template
uses: hashicorp/packer-github-actions@master
with:
command: init
Validate
은 구성이 올바르게 기록되었는지 확인합니다.그렇지 않으면 실수를 던질 것이다. # validate templates
- name: Validate Template
uses: hashicorp/packer-github-actions@master
with:
command: validate
arguments: -syntax-only
target: aws-demo.pkr.hcl
Build
은 패키지 구성을 수행합니다. # build artifact
- name: Build Artifact
uses: hashicorp/packer-github-actions@master
with:
command: build
arguments: "-color=false -on-error=abort"
target: aws-demo.pkr.hcl
env:
PACKER_LOG: 1
온전한 파일github 작업 패키지 프로그램입니다.yml은 다음과 같습니다.name: AWS AMI using Packer Config
on:
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '0 4 * * *'
jobs:
packer:
runs-on: ubuntu-latest
name: packer
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }}
# if you have/need it
aws-region: us-east-1
# Initialize Packer templates
- name: Initialize Packer Template
uses: hashicorp/packer-github-actions@master
with:
command: init
# validate templates
- name: Validate Template
uses: hashicorp/packer-github-actions@master
with:
command: validate
arguments: -syntax-only
target: aws-demo.pkr.hcl
# build artifact
- name: Build Artifact
uses: hashicorp/packer-github-actions@master
with:
command: build
arguments: "-color=false -on-error=abort"
target: aws-demo.pkr.hcl
env:
PACKER_LOG: 1
GitHub 저장소로 전송할 소스 코드가 준비되었습니다.구성에 따라 새벽 4시에 워크플로우가 트리거됩니다.Reference
이 문제에 관하여(GitHub 작업과 HashiCorp Packer를 사용한 AWS AMI 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/g33kzone/build-aws-ami-with-hashicorp-packer-using-github-actions-5f86텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)