github 작업과terraform의 모든 인출 요청을 사용하는 환경

사용Github Actionsterraform - 본고는github에서 모든 요청 환경의 생명주기 자동화를 실현하도록 지도할 것입니다.
방주로서 단기 환경에는 많은 명칭이 있는데 그 중에서 일부는 기능 환경, 임시 환경review apps, 수요에 따라 변화하는 환경이나 임시 환경이다.

단기 환경이란 무엇입니까?
네가 있는 팀이 여러 기능을 동시에 처리한다고 가정해 봐.공사, 제품, 디자인 또는 QA 측의 동료와 업무를 공유하여 협업, 테스트와 심사를 진행해야 한다.이것이 바로 단명 환경의 용무의 땅이다.이러한 주기는 프로젝트의 주기와 연관됩니다.

왜 인프라 시설을 코드로 합니까?
terraform은 내가 선택한 무기(새로운 블로그 글의 소재)이지만 다른 도구(예를 들어 pulumicloudformation도 많다.😬).
사실은 IAC 도구를 사용해서 머리를 맑게 해야 한다. 특히 단기 환경을 관리할 때 말이다.
이 강좌에서 저는 테라form이 있는 S3 메모리통(내 블로그에 사용)을 준비했을 뿐이지만 같은 개념은 테라form과 there are plenty에 모듈을 제공하는 모든 자원을 쉽게 비출 수 있습니다.

선결 조건
  • 아직 없으면 aws account를 만듭니다.
  • aws증명서AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYto 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_prefixis_temp_env를 정의했다.다음에 당신은 이 사이트를 위해 정의된 유일한 자원을 볼 수 있습니다. 이것은 우리가 블로그를 위탁 관리하는 자원입니다.env_prefix 변수는 명명 충돌을 피하기 위해 환경에 지정된 자원을 지정하는 데 사용됩니다.is_temp_env는 생산 환경과 임시 환경을 구분하는 데 쓰인다.임시 환경에 대해 우리는 force_destroytrue로 설정하면 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_IDAWS_SECRET_ACCESS_KEY를 정의했고 terraform을 통해 AWS에 배치해야 한다.Terraform은 이러한 정보를 자동으로 받습니다.임시 환경을 명명하는 접두사로 BRANCH_NAME env 변수를 사용할 것입니다.
    우리가 사용하는 것은githubactions context variables here, 즉-secretsgithub이다.분명히 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_envenv_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입니다.

    좋은 웹페이지 즐겨찾기