Comprensione delle fonti di dati Terraform - AWS Guida prescrittiva

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Comprensione delle fonti di dati Terraform

È molto comune che gli stack di implementazione si basino su dati provenienti da risorse precedentemente esistenti. La maggior parte degli strumenti IaC consente di importare risorse create con altri processi. Queste risorse importate sono generalmente di sola lettura (sebbene i ruoli IAM rappresentino un'eccezione notevole) e vengono utilizzate per accedere ai dati necessari alle risorse all'interno dello stack. AWS CloudFormation consente di importare risorse, ma questa idea può essere spiegata meglio esaminando. AWS Cloud Development Kit (AWS CDK)

AWS CDK Aiuta gli sviluppatori a utilizzare i linguaggi di programmazione esistenti per generare CloudFormation modelli. Il risultato finale di un' AWS CDK operazione è una risorsa importata in CloudFormation. Tuttavia, la sintassi utilizzata con AWS CDK rende più semplice il confronto con Terraform. Ecco un esempio di importazione di una risorsa utilizzando. AWS CDK

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

Una risorsa importata viene in genere creata chiamando un metodo statico sulla stessa classe utilizzata per creare una nuova risorsa dello stesso tipo. La chiamata new Bucket(... creerebbe una nuova risorsa e la chiamata ne Bucket.fromBucketAttributes(... importerebbe una esistente. Passi un sottoinsieme delle proprietà del bucket alla funzione in modo che AWS CDK possa trovare il bucket giusto. Un'altra differenza, tuttavia, è che la creazione di un nuovo bucket restituisce un'istanza completa della Bucket classe, con tutte le proprietà e i metodi disponibili all'interno. L'importazione della risorsa restituisce unIBucket, che è un tipo che contiene solo le proprietà che Bucket deve avere. Sebbene sia possibile importare una risorsa da uno stack esterno, le opzioni su come utilizzarla sono limitate.

In Terraform, un obiettivo simile viene raggiunto utilizzando fonti di dati. La maggior parte delle risorse Terraform definite dispone di una fonte di dati di accompagnamento. Di seguito è riportato un esempio di risorsa bucket Terraform S3 seguita dalla fonte di dati corrispondente.

# 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" }

L'unica differenza tra questi due elementi è il prefisso del nome. Come illustrato nella documentazione relativa a un'origine dati, è possibile passare a un'origine dati un numero inferiore di parametri rispetto a una risorsa. Questo perché la risorsa utilizza questi parametri per dichiarare tutte le proprietà di un nuovo bucket S3, mentre la fonte di dati richiede solo le informazioni sufficienti per identificare e importare in modo univoco i dati di una risorsa esistente.

La somiglianza tra la sintassi di una risorsa Terraform e una fonte di dati può essere comoda, ma può anche essere problematica. È normale che gli sviluppatori Terraform alle prime armi utilizzino accidentalmente una fonte di dati anziché una risorsa nella loro configurazione. Le fonti di dati Terraform sono sempre di sola lettura. Puoi usarli al posto della risorsa corrispondente per azioni di lettura (come fornire un nome ID a un'altra risorsa). Tuttavia, non è possibile utilizzarli per azioni di scrittura, che modificano radicalmente alcuni aspetti della risorsa sottostante. Per questo motivo, puoi pensare a un'origine dati Terraform come a una versione clonata della risorsa sottostante.

Analogamente al precedente esempio di AWS CDK iBucket, le fonti di dati sono utili per scenari di sola lettura. Se hai bisogno di ottenere dati da una risorsa esistente ma non hai bisogno di mantenerla all'interno del tuo stack, utilizza una fonte di dati. Un buon esempio di ciò è quando crei un'istanza Amazon EC2 che utilizza il VPC predefinito dell'account. Poiché quel VPC esiste già, tutto ciò che devi fare è inserirne i dati. Il seguente esempio di codice mostra come utilizzare i dati per identificare il VPC di destinazione.

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 }