🐚
docker-composeでTerraformのAWS構築環境を作成する 【AWS CLI 2対応】
前提
概ねこちらのサイトを参考にしたのですが、残念ながらPythonのパッケージマネージャのpipがAWS CLI 2に対応していなかったので、その対処策として作成しました。
また、こちらの方のようにMakefileを利用して、簡単に実行できるようにしました。
レポジトリ
最終的に作成したレポジトリはこちらです。良ければ、ご自由にご活用ください。
解説
ubuntsuコンテナ上にaws cliとterraform cliをインストールします。
構成図
├── docker
│ ├── .aws
│ │ ├── config.default
│ │ └── credentials.default
│ ├── init.sh
│ └── Dockerfile
├── terraform
├── .env(ローカルで作成してください)
├── docker-compose.yml
└── Makefile
各種ファイル
Dockerfile
FROM ubuntu:20.04
# install command.
RUN apt-get update && apt-get install -y less vim unzip curl
# install awscli
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.0.30.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
./aws/install && \
bash -c 'echo complete -C '/usr/bin/aws_completer' aws >> $HOME/.bashrc'
ENV PS1="awscliv2> "
# install terraform.
# https://azukipochette.hatenablog.com/entry/2018/06/24/004354
RUN curl "https://releases.hashicorp.com/terraform/0.15.0/terraform_0.15.0_linux_amd64.zip" -o "terraform.zip" && \
unzip ./terraform.zip -d /usr/local/bin/
# create workspace.
COPY ./terraform /infra/terraform
# initialize command.
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
COPY ./docker/.aws /infra/.aws
COPY ./docker/init.sh /infra/init.sh
RUN chmod +x /infra/init.sh && /infra/init.sh
init.sh
#!/bin/bash
source /root/.bashrc
if [[ ! -e /infra/.aws/config ]]; then
mv /infra/.aws/config.default /infra/.aws/config
fi
if [[ ! -e /infra/.aws/credentials ]]; then
mv /infra/.aws/credentials.default /infra/.aws/credentials
sed -i "s/<access-key>/${AWS_ACCESS_KEY_ID}/g" /infra/.aws/credentials
sed -i "s/<secret-key>/${AWS_SECRET_ACCESS_KEY}/g" /infra/.aws/credentials
fi
.aws/config.default
[default]
region = ap-northeast-1
output = json
.aws/credentials.default
[default]
aws_access_key_id = <access-key>
aws_secret_access_key = <secret-key>
docker-compose.yml
version: "3"
x-dev-base: &dev-base
build:
context: .
dockerfile: ./docker/Dockerfile
environment:
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-hogehoge}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-hogehoge}
volumes:
- ./terraform:/infra/terraform
services:
stg:
<< : *dev-base
working_dir: /infra/env/stg
prod:
<< : *dev-base
working_dir: /infra/env/prod
Makefile
.PHONY: up build remake stop down restart rmi-local destroy \
destroy-volumes ps \
stg-init stg-plan stg-apply stg-destroy \
prod-init prod-plan prod-apply prod-destroy check
up:
docker-compose up -d
build:
docker-compose build --no-cache --force-rm
remake:
@make destroy
@make init
stop:
docker-compose stop
down:
docker-compose down --remove-orphans
restart:
@make down
@make up
rmi-local:
docker-compose down --rmi local --remove-orphans
destroy:
docker-compose down --rmi all --volumes --remove-orphans
destroy-volumes:
docker-compose down --volumes --remove-orphans
ps:
docker-compose ps
stg-init:
@docker-compose run --rm stg terraform init
stg-plan:
@docker-compose run --rm stg terraform plan
stg-apply:
@docker-compose run --rm stg terraform apply
stg-destroy:
@docker-compose run --rm stg terraform destroy
prod-init:
@docker-compose run --rm prod terraform init
prod-plan:
@docker-compose run --rm prod terraform plan
prod-apply:
@docker-compose run --rm prod terraform apply
prod-destroy:
@docker-compose run --rm prod terraform destroy
おまけ
stg/prodの環境をモジュールで切り分ける構成にしています。これに関してはこちらをご参考にください。
Discussion