みなさん、こんにちは。
クラウドインフラストラクチャを使用していて、自動化を使用しない人がいます。これは、時間がかかり、掘り下げる必要があり、機能を削減する必要があるためです。 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
また、これがハブレに関する私の最初の出版物であることを考慮に入れてください。