8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Docker】Terraform+AWS CLI+DooD環境を構築

Last updated at Posted at 2021-09-13

AWSの環境構築をTerraformで行う際に、環境依存やバージョン管理を考慮する必要があります。
その管理を簡略化するため、Dockerを用いて環境をコンテナ化します。
また、コンテナ内のTerraformでECRの操作を行うため、DooD(Docker outside of Docker)という仕組みでコンテナ内からDockerの機能が利用できるようにします。

ターゲット

  • TerraforomまたはAWS CLI環境をコンテナ化したい
  • Dockerコンテナ内でDockerを使いたい

Terraformを使う方法

TerraformをDockerコンテナで使用する方法として公式イメージを使用します。
バージョンを固定したい方は、latestを置き換えてください。

Dockerfile
FROM hashicorp/terraform:latest

HashiCorp公式のDocker Hubを参照することで、golang:alpineイメージにセットアップする方法も分かります。

AWS CLIを使う方法

AWS CLIを使用するには、glibcのインストールも必要です。
バージョンはENV GLIBC_VER=で指定してください。(例として2021/9/9時点で最新の2.34-r0を指定します。)
今回はAlpine Linuxにインストールする想定で作成しています。また、AWS CLIはv2をインストールします。

Dockerfile
FROM golang:alpine

# install glibc
ENV GLIBC_VER=2.34-r0
RUN apk --no-cache add binutils curl && \
curl -sL https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub && \
curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-${GLIBC_VER}.apk && \
curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk && \
apk add --no-cache glibc-${GLIBC_VER}.apk glibc-bin-${GLIBC_VER}.apk

# install awscliv2
RUN curl -sL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip && \
unzip -q awscliv2.zip && \
aws/install

DooDをするための方法

DooDはDocker outside of Dockerの略です。
ホストのDockerソケット/var/run/docker.sockをマウントすることで、Dockerコンテナ内からもDockerの機能を使用できるようにすることです。
注意としては、ホストと同じDockerデーモンを使用するためイメージなども共有されます。

Alpine Linuxなど、Dockerコマンドがない場合はインストールが必要です。

Dockerfile
FROM golang:alpine

# install Docker CLI
RUN apk update && \
apk add --no-cache docker-cli && \
apk add --no-cache docker-compose

Dockerfileを使用してコンテナを起動する際は、以下のように-vオプションでソケットをマウントします。

docker run -it -v /var/run/docker.sock:/var/run/docker.sock <IMAGE_ID> /bin/ash

おすすめの方法は、docker-compose.ymlを作成してvolumesで予め記述することです。

docker-compose.yml
version: '3'
services:
  dood:
    container_name: dood-container
    build: .
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    entrypoint: ash
    tty: true
docker-compose build --no-cache
docker-compose up -d
docker-compose exec dood /bin/ash

Terraform+AWS CLI+DooDをする

これまで説明した内容をふまえて、Terraform,AWS CLI,Dockerコマンドが使用できるDockerfileを作成します。

Dockerfile
FROM hashicorp/terraform:latest

# install Docker CLI
RUN apk update && \
apk add --no-cache docker-cli && \
apk add --no-cache docker-compose

# install glibc
ENV GLIBC_VER=2.34-r0
RUN apk --no-cache add binutils curl && \
curl -sL https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub && \
curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-${GLIBC_VER}.apk && \
curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk && \
apk add --no-cache glibc-${GLIBC_VER}.apk glibc-bin-${GLIBC_VER}.apk

# install awscliv2
RUN curl -sL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip && \
unzip -q awscliv2.zip && \
aws/install

docker-compose.ymlで作成したDcokerfileのフォルダパスを指定します。(例では同じ階層にある想定です。)
また、DooDのためにvolumes/var/run/docker.sockをマウントします。

docker-compose.yml
version: '3'
services:
  terraform:
    container_name: terraform-container
    build: .
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    entrypoint: ash
    tty: true

コンテナを立ち上げてみましょう。

docker-compose build --no-cache
docker-compose up -d
docker-compose exec terraform /bin/ash

execで中に入れたら、各ツールが使えるか確かめましょう。
例としてバージョンを確認してみます。

Terraformバージョン確認
terraform -v
Terraform v1.0.6
Dockerバージョン確認
docker -v
Docker version 20.10.7, build f0df35096d5f5e6b559b42c7fde6c65a2909f7c5
AWSCLIバージョン確認
aws --version
aws-cli/2.2.36 Python/3.8.8 Linux/5.10.16.3-microsoft-standard-WSL2 exe/x86_64.alpine.3 prompt/off

さいごに

Alpine Linuxコンテナをベースに、TerraformやAWS CLIを使用する方法を説明しました。
DooDを組み合わせることで、TerraformでAWSのコンテナ関連サービスを利用する際に役立つのではないかと思いますので、ぜひ利用して頂ければ幸いです。

参考

DooD(Docker outside of Docker)でボリュームマウント
DockerでTerraformを使う
Alpine ベースのコンテナイメージで AWS CLI v2 を使う

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?