AWSでterraformによる環境構築を自動化（docker）

# やりたいこと
- AWSに立てたCIサーバ（EC2・jenkins）でterraformを叩いてインフラのコード化
- terraformはVMの環境に左右されないようコンテナ上で実行
- imageはECRに保存しておく

# 設計
以下二つのジョブをjenkins上で作成
1. ECRへのイメージ自動pushのジョブ
2. イメージからコンテナを立ててterraformを実行するジョブ
<img width="516" alt="スクリーンショット 2017-11-09 17.54.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/198985/b671f992-438d-7911-c72a-273367676fe2.png">

# 1に関して
ひとまず`aws login`してからpushする

```groovy:Jenkinsfile
#!groovy
pipeline {
    agent any
    triggers {
        pollSCM('H/3 * * * 1-5')
    }
    //environment {}
    stages {
        stage('Master Branch <pushing>') {
            when {
                branch 'master'
            }
            steps {
                ansiColor('xterm') {
                    echo '<<< start pushing >>>'
                    sh 'aws ecr get-login --no-include-email --region ap-northeast-1 > temp.sh'
                    sh '''
                        echo "***@***.co.jp" | sudo sh temp.sh
                        sudo docker build -t ***** .
                        sudo docker tag *****:latest *****.ap-northeast-1.amazonaws.com/*****:latest
                        sudo docker push *****.ap-northeast-1.amazonaws.com/*****:latest
                    '''
                }
            }
        }
    }
}
```

```Dockerfile:Dockerfile（コピペなのでいらないもの入っているかもしれません...）
FROM python:3.6

ARG TERRAFORM_VERSION=0.10.0

RUN apt-get clean && \
    rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* && \
    apt-get update && \
    apt-get -y upgrade && \
    apt-get install -y --no-install-recommends unzip zip jq ca-certificates curl lsb-release gawk

# install python modules
COPY requirements.txt .
RUN pip install -r requirements.txt

# install Terraform
RUN mkdir /tmp/terraform && \
    cd /tmp/terraform && \
    curl -O -sS -L https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip && \
    unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip && \
    rm terraform_${TERRAFORM_VERSION}_linux_amd64.zip && \
    mv terraform* /usr/local/bin && \
    rm -rf /tmp/terraform

RUN apt-get clean && \
    rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*
```

# 2に関して
jenkinsfileのagentでコンテナを指定しようとするも失敗
- ECRからpullするには先にloginしておく必要がある
- localのイメージを使おうとしても`docker pull`をしてしまう（alwaysPull falseも効果なし）


愚直にコンテナを起動して内部でterraformを叩く...

```groovy:Jenkinsfile
#!groovy
pipeline {
    agent any
    triggers {
        pollSCM('H/3 * * * 1-5')
    }
    stages {
        stage('Pull Request <Plan>') {
            when {
                branch 'PR-*'
            }
            steps {
                ansiColor('xterm') {
                    echo '<<< start planning >>>'
                    sh "docker run --name tmp-jenkins -id ***** | echo 'ignore failure'"
                    sh "docker start tmp-jenkins | echo 'ignore failure'"
                    sh "docker exec tmp-jenkins mkdir /tmp/terraform | echo 'ignore failure'"
                    sh "docker exec tmp-jenkins rm -rf /tmp/terraform/*"
                    sh "docker cp ./ tmp-jenkins:/tmp/terraform/"
                    sh "docker exec tmp-jenkins ls /tmp/terraform/"
                    sh "docker exec tmp-jenkins sh -c 'cd /tmp/terraform/ && terraform init -backend-config \"bucket=*****\"'"
                    sh "docker exec tmp-jenkins sh -c 'cd /tmp/terraform/ && terraform env select dev'"
                    sh "docker exec tmp-jenkins sh -c 'cd /tmp/terraform/ && terraform plan'"
                    sh "docker exec tmp-jenkins sh -c 'cd /tmp/terraform/ && terraform apply'"
                    sh "docker stop tmp-jenkins"
                }
            }
        }
    }
}
```

# 結果
- ひとまずterraformを動かすことができた
- ただ何かを作ろうとするとエラーが出る...
　`* provider.aws: dial unix /tmp/plugin392670482|netrpc: connect: no such file or directory`
- ~~あとこれを解決すれば完成...~~　＝＞terraformを 0.10.0 -> 0.10.8にすることで解決