この記事は、Pulumi dotnet Advent Calendar 2019 の4日目です。
terraform でいうところの data リソースに相当する処理を見てみましょう。
すでに存在するリソースを参照して、ほかのリソースで利用するための方法です。
目次
TL;DR
既存のAWS リソースを探索する方法を示す。
基本的に、ami 一覧の取得などのような処理は、Aws.Invokes
を使う
terraform でいうところの data リソースに相当する。
基本的に、リソースフォルダにないメソッド名.cs
がそれに該当する気配。
https://github.com/pulumi/pulumi-aws/tree/58da21a081d1e62497e1c96b017bc78c1e257f8b/sdk/dotnet
現在の AWS アカウント情報を取得する
var callerIdentity = await Pulumi.Aws.Invokes.GetCallerIdentity();
AMIを取得する
var ami = Aws.Invokes.GetAmi(new Aws.GetAmiArgs { Filters = { new GetAmiFiltersArgs { Name = "name", Values = { "amzn-ami-hvm-*" }, }, }, Owners = { "137112412989" }, // This owner ID is Amazon MostRecent = true, });
あるいは、EKS Optimized AMIの取得
var ami = await Pulumi.Aws.Invokes.GetAmi(new GetAmiArgs { MostRecent = true, Owners = { "602401143452" }, Filters = { new GetAmiFiltersArgs { Name = "name", Values = { $"amazon-eks-node-{version}-v*" } }, new GetAmiFiltersArgs { Name = "root-device-type", Values = "ebs" }, new GetAmiFiltersArgs { Name = "virtualization-type", Values = "hvm" }, }, });
IAM Role を取得する
AWS の IAM Role を取得する。
await Pulumi.Aws.Iam.Invokes.GetPolicy(new GetPolicyArgs { Arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy" });
IAM Document Policy を取得する
JSON を書かず、型から JSON っぽいものを生成するのに使うのが、IAM Document Policy。これを使うと、JSON が不適切化どうかもわかるのでお勧め。
await Pulumi.Aws.Iam.Invokes.GetPolicyDocument(new GetPolicyDocumentArgs { Statements = new GetPolicyDocumentStatementsArgs { Effect = "Allow", Actions = new [] { "elasticloadbalancing:*", "ec2:CreateSecurityGroup", "ec2:Describe*", }, Resources = "*", }, });
これは入れ子が多いので、適当に Statement[] だけ渡せるようにヘルパーを作っておくと便利。
private static async ValueTask<GetPolicyDocumentResult> GetPolicyDocument(GetPolicyDocumentStatementsArgs[] statements, string version = null) { return await Pulumi.Aws.Iam.Invokes.GetPolicyDocument(new GetPolicyDocumentArgs { Version = version, Statements = statements }); }
これで次のようにstatement だけ渡すように書ける。
await GetPolicyDocument(new [] { new GetPolicyDocumentStatementsArgs { Effect = "Allow", Actions = new [] { "elasticloadbalancing:*", "ec2:CreateSecurityGroup", "ec2:Describe*", }, Resources = "*", }, })