Terraform-Datenquellen verstehen - AWS Präskriptive Leitlinien

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Terraform-Datenquellen verstehen

Es ist sehr üblich, dass Deployment-Stacks auf Daten aus zuvor vorhandenen Ressourcen zurückgreifen. Die meisten IaC-Tools bieten die Möglichkeit, Ressourcen zu importieren, die durch einen anderen Prozess erstellt wurden. Diese importierten Ressourcen sind normalerweise schreibgeschützt (obwohl IAM-Rollen eine bemerkenswerte Ausnahme bilden) und werden für den Zugriff auf Daten verwendet, die von Ressourcen innerhalb des Stacks benötigt werden. AWS CloudFormation ermöglicht den Import von Ressourcen, aber diese Idee lässt sich besser erklären, indem man sich die AWS Cloud Development Kit (AWS CDK) ansieht.

Das AWS CDK hilft Entwicklern, bestehende Programmiersprachen zu verwenden, um CloudFormation Vorlagen zu generieren. Das Endergebnis eines AWS CDK Vorgangs ist eine importierte Ressource in CloudFormation. Die mit der verwendete Syntax erleichtert jedoch den AWS CDK Vergleich mit Terraform. Hier ist ein Beispiel für das Importieren einer Ressource mithilfe von. AWS CDK

const importedBucket: IBucket = Bucket.fromBucketAttributes( scope, "imported-bucket", { bucketName: "My_S3_Bucket" } );

Eine importierte Ressource wird normalerweise erstellt, indem eine statische Methode für dieselbe Klasse aufgerufen wird, mit der Sie eine neue Ressource derselben Art erstellen. Beim Aufrufen new Bucket(... würde eine neue Ressource erstellt, und beim Aufrufen wird eine bestehende Ressource Bucket.fromBucketAttributes(... importiert. Sie übergeben eine Teilmenge der Eigenschaften des Buckets an die Funktion, damit sie den richtigen Bucket finden AWS CDK kann. Ein weiterer Unterschied besteht jedoch darin, dass beim Erstellen eines neuen Buckets eine vollständige Instanz der Bucket Klasse mit allen darin verfügbaren Eigenschaften und Methoden zurückgegeben wird. Beim Import der Ressource wird ein zurückgegeben. IBucket Dabei handelt es sich um einen Typ, der nur die Eigenschaften enthält, die Bucket vorhanden sein müssen. Sie können zwar eine Ressource aus einem externen Stack importieren, aber die Möglichkeiten, was Sie damit machen können, sind begrenzt.

In Terraform wird ein ähnliches Ziel durch die Verwendung von Datenquellen erreicht. Zu den meisten definierten Terraform-Ressourcen steht zusätzlich eine zugehörige Datenquelle zur Verfügung. Das Folgende ist ein Beispiel für eine Terraform S3-Bucket-Ressource, gefolgt von der entsprechenden Datenquelle.

# S3 Bucket resource: resource "aws_s3_bucket" "My_S3_Bucket" { bucket = "My_S3_Bucket" } # S3 Bucket data source: data "aws_s3_bucket" "My_S3_Bucket" { bucket = "My_S3_Bucket" }

Der einzige Unterschied zwischen diesen beiden Elementen ist das Namenspräfix. Wie in der Dokumentation zu einer Datenquelle gezeigt, sind weniger Parameter verfügbar, die Sie an eine Datenquelle übergeben können als an eine Ressource. Das liegt daran, dass die Ressource diese Parameter verwendet, um alle Eigenschaften eines neuen S3-Buckets zu deklarieren, während die Datenquelle gerade genügend Informationen benötigt, um die Daten einer vorhandenen Ressource eindeutig zu identifizieren und zu importieren.

Die Ähnlichkeit zwischen der Syntax einer Terraform-Ressource und einer Datenquelle kann praktisch, aber auch problematisch sein. Es ist üblich, dass unerfahrene Terraform-Entwickler in ihrer Konfiguration versehentlich eine Datenquelle anstelle einer Ressource verwenden. Terraform-Datenquellen sind immer schreibgeschützt. Sie können sie anstelle der entsprechenden Ressource für Leseaktionen verwenden (z. B. die Bereitstellung eines ID-Namens für eine andere Ressource). Sie können sie jedoch nicht für Schreibaktionen verwenden, die einen Aspekt der zugrunde liegenden Ressource grundlegend verändern. Aus diesem Grund können Sie sich eine Terraform-Datenquelle als eine geklonte Version der zugrunde liegenden Ressource vorstellen.

Ähnlich wie im vorherigen AWS CDK iBucket-Beispiel sind Datenquellen für schreibgeschützte Szenarien nützlich. Wenn Sie Daten aus einer vorhandenen Ressource abrufen müssen, diese Ressource jedoch nicht in Ihrem Stack verwalten müssen, verwenden Sie eine Datenquelle. Ein gutes Beispiel hierfür ist, wenn Sie eine Amazon EC2 EC2-Instance erstellen, die die Standard-VPC des Kontos verwendet. Da diese VPC bereits existiert, müssen Sie nur ihre Daten abrufen. Das folgende Codebeispiel zeigt, wie Daten verwendet werden, um die Ziel-VPC zu identifizieren.

data "aws_vpc" "default" { default = true } resource "aws_instance" "instance1" { ami = "ami-123456" instance_type = "t2.micro" subnet_id = data.aws_vpc.default.main_route_table_id }