Kanji
・Cloud Engineer / Freelance ・Geboren 1993 ・Aus Ehime / Wohnhaft in Shibuya, Tokio ・5 Jahre AWS-Erfahrung Profildetails
Inhaltsverzeichnis
– Hier ist eine Liste der AWS-Ressourcen, die ich häufig verwende. - Manchmal ist eine Datenquelle nicht verfügbar, aber Sie können ähnliche Ergebnisse erzielen, indem Sie die externe Datenquelle verwenden, um AWS-Ressourceninformationen abzurufen. - Es gibt einzelne und mehrere Datenquellen.Mit mehreren Datenquellen können Sie Informationen über mehrere AWS-Ressourcen gleichzeitig abrufen. – Eine einzelne Datenquelle gibt einen Fehler zurück, wenn die Ziel-AWS-Ressource nicht vorhanden ist, aber eine mehrere Datenquelle gibt eine leere Liste zurück, wenn keine Ressourcen gefunden werden. - Damit kann die Existenz von Ressourcen überprüft werden.
Wenn Sie eine benutzerdefinierte Datenquelle definieren müssen, verwenden Sie die externe Datenquelle.
external_external |Datenquellen |hashicorp/external |Terraform-Registrierung – Um Informationen über vorhandene Ressourcen als Datenquelle abzurufen, verwenden Sie ein Skript (z. B. Bash oder Python), das eine JSON-formatierte Zeichenfolge ausgibt.
Da CodePipeline beispielsweise keine kompatible Datenquelle hat, können Sie ein Shell-Skript verwenden, um Informationen abzurufen.
Hier ist ein Beispiel-Shell-Skript:
#!/bin/bash eval "$(jq -r '@sh "codepipeline_name_prefix=\(.codepipeline_name_prefix)"')" pipelines=$(\ aws codepipeline \ list-pipelines \ --query "pipelines[?starts_with(name, '"${codepipeline_name_prefix}"')].name" \ --region ap-northeast-1 \ --output json ) # Key point result=$(cat << EOS { "names": $(echo "${pipelines}" | jq '@json') } EOS ) jq -n "$result"
# Before the change result=$(cat << EOS { "names": $(echo "${pipelines}") } EOS ) # Resulting variable { "names": [ "test-pipeline01", "test-pipeline02", "test-pipeline03", "test-pipeline04", "test-pipeline05" ] }
– Wenn Sie diese Ausgabe in der externen Datenquelle von Terraform verwenden, erhalten Sie die folgende Fehlermeldung: – Die Ausgabe muss eine Zuordnung von Zeichenfolgenschlüsseln und Zeichenfolgenwerten sein.
% terraform plan data.external.aws_codepipelines: Reading... ╷ │ Error: Unexpected External Program Results │ │ with data.external.aws_codepipelines, │ on test.tf line 2, in data "external" "aws_codepipelines": │ 2: program = ["bash", "${path.module}/ListCodePipelineNames.sh"] │ │ The data source received unexpected results after executing the program. │ │ Program output must be a JSON encoded map of string keys and string values. │ │ If the error is unclear, the output can be viewed by enabling Terraform's logging at TRACE level. │ Terraform documentation on logging: https://www.terraform.io/internals/debugging │ │ Program: /bin/bash │ Result Error: json: cannot unmarshal array into Go value of type string
| in einen String umgewandeltjq '@json'
# After the change result=$(cat << EOS { "names": $(echo "${pipelines}" | jq '@json') } EOS ) # Resulting variable { "names": "[\"test-pipeline01\",\"test-pipeline02\",\"test-pipeline03\",\"test-pipeline04\",\"test-pipeline05\"]" }
data "external" "aws_codepipelines" { program = ["bash", "${path.module}/scripts/ListCodePipelineNames.sh"] query = { codepipeline_name_prefix = "test-pipeline0" } } # Key point output "aws_codepipelines_names" { value = jsondecode(data.external.aws_codepipelines.result["names"]) }
Erstellen Sie ein Verzeichnis „scripts“ im selben Verzeichnis wie Ihre Terraform-Vorlage und verweisen Sie auf das Skript „ListCodePipelineNames.sh“. – Mit dem „Query“-Block können Sie „codepipeline_name_prefix“ als Argument angeben, sodass Sie Pipeline-Namen nach Präfix filtern können. Wenn Sie „codepipeline_name_prefix“ angeben, beziehen Sie sich nur auf den Pipelinenamen, der mit der angegebenen Zeichenfolge beginnt.
Der entscheidende Punkt ist der Ausgabebereich.Verwenden Sie die Funktion „jsondecode()“ von Terraform, um die Zeichenfolge im Schlüssel „names“ aus der Ausgabe der externen Datenquelle zurück in ein Array zu dekodieren. – In der Praxis können Sie dieses Muster auch verwenden, um auf andere Ressourcen zu verweisen: Konvertieren Sie Arrays in Ihrem Skript in Strings und dekodieren Sie sie dann zur weiteren Verarbeitung in Terraform.