Я следую инструкциям HashiCorp по предоставлению AWS CodePipeline веб-перехватчика здесь. Я продолжаю получать ошибки:
$ terraform plan -var-file = "secret.tfvars" -out=tfplan -input=false
Error: provider.github: "organization": required field is not set
Error: provider.github: "token": required field is not set
Но в их документации нет места, где можно добавить эти поля. Я пытался добавить их на все этапы или только на этап исходного кода, потому что это единственный раз, когда GitHub упоминается как поставщик.
Мне удалось подготовить их AWS CodePipeline без веб-перехватчика здесь. У этого есть возможность периодически проводить опрос, но не мгновенно, как параметр веб-перехватчика, который я могу настроить с помощью консоли.
Для вашего удобства вот файл tf:
resource "aws_codepipeline" "bar" {
name = "tf-test-pipeline"
role_arn = "${aws_iam_role.bar.arn}"
artifact_store {
location = "${aws_s3_bucket.bar.bucket}"
type = "S3"
encryption_key {
id = "${data.aws_kms_alias.s3kmskey.arn}"
type = "KMS"
}
}
stage {
name = "Source"
action {
name = "Source"
category = "Source"
owner = "ThirdParty"
provider = "GitHub"
version = "1"
output_artifacts = ["test"]
configuration = {
Owner = "my-organization"
Repo = "test"
Branch = "master"
}
}
}
stage {
name = "Build"
action {
name = "Build"
category = "Build"
owner = "AWS"
provider = "CodeBuild"
input_artifacts = ["test"]
version = "1"
configuration = {
ProjectName = "test"
}
}
}
}
# A shared secret between GitHub and AWS that allows AWS
# CodePipeline to authenticate the request came from GitHub.
# Would probably be better to pull this from the environment
# or something like SSM Parameter Store.
locals {
webhook_secret = "super-secret"
}
resource "aws_codepipeline_webhook" "bar" {
name = "test-webhook-github-bar"
authentication = "GITHUB_HMAC"
target_action = "Source"
target_pipeline = "${aws_codepipeline.bar.name}"
authentication_configuration {
secret_token = "${local.webhook_secret}"
}
filter {
json_path = "$.ref"
match_equals = "refs/heads/{Branch}"
}
}
# Wire the CodePipeline webhook into a GitHub repository.
resource "github_repository_webhook" "bar" {
repository = "${github_repository.repo.name}"
name = "web"
configuration {
url = "${aws_codepipeline_webhook.bar.url}"
content_type = "form"
insecure_ssl = true
secret = "${local.webhook_secret}"
}
events = ["push"]
}
Update
Одна из вещей, которые я пробовал, это:
stage {
name = "Source"
action {
name = "Source"
category = "Source"
owner = "ThirdParty"
provider = "GitHub"
token = "${var.github_token}"
organization = "${var.github_username}"
version = "1"
output_artifacts = ["SourceArtifact"]
configuration {
# Owner = "${var.github_username}"
# OAuthToken = "${var.github_token}"
Repo = "${var.github_repo}"
Branch = "master"
PollForSourceChanges = "true"
}
}
}





Поэтому вам нужно сначала установить Гитхаб-провайдер.
Образец как:
# Configure the GitHub Provider
provider "github" {
token = "${var.github_token}"
organization = "${var.github_organization}"
}
Это в стадии Источник. Я пытался добавить туда organization и token, но это не сработало. Должен ли я указывать провайдера «github» сверху?
Откуда сцена? кодопровод? у вас был какой-нибудь tf-файл с provider "github" {}?
Кроме того, пожалуйста, поймите, что я просто использовал примеры HashiCorp. Тот, что без вебхука, отлично работает без провайдера «github» var.
Да, этапы являются частью codepipeline. Нет, у меня нет файла tf с provider "github", потому что в другом примере (без вебхука) он не нужен.
Это правильный ответ на вашу фактическую ошибку, которую вы имеете в вопросе, где Terraform жалуется, что вы не определили token или organization ни в конфигурации провайдера, ни через переменные среды. Если у вас есть несколько проблем, вы должны разделить свои вопросы или переработать этот вопрос, чтобы более правильно указать проблему, которую решает ваш ответ.
@BMW У меня вопрос: нужно ли добавлять еще одного провайдера в код terraform, если у вас уже есть один провайдер. В этом случае, если у меня есть провайдер «aws», мне нужно добавить провайдера «git»?
они разные и от случая к случаю. например, если вам нужен null , поставщик шаблонов, terraform автоматически загрузит его при «terraform init», но для поставщика github в основном вам нужно установить детали
Мне пришлось добавить поставщика github в модуль, который создавал конвейер. Не уверен, почему определение моего корня main.tf, а затем ожидание передачи не сработало. Но это определенно решение для создания веб-перехватчика против частного репо.
Я понял проблему, которая у меня была:
В шаблоне terraform есть переменная с именем
locals {
webhook_secret = "super-secret"
}
Это будет использоваться для создания секрета веб-перехватчика с GitHub при развертывании шаблона. Без webhook_secret. Без webhook_secret, даже если вы добавите провайдера, такого как ответ BMW на token и вопрос organization, ошибка сохранится.
HashiCorp также рекомендует создавать, хранить и извлекать секрет веб-перехватчика из среды или чего-то вроде хранилища параметров SSM.
Вы также можете проверить Руководство GitHub по созданию и защите вашего секрета веб-перехватчика (например, взяв вывод ruby -rsecurerandom -e 'помещает SecureRandom.hex(20)' на терминал)
Вот рабочий шаблон, я только вставил изменения, остальное (...) выглядит так же, как в примере HashiCorp:
# Input variables
variable "aws_region" {
type = "string"
default = "us-east-1"
}
variable "pipeline_name" {
type = "string"
default = "static-website-terraform"
}
variable "github_username" {
type = "string"
default = "nditech"
}
variable "github_token" {
type = "string"
}
variable "webhook_secret" {
type = "string"
}
...
# Add webhook to pipeline
resource "aws_codepipeline_webhook" "codepipeline" {
name = "${var.pipeline_name}-codepipeline-webhook"
authentication = "GITHUB_HMAC"
target_action = "Source"
target_pipeline = "${aws_codepipeline.codepipeline.name}"
authentication_configuration {
secret_token = "${var.webhook_secret}"
}
filter {
json_path = "$.ref"
match_equals = "refs/heads/{Branch}"
}
}
# Wire the CodePipeline webhook into a GitHub repository.
resource "github_repository_webhook" "codepipeline" {
repository = "${var.github_repo}"
name = "web"
configuration {
url = "${aws_codepipeline_webhook.codepipeline.url}"
content_type = "form"
insecure_ssl = true
secret = "${var.webhook_secret}"
}
events = ["push"]
}
Это не связано с ошибкой в вашем вопросе, когда Terraform говорит, что вы не определили требуемые token или organization ни в конфигурации провайдера, ни через переменные среды.
Тем не менее, спасибо за уведомление.
Где код про
provider?