github 작업과terraform의 모든 인출 요청을 사용하는 환경
24910 단어 serverlessterraformdevopsgithub
방주로서 단기 환경에는 많은 명칭이 있는데 그 중에서 일부는 기능 환경, 임시 환경review apps, 수요에 따라 변화하는 환경이나 임시 환경이다.
단기 환경이란 무엇입니까?
네가 있는 팀이 여러 기능을 동시에 처리한다고 가정해 봐.공사, 제품, 디자인 또는 QA 측의 동료와 업무를 공유하여 협업, 테스트와 심사를 진행해야 한다.이것이 바로 단명 환경의 용무의 땅이다.이러한 주기는 프로젝트의 주기와 연관됩니다.
왜 인프라 시설을 코드로 합니까?
terraform은 내가 선택한 무기(새로운 블로그 글의 소재)이지만 다른 도구(예를 들어 pulumi나 cloudformation도 많다.😬).
사실은 IAC 도구를 사용해서 머리를 맑게 해야 한다. 특히 단기 환경을 관리할 때 말이다.
이 강좌에서 저는 테라form이 있는 S3 메모리통(내 블로그에 사용)을 준비했을 뿐이지만 같은 개념은 테라form과 there are plenty에 모듈을 제공하는 모든 자원을 쉽게 비출 수 있습니다.
선결 조건
AWS_ACCESS_KEY_ID
와 AWS_SECRET_ACCESS_KEY
to your github repository secrets를 추가해야 한다.Github는 단기 환경의 생명 주기를 통제하기 위해 행동을 취한다.
우리는 환경을 관리하기 위해 두 개의github 조작을 만들 것입니다.Github 작업은 기본적으로
YAML
에 있는 .github/workflows/
파일이다.create_and_update_pr_env.yml
- 끌어오기 요청을 열거나 업데이트할 때 인프라를 만들거나 업데이트하고자 합니다.terraform apply
이 두 개를 해냈어요. 간단해요!destroy_pr_env.yml
-pull이 폐쇄를 요청할 때 우리는 자원을 낭비하지 않도록 환경을 파괴해야 한다(만약 우리가 이렇게 하지 않는다면 우리의AWS 법안은 심각한 기쁨이 될 것이다).terraform으로 인프라 시설 정의
이 강좌에서, 우리는 본 블로그에서terraform 설정을 사용할 것이다.본문을 작성할 때 다음과 같이 보입니다.
provider "aws" {
region = "eu-west-2"
}
terraform {
backend "s3" {
// make sure you'll replace the above
// with a bucket name that fits
bucket = "jkrsp-tf-state"
region = "eu-west-2"
}
}
variable "env_prefix" { }
variable "is_temp_env" {
default = false
}
만약 모든 사람이aws놀이공원에 들어갈 수 있다면 우리는 사람들을 참여하게 하고 이것에 대해 흥분하게 할 수 있을 것이다. 그것은 대단하지 않겠는가🎉 보시다시피, 우리는
s3
을terraform 백엔드로 사용합니다.우리는 또한 여기에 두 변수env_prefix
와 is_temp_env
를 정의했다.다음에 당신은 이 사이트를 위해 정의된 유일한 자원을 볼 수 있습니다. 이것은 우리가 블로그를 위탁 관리하는 자원입니다.env_prefix
변수는 명명 충돌을 피하기 위해 환경에 지정된 자원을 지정하는 데 사용됩니다.is_temp_env
는 생산 환경과 임시 환경을 구분하는 데 쓰인다.임시 환경에 대해 우리는 force_destroy
를 true
로 설정하면 terraform을 통해 저장통 자원을 쉽게 소각할 수 있기를 희망한다.false로 설정하면, 통을 없애는 데 실패할 것입니다. 통이 비어 있지 않으면. (이것이 바로 우리가 원하는 안전 생산이지만 임시 환경이 아닙니다.)resource "aws_s3_bucket" "b" {
bucket = "${var.env_prefix}jkrsp.com"
acl = "public-read"
force_destroy = var.is_temp_env
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::${var.env_prefix}jkrsp.com/*"
}
]
}
POLICY
website {
index_document = "index.html"
}
tags = {
ManagedBy = "terraform"
}
}
마지막으로, 우리는 버킷 사이트의 URL을github에 피드백하는 출력 변수를 사용합니다. 이따가 이것을pr에 링크를 표시할 것입니다.output "website" {
value = "http://${aws_s3_bucket.b.website_endpoint}"
}
이제 우리는 기본적인 지형 설정이 생겨서 우리의 동작을 만들 수 있다...PR을 열 때 환경 만들기/업데이트
먼저 다음을 포함하는 동작 yml 파일
.github/workflows/create_and_update_pr_env.yml
을 만듭니다.on:
pull_request:
types: [reopened, opened, synchronize, edited]
이 블록은 작업을 트리거하는 이벤트를 정의합니다. (help.github.com 보다 전면적인 목록이 있습니다. 이 예에서 드래그 요청을 열기, 다시 열기, 동기화, 편집할 때 트리거합니다.그런 다음 동작의 이름, 동작에 사용되는 이미지 및 환경 변수를 정의합니다.
name: Create PR Env
jobs:
create_or_update_pr_env:
runs-on: ubuntu-latest
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
BRANCH_NAME: ${{ github.head_ref }}
steps:
- ....
Github 작업은 다른 CI 도구와 마찬가지로 용기화됩니다. ubuntu-latest
이 동작을 위해 선택한 용기 이미지입니다.우리는 이미 세 가지 변수, AWS_ACCESS_KEY_ID
와 AWS_SECRET_ACCESS_KEY
를 정의했고 terraform을 통해 AWS에 배치해야 한다.Terraform은 이러한 정보를 자동으로 받습니다.임시 환경을 명명하는 접두사로 BRANCH_NAME
env 변수를 사용할 것입니다.우리가 사용하는 것은githubactions context variables here, 즉-
secrets
와github
이다.분명히 secrets
변수는 AWS 기밀에 사용되는 github repo의 기밀을 말합니다.이제 실제 단계를 살펴보겠습니다.
먼저 구축 단계:
- name: Checkout
uses: actions/checkout@v1
- name: Install Dependencies
run: yarn
- name: Checkout
uses: actions/checkout@v1
- name: Install Dependencies
run: yarn
- name: Build Site
run: yarn build
이것은 상당히 표준적인 것입니다. 저장소에 먼저 서명하고 의존항을 설치하기를 원합니다.이 예에서, 나는 게이츠비 사이트를 구축하고 있지만, 이것은 다른 구축 절차를 가진 응용 프로그램일 수도 있다.일단 사이트가 건설되면terraform을 사용하여 우리의 배치를 조율할 것입니다.Hashicorps'github actions for terraform를 사용하면 지형 명령을 쉽게 추가할 수 있습니다.이 조작에 대해 우리는 4개의 명령을 사용할 것이다.
init
, plan
, apply
, output
.모든 요청 환경을 실현하는 비결은 환경마다 서로 다른 상태 파일과 자원 이름이 있다는 것이다.이것이 바로
BRANCH_NAME
변수의 작용이다.terraform을 초기화할 때, 우리는 이 환경에 특정한 s3 메모리통에
key
파라미터를 전송할 수 있습니다. args
파라미터를 주의하십시오. 키 config 앞에 BRANCH_NAME
변수를 붙여서 이 점을 실현하는 방법을 보십시오.- name: 'Terraform Init'
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'init'
args: '-backend-config="key=${{ env.BRANCH_NAME }}.jkrsp.com.tfstate"'
다음에 우리는 지형 평면도를 사용하고 BRANCH_NAME
를 변수로 전입하여 매개 변수화 지형으로 배치한다.주의하십시오. 저는 is_temp_env
라는 변수를 보냈습니다. 왜냐하면 우리는 우리의 임시 s3 자원을 삭제할 수 있기를 희망하기 때문입니다.일단 우리가 이 계획을 사용한다면 우리는 따라갈 수 있다apply
.- name: Terraform Plan
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'plan'
args: '-var="is_temp_env=true" -var="env_prefix=${{ env.BRANCH_NAME }}." -out tf.plan'
- name: Terraform Apply
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'apply'
args: 'tf.plan'
다음에 우리는 output
로 s3 메모리통을 추출하는 사이트 URL을 사용합니다.잠시 후 임시 사이트의 URL을 PR에 대한 평론으로 발표할 때 이 화제로 돌아갑니다. 값을 출력하기 위해 필요한 필드 이름을 args
에 추가합니다.- name: Terraform Output
id: terraform
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'output'
args: 'website'
다음은 cli를 통해 s3 메모리통에 구축할 것입니다.마찬가지로, 우리는 BRANCH_NAME
env 변수를 사용하여 버킷이나 환경을 지정합니다.- name: sync to s3
run: aws s3 sync public s3://${{ env.BRANCH_NAME }}.jkrsp.com
우리 행동의 마지막 단계로, 나는 작은 자바스크립트 프로그램을 사용하여pr (사이트 포함) 에 평론을 추가하고 있다.- run: node .github/actions/comment.js
env:
github_token: ${{ secrets.GITHUB_TOKEN }}
issue_number: ${{ github.event.pull_request.number }}
repo: 'jkrsp'
owner: ${{ github.repository_owner }}
website_link: ${{ steps.terraform.outputs.tf_actions_output }}
comment.js
파일은 .github/actions/comment.js
에 있으며 다음과 같습니다.보시다시피, 상기 인자를 입력하면 스크립트에 주석을 발표하는 데 필요한 모든 변수를 제공합니다.
const github = require('@actions/github');
async function run() {
const { issue_number, github_token, owner, repo, website_link } = process.env
const octokit = new github.GitHub(github_token);
try {
const { data } = await octokit.issues.createComment({
owner,
repo,
issue_number,
// We unfortunately need to use replace to get rid
// of extraneous double quotes
body: `[Review website here](${website_link.replace(/"/gs, '')})`
});
// for debugging, lets log the created comment
console.log('created comment', data);
} catch (err) {
throw err
}
}
run();
이렇게github 저장소에 추가하면 환경을 만들고 PR을 열 때 버킷 사이트를 가리키는 링크를 표시할 수 있습니다.그러나 심사를 마치고 공공관계가 폐쇄/합병되면 우리는 어떻게 환경에서 벗어날 수 있을까?
이것이 바로 우리의 두 번째 행동이다.
잠깐의 환경을 파괴하다
우선 동작을 촉발하는 이벤트를 정의하는 블록부터 시작합시다
on:
pull_request:
types: [closed]
명백합니다: 드래그 요청이 닫혔을 때 이 동작을 터치합니다.그런 다음 이전과 같이 작업과 작업의 이름을 지정하고 환경 변수를 정의합니다.
name: Destroy PR Env
jobs:
destroy_pr_env:
runs-on: ubuntu-latest
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
BRANCH_NAME: ${{ github.head_ref }}
이제 계단을 봅시다.우선, 우리는 우리의 환매 협의를 다시 한 번 살펴야 한다.- name: Checkout
uses: actions/checkout@v1
with:
ref: ${{ github.head_ref }}
그리고 terraform을 초기화하고 다시 사용하기 시작합니다. BRANCH_NAME
우리 환경에 bucket을 지정합니다.- name: 'Terraform Init'
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'init'
args: '-backend-config="key=${{ env.BRANCH_NAME }}.jkrsp.com.tfstate"'
다음으로 우리는 환경을 파괴하고 두 변수is_temp_env
와 env_prefix
를 전달한다.- name: 'Terraform Destroy'
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'destroy'
args: '-var="is_temp_env=true" -var="env_prefix=${{ env.BRANCH_NAME }}."'
마지막으로, 우리는 우리의 관계에 대해 다시 한 번 논평하고, 우리 동료들에게 환경이 틀림없이 파괴되었을 것이라고 말했다.우리가 어떻게 전달하는지 주의하십시오 secrets.GITHUB_TOKEN
. github api와 상호작용을 하려면 이 영패가 필요합니다.- name: Tell PR that we have destroyed the thing
uses: thollander/actions-comment-pull-request@master
with:
message: 'Temporary environment now destroyed'
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
네, 그렇습니다.만약 이 블로그에서 기술한 업무 절차를 보고 싶다면 athe repository for this blog를 보십시오.의 원본 버전this blog post is here입니다.
Reference
이 문제에 관하여(github 작업과terraform의 모든 인출 요청을 사용하는 환경), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jkrsp/environments-per-pull-request-with-github-actions-and-terraform-27hh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)