使用Docker来创建Terraform环境

总结

我打算使用Terraform来操作AWS,并将其docker化以便随时使用。

前提条件是指一个事件或情况发生的先决条件。

    • macOS

 

    Docker Toolbox ( Docker for mac )

文件结构

我要创建以下类型的文件。

opt
 ├ docker
 │ └ terraform
 │    ├ .aws
 │    │  ├ config.default
 │    │  └ credentials.default
 │    ├ Dockerfile
 │    └ init.sh
 ├ src
 │  ├ main.tf
 │  └ variables.tf
 └ docker-compose.yml

使用Terraform建立

创建一个能够使用terraform命令的环境,在docker容器中。

创建Dockerfile

FROM python:3.6

ARG pip_installer="https://bootstrap.pypa.io/get-pip.py"
ARG awscli_version="1.16.168"

# install aws-cli
RUN pip install awscli==${awscli_version}

# install sam
RUN pip install --user --upgrade aws-sam-cli
ENV PATH $PATH:/root/.local/bin

# install command.
RUN apt-get update && apt-get install -y less vim wget unzip

# install terraform.
# https://azukipochette.hatenablog.com/entry/2018/06/24/004354
RUN wget https://releases.hashicorp.com/terraform/0.11.13/terraform_0.11.13_linux_amd64.zip && \
    unzip ./terraform_0.11.13_linux_amd64.zip -d /usr/local/bin/

# create workspace.
COPY ./src /root/src

# initialize command.
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
COPY ./docker/terraform/.aws /root/.aws
COPY ./docker/terraform/init.sh /root/init.sh
RUN chmod +x /root/init.sh && /root/init.sh

WORKDIR /root/src

创建 init.sh

我会根据以下内容进行创建。

#!/bin/bash

source /root/.bashrc

if [[ ! -e /root/.aws/config ]]; then
    mv /root/.aws/config.default /root/.aws/config
fi

if [[ ! -e /root/.aws/credentials ]]; then
    mv /root/.aws/credentials.default /root/.aws/credentials
    sed -i "s/<access-key>/${AWS_ACCESS_KEY_ID}/g" /root/.aws/credentials
    sed -i "s/<secret-key>/${AWS_SECRET_ACCESS_KEY}/g" /root/.aws/credentials
fi

※ AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY将从外部传入

AWS配置文件

创建初始配置文件。

[default]
region = ap-northeast-1
output = json

※ ap-northeast-1:东京区域

[default]
aws_access_key_id = <access-key>
aws_secret_access_key = <secret-key>

※ 和需要在init.sh中进行替换。

创建docker-compose.yml文件

我会根据下面的内容进行创建。

version: '3'
services:
  terraform:
    container_name: 'terraform'
    image: local/terraform
    build:
      context: ./
      dockerfile: docker/terraform/Dockerfile
      args:
        AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-**********}
        AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-****************}
    #volumes:
    #  - ./src:/root/src

关于”volumes”部分的注释
在Windows环境下使用terraform的modules功能时,会出现符号链接错误
(我认为在Mac环境下可以将其注释掉)

创建 Docker 镜像

使用以下命令创建Docker镜像。

$ export AWS_ACCESS_KEY_ID='xxxxxxxxxxxxx'           # ← 自分のAWcdS Access Key ID
$ export AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxx'  # ← 自分のAWS Secret Access Key
$ docker-compose build

为了向Dockerfile传递信息,需要先设置环境变量,然后执行构建操作。

启动Docker容器

使用以下命令启动terraform容器。

# コンテナ起動
$ docker-compose run --rm terraform bash

确认Terraform的版本。

$ terraform --version
Terraform v0.11.13

确认aws-cli的版本。

$ aws --version
aws-cli/1.16.168 Python/3.6.9 Linux/3.10.0-862.el7.x86_64 botocore/1.12.204

terraform配置

这是一个创建S3存储桶的简单示例。

# AWS設定
provider "aws" {
  region   = "${var.aws["region"]}"
  profile  = "${var.aws["profile"]}"
}

# S3バケットの作成
resource "aws_s3_bucket" "HogeSampleImage" {
  bucket = "hoge-sample-images"
  acl    = "private"
}
variable "aws" {
  default = {
    profile = "default"
    region  = "ap-northeast-1"
  }
}

运行 Terraform

在初始化terraform并确认执行计划后执行。

$ terraform init
$ terraform plan
$ terraform apply

以上

以上内容

以上所述

以上所列

其他

有关AWS配置更改.

请配置AWS

如果需要在容器启动后进行配置更改,请在容器内执行以下命令。

$ aws configure
AWS Access Key ID [None]: ***********************      # ← 自分のAWcdS Access Key ID
AWS Secret Access Key [None]: ***********************  # ← 自分のAWS Secret Access Key
Default region name [None]: ap-northeast-1
Default output format [None]: json

设定具有必要操作权限的IAM用户的信息。

.aws/config文件

请在下面的文件中添加个人资料等信息。

$ vi ~/.aws/config

[default]
region = ap-northeast-1
output = json

[profile hoge]
role_arn = arn:aws:iam::{AWSアカウントID}:role/AllowSwitchRole
source_profile = default

您可以通过添加配置文件来实现像上述示例中所示的SwitchRole功能。

以上

请参考以下网站

    • HashiCorp – Terraformのインストール

 

    • HashiCorp – Terraformドキュメント

 

    • HashiCorp – Terraformの構成言語

 

    • HashiCorp – Terraformコマンド

 

    • Terraformにおけるディレクトリ構造のベストプラクティス

 

    • Terraformでmappingをmoduleに渡す方法

 

    • Terraform職人入門: 日々の運用で学んだ知見を淡々とまとめる

 

    • Terraformのstate mvを使ってべた書きしたリソースをモジュールに移す

 

    TerraformでError reading config for xxxx : Invalid dot index foundエラ…
广告
将在 10 秒后关闭
bannerAds