tech.guitarrapc.cóm

Technical updates

Pulumi で Aws のリソース情報の取得

この記事は、Pulumi dotnet Advent Calendar 2019 の4日目です。

qiita.com

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を取得する

EC2 Linux WebServer Instance

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 = "*",
    },
})