DevOps:Terraform、docker、bash、prometheusエクスポーター、Gitlab、WireGuardによるインフラストラクチャの自動化

みなさん、こんにちは。





クラウドインフラストラクチャを使用していて、自動化を使用しない人がいます。これは、時間がかかり、掘り下げる必要があり、機能を削減する必要があるためです。 UIで何かをクリックしたり、ssh経由で接続したり、aptを使用して全員をインストールしたりしました。構成ファイルは手動で変更されました。もちろん、ドキュメントを作成するのに十分な時間がなかったか、ドキュメントにさまざまなトリッキーな手順があり、このインフラストラクチャの構成を正確に繰り返すことはもはや不可能または非常に困難であり、サービスは本番環境で回転しています。そして、その人は自分が何をどのように行ったかを正確に忘れるか、完全にやめました。





小さな例を挙げて、たとえばAWSでインフラストラクチャを自動化するのは非常に簡単で快適であり、結果は非常に透過的であり、それ自体がドキュメントであることを示したいと思います。それはコードとしてのインフラストラクチャです。もちろん、Terraformの知識があるか、少し勉強したいという欲求がない限り。





ちなみに、自動化には多くのことを強くお勧めしますが、特にAWS / GCP / Azureなどのクラウドプロバイダーです。Terraformを使用するのは これはかなり成熟したツールであり、大きなコミュニティがあり、とりわけ、一部のクラウドプロバイダーだけでなく、APIを備えたほとんどすべての自動化をサポートしています。さらに、このツールはオープンソースであり、必要に応じて、自分で何でも実装できます。AWSのようなクラウドの場合、純粋なPythonで自動化を実装し、cliまたはCloudformationを使用してAWSAPIにリクエストすることはお勧めしません。





また、Terraformには、コードをモジュールと呼ばれるブロックに編成し、パラメーターのみをそれらに渡す便利な機能があり、他の設定で必要なものを簡単に作成できます。





, Terraform , .tf Terraform , Terraform , . main.tf - .





, , vpn WireGuard Ubuntu 20.04 + . WireGuard linux, , , .





.





.





, , . .





, iam , ..





elastic ip, , dns , vpn . geo dns route53, ip vpn , .. route53 , .





security groups , vpn udp (Wireguard udp) + ssh + prometheus exporter'.





/ ec2 , , auto scaling group, . , - , . Self healing.





load balancer , auto scaling groups : - , cpu, vpn , .





Terraform, Terragrunt, Keep your Terraform code DRY, backend , Terraform . Terraform , , , S3 . , , Dynamodb, - .





.





terragrunt.hcl (https://github.com/vainkop/terraform-aws-wireguard/blob/master/example/terragrunt.hcl) , , state , terragrunt.hcl find_in_parent_folders()



https://github.com/vainkop/terraform-aws-wireguard/blob/master/example/us-east-1/terragrunt.hcl#L2





key, .. , , path_relative_to_include()



https://github.com/vainkop/terraform-aws-wireguard/blob/master/example/terragrunt.hcl#L11





/ yaml , yamldecode(file(...))



https://github.com/vainkop/terraform-aws-wireguard/blob/master/example/eu-central-1/terragrunt.hcl#L9





( YOUR_...



): https://github.com/vainkop/terraform-aws-wireguard/blob/master/example/us-east-1/values.yaml





, region , , basename(get_terragrunt_dir())



values.yaml



, .





, - ci cd runner example, .. terragrunt.hcl



yaml , , . "" yaml Terraform .





: -, Terraform . , .





, open source , , , source = "github.com/vainkop/terraform-aws-wireguard?ref=v1.2.0"



https://github.com/vainkop/terraform-aws-wireguard/blob/master/example/eu-central-1/terragrunt.hcl#L6





open source , , .





cloud-init , , auto scaling group, : https://github.com/vainkop/terraform-aws-wireguard/blob/master/templates/user-data.txt





2 prometheus exporter', ec2 , WireGuard, Dashboards alerts ..





, vpn , , , , .. vpn . .. , geo ip route53.





.gitlab-ci.yml



Dockerfile



Gitlab runner' docker runner'.





$ cat .gitlab-ci.yml

stages:
  - build
  - plan
  - apply
  - destroy

variables:
  GIT_DEPTH: 1

.aws_configure: &aws_configure
  before_script:
    - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
    - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
    - aws configure set default.region $AWS_DEFAULT_REGION


build-terraform:
  image: docker:19.03.15
  services:
    - docker:19.03.15-dind
  stage: build
  variables:
    DOCKER_TLS_CERTDIR: ""
    DOCKER_HOST: tcp://docker:2375
    DOCKER_DRIVER: overlay2
    TERRAFORM_VERSION: "0.13.6"
    TERRAGRUNT_VERSION: "v0.28.9"
  before_script:
    - printenv
    - docker info
    - echo $CI_REGISTRY_PASSWORD | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
  script:
    - cd docker
    - docker build --build-arg TERRAFORM_VERSION=$TERRAFORM_VERSION --build-arg TERRAGRUNT_VERSION=$TERRAGRUNT_VERSION -t $CI_REGISTRY_IMAGE:$TERRAFORM_VERSION .
    - docker push $CI_REGISTRY_IMAGE:$TERRAFORM_VERSION
  rules:
    - changes:
        - docker/*


plan-us-east-1:
  image:
    name: registry.gitlab.com/vainkop/terraform:0.13.6
    entrypoint: [""]
  stage: plan
  <<: *aws_configure
  script:
    - cd wireguard/us-east-1
    - terragrunt run-all plan --terragrunt-non-interactive -out $CI_PROJECT_DIR/wireguard/us-east-1/tfplan-$CI_COMMIT_SHA
  artifacts:
    paths:
    - $CI_PROJECT_DIR/wireguard/us-east-1/tfplan-$CI_COMMIT_SHA
    expire_in: 1 month
  rules:
    - changes:
        - wireguard/us-east-1/*
      allow_failure: true

plan-eu-central-1:
  image:
    name: registry.gitlab.com/vainkop/terraform:0.13.6
    entrypoint: [""]
  stage: plan
  <<: *aws_configure
  script:
    - cd wireguard/eu-central-1
    - terragrunt run-all plan --terragrunt-non-interactive -out $CI_PROJECT_DIR/wireguard/eu-central-1/tfplan-$CI_COMMIT_SHA
  artifacts:
    paths:
    - $CI_PROJECT_DIR/wireguard/eu-central-1/tfplan-$CI_COMMIT_SHA
    expire_in: 1 month
  rules:
    - changes:
        - wireguard/eu-central-1/*
      allow_failure: true

apply-us-east-1:
  image:
    name: registry.gitlab.com/vainkop/terraform:0.13.6
    entrypoint: [""]
  stage: apply
  <<: *aws_configure
  script:
    - cd wireguard/us-east-1
    - terragrunt run-all apply --terragrunt-non-interactive -auto-approve $CI_PROJECT_DIR/wireguard/us-east-1/tfplan-$CI_COMMIT_SHA
  rules:
    - changes:
        - wireguard/us-east-1/*
      when: manual
      allow_failure: true

apply-eu-central-1:
  image:
    name: registry.gitlab.com/vainkop/terraform:0.13.6
    entrypoint: [""]
  stage: apply
  <<: *aws_configure
  script:
    - cd wireguard/eu-central-1
    - terragrunt run-all apply --terragrunt-non-interactive -auto-approve $CI_PROJECT_DIR/wireguard/eu-central-1/tfplan-$CI_COMMIT_SHA
  rules:
    - changes:
        - wireguard/eu-central-1/*
      when: manual
      allow_failure: true

destroy-us-east-1:
  image:
    name: registry.gitlab.com/vainkop/terraform:0.13.6
    entrypoint: [""]
  stage: destroy
  <<: *aws_configure
  script:
    - cd wireguard/us-east-1
    - terragrunt run-all destroy --terragrunt-non-interactive -auto-approve
  rules:
    - changes:
        - wireguard/us-east-1/*
      when: manual
      allow_failure: true

destroy-eu-central-1:
  image:
    name: registry.gitlab.com/vainkop/terraform:0.13.6
    entrypoint: [""]
  stage: destroy
  <<: *aws_configure
  script:
    - cd wireguard/eu-central-1
    - terragrunt run-all destroy --terragrunt-non-interactive -auto-approve
  rules:
    - changes:
        - wireguard/eu-central-1/*
      when: manual
      allow_failure: true
      
      



$ cat docker/Dockerfile

FROM ubuntu:20.04

USER root

ARG DEBIAN_FRONTEND=noninteractive

ARG TERRAFORM_VERSION
ENV TERRAFORM_VERSION=$TERRAFORM_VERSION

ARG TERRAGRUNT_VERSION
ENV TERRAGRUNT_VERSION=$TERRAGRUNT_VERSION

RUN set -x && \
    apt-get update && \
    apt-get install -y \
    apt-transport-https \
    ca-certificates \
    software-properties-common \
    unzip \
    net-tools \
    wget \
    curl \
    python3 \
    python3-pip \
    jq \
    gettext-base \
    git && \
    rm -rf /var/lib/apt/lists/*

RUN set -x && \
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CC86BB64 && \
    add-apt-repository ppa:rmescandon/yq && \
    apt update && \
    apt install -y yq && \
    rm -rf /var/lib/apt/lists/*

RUN set -x && \
    pip3 install -U --no-cache-dir setuptools shyaml

RUN set -x && \
    ln -sf /usr/bin/python3 /usr/bin/python && ln -sf /usr/bin/pip3 /usr/bin/pip

RUN set -x && \
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install && \
    rm -rf awscliv2.zip && \
    /aws \
    /usr/local/aws-cli/v2/*/dist/awscli/examples

RUN set -x && \
    cd /tmp && \
    curl -O https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip && \
    unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip -d /usr/local/bin && \
    chmod +x /usr/local/bin/terraform && \
    rm /tmp/terraform_${TERRAFORM_VERSION}_linux_amd64.zip

RUN set -x && \
    wget "https://github.com/gruntwork-io/terragrunt/releases/download/${TERRAGRUNT_VERSION}/terragrunt_linux_amd64" && \
    mv terragrunt_linux_amd64 /usr/local/bin/terragrunt && \
    chmod +x /usr/local/bin/terragrunt

RUN set -x && \
    curl --version && \
    envsubst --version && \
    python --version && \
    pip --version && \
    shyaml --version && \
    jq -V && \
    yq -V && \
    aws --version && \
    terraform --version && \
    terragrunt --version

ENTRYPOINT ["/bin/bash", "-c"]
      
      



, .





/, , , , : @vainkop







また、これがハブレに関する私の最初の出版物であることを考慮に入れてください。








All Articles