web-dev-qa-db-fra.com

Comment les sources de données sont-elles utilisées dans Terraform?

La documentation Terraform Data Sources me dit ce qu'est une source de données, mais je ne la comprends pas très bien. Quelqu'un peut-il me donner un cas d'utilisation de la source de données? Quelle est la différence entre cela et configurer quelque chose à l'aide de variables?

14
user389955

Les sources de données peuvent être utilisées pour un certain nombre de raisons; mais leur objectif est de faire quelque chose puis vous donner des données .

Prenons l'exemple de leur documentation :

# Find the latest available AMI that is tagged with Component = web
data "aws_AMI" "web" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:Component"
    values = ["web"]
  }

  most_recent = true
}

Cela utilise la source de données aws_AMI - c'est différent d'une ressource! Il vous fournira simplement des informations et ne créera rien. Cet exemple en particulier appellera le describe-images Appel de l'API AWS, passez quelques --filter options comme spécifié, et retourne un objet dont vous pouvez obtenir des informations - jetez un œil à ces attributs !

  • nom
  • owner_id
  • la description
  • image_id

... La liste continue. Ceci est vraiment utile si j'étais, disons - voulant toujours extraire la dernière AMI correspondant à certaines balises et garder une configuration de lancement à jour avec. Je pourrais utiliser ce fournisseur de données plutôt que de toujours devoir mettre à jour une variable ou coder en dur l'ID.

La source de données peut également être utilisée pour d'autres raisons; l'un de mes favoris est le fournisseur de modèles .

Bonne chance!

19
TJ Biddle

Les sources de données fournissent des informations sur les entités qui sont non gérées par la configuration Terraform actuelle.

Cela peut inclure:

  • Données de configuration de Consul
  • Informations sur l'état des composants d'infrastructure configurés manuellement

En d'autres termes, les sources de données sont en lecture seule des vues sur l'état des composants préexistants externes à notre configuration.

Une fois que vous avez défini une source de données, vous pouvez utiliser les données ailleurs dans votre configuration Terraform.

Par exemple, supposons que nous voulons créer une configuration Terraform pour une nouvelle instance AWS EC2. Nous voulons utiliser une image AMI qui a été créée et téléchargée par un travail Jenkins à l'aide de l'AWS CLI, et non gérée par Terraform. Dans le cadre de la configuration de notre travail Jenkins, cette image AMI aura toujours un nom avec le préfixe app-.

Dans ce cas, nous pouvons utiliser le aws_AMI source de données pour obtenir des informations sur la dernière image AMI portant le préfixe de nom app-.

data "aws_AMI" "app_AMI" {
  most_recent = true
  filter {
    name   = "name"
    values = ["app-*"]
  }
}

Les sources de données exportent les attributs, tout comme les ressources. Nous pouvons interpoler ces attributs en utilisant la syntaxe data.TYPE.NAME.ATTR. Dans notre exemple, nous pouvons interpoler la valeur de l'ID AMI comme data.aws_AMI.app_AMI.id, et passez-le comme l'argument AMI pour notre aws_instance ressource .

resource "aws_instance" "app" {
  AMI           = "${data.aws_AMI.app_AMI.id}"
  instance_type = "t2.micro"
}

Les sources de données sont plus puissantes lors de la récupération d'informations sur les entités dynamiques - celles dont les propriétés changent souvent de valeur. Par exemple, la prochaine fois que Terraform récupérera des données pour notre aws_AMI source de données, la valeur des attributs exportés peut être différente (nous pourrions avoir construit et poussé une nouvelle AMI).

Les variables sont utilisées pour les valeurs statiques, celles qui changent rarement, telles que vos clés d'accès et secrètes, ou une liste standard de sudoers pour vos serveurs.

13
d4nyll