Open matsumoto-ops opened 4 years ago
@inamuu 遅くにすみません。terraformにようやく取り掛かったのですが、 .tfvarsにaws credential情報を、.tfstateにS3情報をて
を打つと以下のエラーがでます。
$ terraform plan
Error: Error loading state: 2 problems:
- Unsupported state file format: The state file could not be parsed as JSON: syntax error at byte offset 2.
- Unsupported state file format: The state file does not have a "version" attribute, which is required to identify the format version.
https://cloudii.atomitech.jp/entry/2018/08/20/195429 を参考にtfstateを作成したのですが、情報が古いでしょうか? tfstateのフォーマットは以下の通りです。
terraform {
backend "s3" {
bucket = "<bucket_name>"
key = "terraform.tfstate"
profile = "<profile_name>" # ~/.aws/credentials
region = "us-phoenix-1"
skip_region_validation = true
skip_credentials_validation = true
skip_requesting_account_id = true
skip_get_ec2_platforms = true
skip_metadata_api_check = true
force_path_style = true
}
}
aws s3 lsは問題なく通ります。
admin@home-pc MINGW64 /c/work/menta/terraform (future)
$ aws s3 ls --profile dev-user
2020-08-07 05:53:39 terraform-state-storage-kensyu
@matsumoto-ops 参照記事が少し古いのとバージョンが書いていないので、もう使えないかもしれません。 Terraformは他のツールと比べると、破壊的アップデートが多く、0.11から0.12でかなり変わったのでその影響かもしれません。
下記を参考に設定してみてください。
backend.tf
provider "aws" {
profile = "XXXXXXXXXXX"
region = var.aws_region
}
terraform {
backend "s3" {
bucket = var.backend_bucket_name
key = "terraform.tfstate"
region = var.aws_region
profile = "XXXXXXXXXXX"
}
}
terraform.tfvars
access_key = "AWS_ACCESS_KEY"
secret_key = "AWS_SECRET_KEY"
region = "ap-northeast-1"
profile_name = "XXXXXX"
variables.tf
variable "aws_account_id" {
default = "XXXXXXXXXXX"
}
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "profile_name" {}
variable "aws_region" {
default = "ap-northeast-1"
}
@matsumoto-ops terraform.tfvars は必ず .gitignoreに追加しておいてください。(AWSのキーの漏洩防ぎです)
@inamuu 修正して実行しましたがエラーになりました
admin@home-pc MINGW64 /c/work/menta/terraform (future)
$ terraform apply
Error: Duplicate provider configuration
on main.tf line 1:
1: provider "aws" {
A default (non-aliased) provider configuration for "aws" was already given at
backend.tf:1,1-15. If multiple configurations are required, set the "alias"
argument for alternative configurations.
Error: Duplicate backend configuration
on main.tf line 10, in terraform:
10: backend "s3" {
A module may have only one backend configuration. The backend was previously
configured at backend.tf:7,3-15.
backend.tfのこれはどこからとってくるものですか? デフォルトでtfvarsなのでしょうか? backend_bucket_nameをtfvarsに入れてみればいいですかね?
var.backend_bucket_name
tfvarに追記してみるとエラーが変わりました。
$ terraform apply
Error: Duplicate provider configuration
on main.tf line 1:
1: provider "aws" {
A default (non-aliased) provider configuration for "aws" was already given at
backend.tf:1,1-15. If multiple configurations are required, set the "alias"
argument for alternative configurations.
Error: Duplicate backend configuration
on main.tf line 10, in terraform:
10: backend "s3" {
A module may have only one backend configuration. The backend was previously
configured at backend.tf:7,3-15.
@inamuu Duplicateは重複ですかね。 providerは1回指定すれば良いので、backendとmain.tfそれぞれに書いてしまうとエラーになると思います。 main.tfをどのように書かれているか不明ですが、まずは、私がお送りしたファイルだけで構成してみてください。 それ以外は .bakなどにしてリネームしてからやってみてください。
Error: Duplicate provider configuration
on main.tf line 1:
1: provider "aws" {
重複っぽかったのでmain.tfをのぞいてみたのですが 以下エラーとなりました。
admin@home-pc MINGW64 /c/work/menta/terraform (future)
$ terraform init
Initializing the backend...
Backend configuration changed!
Terraform has detected that the configuration specified for the backend
has changed. Terraform will now check for existing state in the backends.
Error: Variables not allowed
on backend.tf line 8, in terraform:
8: bucket = var.backend_bucket_name
Variables may not be used here.
Error: Variables not allowed
on backend.tf line 10, in terraform:
10: region = var.aws_region
Variables may not be used here.
terraformはtfファイルを全部くっつけて一ファイルにしてから 実行するっていう理解であってますか? @inamuu
git のfutureブランチに上げてますのでご確認頂けますでしょうか。
@matsumoto-ops
あー、すいません、私が渡したファイルに不足がありました。
Variables may not be used here.
は変数不足になるので、エラーになっている箇所で backend_bucket_name
でS3のバケットを variables.tf で指定してみてください。
terraformはtfファイルを全部くっつけて一ファイルにしてから
いえ、ファイルは分かりやすいように目的ごとに応じて分けていただければ大丈夫です。 1つにしても良いですが、わからなくなるので分けていただいたほうが運用上良いかと思います。
@inamuu tfvarsのほうに
backend_bucket_name = "terraform-state-storage-kensyu"
を追加しています。
今回variables.tfの方に
variable "backend_bucket_name" {}
を追加したのですが同じエラーでした。
variables.tfの以下の値はtfvarsをみて対応するのを拾ってきてくれていて
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "profile_name" {}
variable "backend_bucket_name" {}
backent.tfにある
var.backend_bucket_name
のvarはvariables.tfからとってきてると思ってるんですが違いますでしょうか。。
@matsumoto-ops
varはvariables.tfからとってきてると思ってるんですが違いますでしょうか。。
あってます!
ただ、tfvarsに書いた値は自動的に呼び出されます。
今回エラーになっている、backend_bucket_name
は変数として vars.backend_bucket_name
としています。
この指定の場合は、variables.tf に下記のように記載が必要です。
variable "backend_bucket_name" {
default = "XXX"
}
@inamuu
variable "backend_bucket_name" {
default = "terraform-state-storage-kensyu"
}
とvariables.tfにバケットネームをべた書きしましたが同様のエラーでした。
$ terraform init
Initializing the backend...
Backend configuration changed!
Terraform has detected that the configuration specified for the backend
has changed. Terraform will now check for existing state in the backends.
Error: Variables not allowed
on backend.tf line 8, in terraform:
8: bucket = var.backend_bucket_name
Variables may not be used here.
Error: Variables not allowed
on backend.tf line 10, in terraform:
10: region = var.aws_region
Variables may not be used here.
default = ${backend_bucket_name} でtfvarsのを呼べるかなと思ったのですがよりおかしくなったので 戻しました。
中々難しいですね。。。
@inamuu エラーになっていたところはべた書きにして実施すると jsonのsyntax errorみたいなメッセージになります。
$ terraform init
Initializing the backend...
Error refreshing state: 2 problems:
- Unsupported state file format: The state file could not be parsed as JSON: syntax error at byte offset 2.
- Unsupported state file format: The state file does not have a "version" attribute, which is required to identify the format version.
一旦gitに上げたのでご確認頂けますでしょうか。
@matsumoto-ops すみません、昨日今日とちょっと見られていないので明日確認します!
@matsumoto-ops レビューするのにあたりPRがないとコメントできないので、今後はPRを出してもらえますでしょうか。 とりあえず気になった点を幾つかここにコメントしちゃいます。
Terraformのバージョンが0.12.8になっていましたが、一度最新にあわせてみてください。
required_version = "0.12.8" │
variables.tfですが、下記の終わりの}
がずれてますね。直してみてください。
variable "backend_bucket_name" {
default = "terraform-state-storage-kensyu"
}
terraform initをする前に、terraform fmt
を必ず実行するようにすると良いかと思います。
@inamuu 直したものの特に変化はありませんでした。 https://github.com/matsumoto-ops/menta/pull/24
@inamuu すみません。今後を考えたのですが、せっかくDockerについて基礎的な部分を覚えたので 次はkubernetesを覚えたいのですが、そちらにシフトさせていただくことは可能でしょうか。 仕事でも保守環境があり、基本を押さえておきたく。 将来的にCircleCIやTerraformを使ってKubernetes環境の構築や更新ができたら嬉しいのですが。
@matsumoto-ops EKSで良ければ可能です!では一旦TerraformはやめてEKSでやってみますか?
@inamuu はい。 一旦kubernetes優先にしていただけると嬉しいです!
@matsumoto-ops いつものようにissueを作成してくださいー。 その後にeksctlをインストールして、クラスターを作成してみてください。 あと、kubectlもインストールまでお願いします! https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html
その後にsample appをデプロイしてみてもらえると。 https://docs.aws.amazon.com/eks/latest/userguide/sample-deployment.html
@inamuu ちょっと時間がないのもあるのですが、あまり進んでません。 ・eksctl -> Kubernetes環境を構築するツール ・kubectl -> Kubernetes環境を保守していくツール という理解でよろしいでしょうか。
eksctl でKubernetes環境を作成したうえで kubectlでsample appをデプロイする という流れで進めていくということでしょうか。
@matsumoto-ops あってます!
Terraform 1.Terraform を手元から実行出来る環境を作成(backendはS3) 2.Terraform でEC2インスタンスを作成 3.CircleCIを使ってTerraformを実行