使用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エラ…