web-dev-qa-db-fra.com

Terraform: comment associer des stratégies gérées par AWS à un rôle?

Je souhaite attacher l'un des rôles gérés AWS préexistants à une stratégie. Voici mon code actuel:

resource "aws_iam_role_policy_attachment" "sto-readonly-role-policy-attach" {
  role       = "${aws_iam_role.sto-test-role.name}"
  policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
}

Existe-t-il un meilleur moyen de modéliser la stratégie gérée puis de la référencer au lieu de coder en dur l'ARN? Il semble simplement que chaque fois que je code en dur des ARN/chemins ou d'autres choses de ce genre, je découvre généralement plus tard qu'il y avait un meilleur moyen.

Existe-t-il déjà quelque chose dans Terraform qui modélise les politiques gérées? Ou bien le codage en dur de l’ARN est-il la "bonne" façon de le faire?

37
Shorn

Le source de données de stratégie IAM est idéal pour cela. Une ressource de données est utilisée pour décrire des données ou des ressources qui ne sont pas activement gérées par Terraform, mais qui sont référencées par Terraform.

Pour votre exemple, vous créez une ressource de données pour la stratégie gérée comme suit:

data "aws_iam_policy" "ReadOnlyAccess" {
  arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
}

Le nom de la source de données, ReadOnlyAccess dans ce cas, vous appartient entièrement. Pour les stratégies gérées, j'utilise le même nom que le nom de la stratégie par souci de cohérence, mais vous pouvez tout aussi bien l'appeler readonly si cela vous convient.

Vous joindriez alors la stratégie IAM à votre rôle comme suit:

resource "aws_iam_role_policy_attachment" "sto-readonly-role-policy-attach" {
  role       = "${aws_iam_role.sto-test-role.name}"
  policy_arn = "${data.aws_iam_policy.ReadOnlyAccess.arn}"
}
68
jorelli

Lorsque vous utilisez des valeurs que Terraform ne gère pas directement, vous avez quelques options.

La première option, la plus simple, consiste simplement à coder de manière irréversible la valeur, comme vous l'avez fait ici. C'est une réponse simple si vous vous attendez à ce que la valeur ne change jamais. Étant donné que ces "stratégies prédéfinies" sont documentées, les fonctionnalités AWS intégrées correspondent probablement à ce critère.

La deuxième option consiste à créer un module Terraform et à coder en dur la valeur en that, puis à référencer ce module à partir de plusieurs autres modules. Cela vous permet de gérer la valeur de manière centralisée et de l'utiliser plusieurs fois. Un module qui ne contient que des sorties est un modèle commun pour ce genre de chose, bien que vous puissiez également choisir de créer un module contenant un aws_iam_role_policy_attachment ressource avec le rôle défini à partir d'une variable.

La troisième option consiste à placer la valeur dans un emplacement permettant à Terraform de récupérer des valeurs, telles que Consul, puis de la récupérer à l'aide d'une source de données. Avec seulement Terraform en jeu, cela finit par être largement équivalent à la deuxième option, bien que cela signifie que Terraform le relira à chaque rafraîchissement plutôt que seulement lorsque vous mettrez à jour le module à l'aide de terraform init -upgrade, et cela pourrait donc être une meilleure option pour les valeurs qui changent souvent.

La quatrième option consiste à utiliser une source de données spécialisée capable de lire la valeur directement à partir de la source de la vérité. Terraform n'a pas actuellement a une source de données pour extraire des informations sur les stratégies gérées par AWS. Il ne s'agit donc pas d'une option pour votre situation actuelle, mais vous pouvez l'utiliser pour extraire d'autres données définies par AWS telles que l'adresse IP AWS. plages d'adresses, ARN de service, etc.

Laquelle de celles-ci est appropriée pour une situation donnée dépendra de la fréquence à laquelle la valeur change, de qui gère cette modification et de la disponibilité des sources de données Terraform spécialisées.

13
Martin Atkins