Ошибка организации веб-крючков Terraform и ошибка токена

#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 or organization ни в конфигурации поставщика, ни через переменные среды. Если у вас возникает несколько проблем, вам следует разделить свои вопросы или переработать этот вопрос, чтобы более правильно указать проблему, которую решает ваш ответ.

Ответ №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 or organization ни в конфигурации поставщика, ни через переменные среды.

2. Тем не менее, спасибо за уведомление.