#amazon-web-services #terraform #aws-codepipeline #terraform-provider-aws
#amazon-веб-сервисы #terraform #aws-codepipeline #terraform-поставщик-aws
Вопрос:
Я следую инструкции от HashiCorp по предоставлению AWS CodePipeline с помощью webhook здесь. Я продолжаю получать ошибки:
$ 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 без webhook здесь. У этого есть возможность периодически выполнять опрос, но не мгновенно, как у опции webhook, для настройки которой я могу использовать консоль.
Для вашего удобства вот 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"]
}
Обновить
Одна из вещей, которые я пробовал, заключается в следующем:
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"
}
}
}
Комментарии:
1. О чем идет речь в коде
provider
?
Ответ №1:
Итак, сначала вам нужно установить поставщика Github.
Пример как:
# Configure the GitHub Provider
provider "github" {
token = "${var.github_token}"
organization = "${var.github_organization}"
}
Комментарии:
1. Это в исходном коде Stage. Я пытался добавить туда
organization
иtoken
, но это не сработало. Должен ли я указывать провайдера «github» сверху подобным образом?2. Откуда берется этап? codepipeline? был ли у вас какой-либо tf-файл с
provider "github" {}
?3. Кроме того, пожалуйста, поймите, что я только что использовал примеры HashiCorp. Веб-сервис без webhook отлично работает без версии поставщика «github».
4. Да, этапы являются частью codepipeline. Нет, у меня нет файла tf с
provider "github"
, потому что в другом примере (без webhook) он не нужен.5. Это правильный ответ на вашу фактическую ошибку, которая у вас есть в вопросе, в котором Terraform жалуется, что вы не определили
token
ororganization
ни в конфигурации поставщика, ни через переменные среды. Если у вас возникает несколько проблем, вам следует разделить свои вопросы или переработать этот вопрос, чтобы более правильно указать проблему, которую решает ваш ответ.
Ответ №2:
Я разобрался с проблемой, которая у меня была:
Шаблон terraform содержит переменную, называемую
locals {
webhook_secret = "super-secret"
}
Это будет использовано для создания секретного веб-крючка с помощью GitHub при развертывании шаблона. Без webhook_secret
. Без webhook_secret
, даже если вы добавите поставщика, такого как ответ BMW на token
и проблему organization
, ошибка будет сохраняться.
HashiCorp также рекомендует создать, сохранить и извлечь секрет webhook из среды или что-то вроде хранилища параметров 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"]
}
Комментарии:
1. Это не связано с ошибкой, которая у вас есть в вашем вопросе, где Terraform сообщает, что вы не определили требуемый
token
ororganization
ни в конфигурации поставщика, ни через переменные среды.2. Тем не менее, спасибо за уведомление.