Pulumiは、コードプラットフォームとしてのオープンソースインフラストラクチャのバージョン 2.0のリリースを発表した。このリリースには、CrossGuardと呼ばれるコードシステムとしての新しいポリシーが含まれている。また、既存のシステムをPulumiに移行するための改善も含まれている。
コードシステムCrossGuardとしてのポリシーでは、インフラストラクチャのプロビジョニング中にコンプライアンスを実施するためのガードレールを宣言できる。これにより、インフラストラクチャの宣言と作成におけるベストプラクティスの順守が容易になる。これらのルールは、TypeScript、JavaScript、Node.js、またはPythonで記述でき、Pulumiがサポートされている任意の言語で記述されたスタックに適用できる。
ポリシーは、ポリシーパックにグループ化できる。ポリシーパック内の各ポリシーには、一意の名前を付ける必要がある。アサーションを作成するときは、違反しているリソースを指定して、完全な文でアサーションを作成することを勧める。たとえば、S3バケットがパブリック読み取りを行うことを禁止するポリシーは次のようになる:
new PolicyPack("policy-pack-typescript", {
policies: [{
name: "s3-no-public-read",
description: "Prohibits setting the publicRead or publicReadWrite permission on AWS S3 buckets.",
enforcementLevel: "mandatory",
validateResource: validateResourceOfType(aws.s3.Bucket, (bucket, args, reportViolation) => {
if (bucket.acl === "public-read" || bucket.acl === "public-read-write") {
reportViolation(
"You cannot set public-read or public-read-write on an S3 bucket. " +
"Read more about ACLs here: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html");
}
}),
}],
});
このリリースには、AWSの事前にコード化された一連のプラクティスも含まれている。AWSGuardは、ポリシーパック内で採用および使用できる構成可能なライブラリである。AWS、Azure、Google Cloud、Kubernetesのポリシーパックの例もある。CrossGuardの詳細については、FAQをご覧ください。
このアップデートには、既存のインフラストラクチャにPulumiを採用するための3つの方法も含まれている。これらは、共存、インポート、および変換である。共存は、インフラストラクチャがすでにプロビジョニングされているが、Pulumiへの完全な変換が望ましくない場合に使用される。Pulumiでプロビジョニングされた新しいインフラストラクチャは、共存することで元のインフラストラクチャと共存できる。リソースゲッタはすべてのリソースで利用可能であり、IDを使用してクラウドプロバイダーからのリソースからすべての詳細を読み取ることができる。スタック参照を使用すると、別のPulumiスタックの出力を参照して、スタックへの入力として使用できる。同様のツールとして、外部スタック参照を使用すると、非Pulumiスタックからの出力をPulumiスタックへの入力として参照できる。
たとえば、terraform.tfstateファイルからデータを読み取ることができ る。このコードでは、AWS EC2 VPCとサブネットIDが terraform.tfstate
ファイルから読み取られ、新しいEC2インスタンスをプロビジョニングするために使用される:
import * as aws from "@pulumi/aws";
import * as terraform from "@pulumi/terraform";
// Reference the Terraform state file:
const networkState = new terraform.state.RemoteStateReference("network", {
backendType: "local",
path: "/path/to/terraform.tfstate",
});
// Read the VPC and subnet IDs into variables:
const vpcId = networkState.getOutput("vpc_id");
const publicSubnetIds = networkState.getOutput("public_subnet_ids");
// Now spin up servers in the first two subnets:
for (let i = 0; i < 2; i++) {
new aws.ec2.Instance(`instance-${i}`, {
ami: "ami-7172b611",
instanceType: "t2.medium",
subnetId: publicSubnetIds[i],
});
}
Pulumiの管理下にあるように既存のインフラストラクチャをインポートすることも可能である。これは、インポートにより、Pulumiがインフラストラクチャを変更および削除できるという点で共存とは異なる。Pulumiは、クラウドプロバイダのコンソール、CLI、Terraformなど、作成方法に関係なくインフラストラクチャをインポートできる。
最後に、変換により、既存のインフラストラクチャをコードとして同等のPulumiプログラム構造に変換することができる。現時点で利用可能な主要な変換ツールは、Terraform HCLをPulumiコードに変換する tf2pulumi
です。デフォルトでは、これはTypeScriptに変換される。代わりにPythonに変換するには、tf2pulumi --target-language python
を使用する。
Pulumiのこのリリースに含まれるものの詳細については、公式ブログをご覧ください。バージョン 1.0から移行するための移行ガイドが利用可能である。PulumiオープンソースはGitHubからダウンロードできる。Community Editionは、個人ベースで無料でダウンロードして使用することもできる。