PulumiのGet Startedをマルチクラウドで試してみた
こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。
先日、マルチクラウドに対応している Infrastructure as Code のツール「Pulumi」のGet StartedをAWSとGoogle Cloudの両方で試してみました。
今回は、この2つのエントリで実施したデプロイを同一プロジェクトで試してみたいと思います。つまり、マルチクラウドへのデプロイを試してみます。
やりたいこと
以下の公式ドキュメントに記載されている「Get Started with Pulumi」の「Get Started with AWS」と「Get Started with Google Cloud」を1つのプロジェクトで実施します。
前提条件
実施する環境として、OSはMacOSを利用し、Nodeも事前に導入済みです。
% node -v v16.14.2
AWS関連の設定
AWSアカウントで s3:CreateBucket
ポリシーが付与されている「Pulumi用のIAMユーザ」を作成しており、アクセスキーを発行済みの状態です。
AWS CLIも導入しており、上記のIAMユーザのアクセスキー、シークレットキーを設定したprofileとしてpulumi
を作成済みです。
Google Cloud関連の設定
Google Cloudのアカウントは作成済みで、以下に従って設定済みです。
Get Started with Pulumi
では、実際に前述のドキュメントを参考に進めていきます。
Before You Begin
このあたりは以前に試した、以下のそれぞれのエントリと同様ですので詳細はスキップします。
Create a New Project
プロジェクトは、AWSをベースに作成してみました。
% mkdir pulumi-get-started-with-multi-cloud && cd pulumi-get-started-with-multi-cloud % pulumi new aws-typescript --force This command will walk you through creating a new Pulumi project. Enter a value or leave blank to accept the (default), and press <ENTER>. Press ^C at any time to quit. project name: (pulumi-get-started-with-multi-cloud) project description: (A minimal AWS TypeScript Pulumi program) Created project 'pulumi-get-started-with-multi-cloud' Please enter your desired stack name. To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`). stack name: (dev) Created stack 'dev' aws:region: The AWS region to deploy into: (us-east-1) ap-northeast-1 Saved config Installing dependencies... (...snip...) Finished installing dependencies Your new project is ready to go! ✨ To perform an initial deployment, run 'pulumi up'
完了しました。
一方で、Google Cloud用のパッケージが入っていないので、追加でインストールします。
% yarn add @pulumi/gcp
これで一旦インストールは完了です。
Review the New Project
以下の3つのファイルが作成され、yamlファイルは想定どおりの設定になっていることを確認します。
- Pulumi.yaml
- Pulumi.dev.yaml
- index.ts
設定ファイルは以下のようになっていました。
name: pulumi-get-started-with-multi-cloud runtime: nodejs description: A minimal AWS TypeScript Pulumi program
config: aws:region: ap-northeast-1
また、リソース構築用のスクリプトは以下のようになっています。
import * as pulumi from "@pulumi/pulumi"; import * as aws from "@pulumi/aws"; import * as awsx from "@pulumi/awsx"; // Create an AWS resource (S3 Bucket) const bucket = new aws.s3.Bucket("my-bucket"); // Export the name of the bucket export const bucketName = bucket.id;
設定ファイルの修正
まずは設定ファイルを以下のように修正します。
name: pulumi-get-started-with-multi-cloud runtime: nodejs description: A minimal AWS and Google Cloud TypeScript Pulumi program
description を少し修正しました。
config: aws:profile: pulumi aws:region: ap-northeast-1 gcp:project: "foo-bar"
こちらはaws:profile
の設定と、gcp:project
の設定を追加しました。
index.tsの修正
リソース構築用のスクリプトを修正します。今回はAWSとGoogle Cloudの両方にバケットを作成するようにします。
import * as aws from "@pulumi/aws"; import * as gcp from "@pulumi/gcp"; // Create an AWS resource (S3 Bucket) const awsBucket = new aws.s3.Bucket("cm-ootaka-get-started-with-pulumi"); // Create a GCP resource (Storage Bucket) const gcpBucket = new gcp.storage.Bucket("cm-ootaka-get-started-with-pulumi", { location: "ASIA", }); // Export the name of the bucket export const awsBucketName = awsBucket.id; // Export the DNS name of the bucket export const gcpBucketName = gcpBucket.url;
こちらのコードはAWS用とGoogle Cloud用のGet Startedのコードを混ぜた感じですね。
Deploy the Stack
準備ができたのでデプロイしてみましょう。
以下のpulumi up
コマンドを実行して、何が作成されるかを確認します。
% pulumi up Previewing update (dev) View Live: https://app.pulumi.com/ootaka-daisuke/pulumi-get-started-with-multi-cloud/dev/previews/5483bdb1-97fd-49d0-87e8-ac7605860d9a Type Name Plan + pulumi:pulumi:Stack pulumi-get-started-with-multi-cloud-dev create + ├─ aws:s3:Bucket cm-ootaka-get-started-with-pulumi create + └─ gcp:storage:Bucket cm-ootaka-get-started-with-pulumi create Resources: + 3 to create Do you want to perform this update? [Use arrows to move, enter to select, type to filter] yes > no details
問題がなさそうなので、カーソルをyes
に合わせて続けます。
Do you want to perform this update? yes Updating (dev) View Live: https://app.pulumi.com/ootaka-daisuke/pulumi-get-started-with-multi-cloud/dev/updates/1 Type Name Status + pulumi:pulumi:Stack pulumi-get-started-with-multi-cloud-dev created + ├─ gcp:storage:Bucket cm-ootaka-get-started-with-pulumi created + └─ aws:s3:Bucket cm-ootaka-get-started-with-pulumi created Outputs: awsBucketName: "cm-ootaka-get-started-with-pulumi-2b988e4" gcpBucketName: "gs://cm-ootaka-get-started-with-pulumi-e2b1a65" Resources: + 3 created Duration: 7s
AWSのS3バケットと、GCSバケットが作成されました!
それぞれ以下のコマンドで確認してみましょう。
% aws s3 ls $(pulumi stack output awsBucketName) --profile pulumi % gsutil ls $(pulumi stack output gcpBucketName)
オブジェクトを配置していないので何も表示されませんが、エラーが発生していないことから各クラウド上にバケットが作成されていることがわかりますね。
後片付け
以下のとおり、destroy
コマンドでリソースを削除しておきます。
% pulumi destroy Previewing destroy (dev) View Live: https://app.pulumi.com/ootaka-daisuke/pulumi-get-started-with-multi-cloud/dev/previews/5a337cff-5944-4323-9d54-3e69a8d60490 Type Name Plan - pulumi:pulumi:Stack pulumi-get-started-with-multi-cloud-dev delete - ├─ aws:s3:Bucket cm-ootaka-get-started-with-pulumi delete - └─ gcp:storage:Bucket cm-ootaka-get-started-with-pulumi delete Outputs: - awsBucketName: "cm-ootaka-get-started-with-pulumi-2b988e4" - gcpBucketName: "gs://cm-ootaka-get-started-with-pulumi-e2b1a65" Resources: - 3 to delete Do you want to perform this destroy? [Use arrows to move, enter to select, type to filter] yes > no details
Do you want to perform this destroy? yes Destroying (dev) View Live: https://app.pulumi.com/ootaka-daisuke/pulumi-get-started-with-multi-cloud/dev/updates/2 Type Name Status - pulumi:pulumi:Stack pulumi-get-started-with-multi-cloud-dev deleted - ├─ aws:s3:Bucket cm-ootaka-get-started-with-pulumi deleted - └─ gcp:storage:Bucket cm-ootaka-get-started-with-pulumi deleted Outputs: - awsBucketName: "cm-ootaka-get-started-with-pulumi-2b988e4" - gcpBucketName: "gs://cm-ootaka-get-started-with-pulumi-e2b1a65" Resources: - 3 deleted Duration: 4s The resources in the stack have been deleted, but the history and configuration associated with the stack are still maintained. If you want to remove the stack completely, run 'pulumi stack rm dev'.
念の為、以下のコマンドで削除されているか確かめておきます。
% aws s3 ls cm-ootaka-get-started-with-pulumi-2b988e4 --profile pulumi An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation: The specified bucket does not exist % gsutil ls gs://cm-ootaka-get-started-with-pulumi-e2b1a65 BucketNotFoundException: 404 gs://cm-ootaka-get-started-with-pulumi-e2b1a65 bucket does not exist.
エラーが出ていることから、ちゃんと削除されていることが分かりますね。
まとめ
以上、PulumiのGet Startedをマルチクラウドで試してみました。
今回はAWSとGoogle Cloudを同時にデプロイしてみましたが、同様に他のクラウドやサービスも「パッケージの追加」、「設定の追加」、「リソース作成コードの追加」をしてあげるだけで問題なさそうです。
今回試したところが「バケット作成だけ」というのもありますが、マルチクラウドでも特に難しいポイントはなく、サクッと対応できるのが素敵だと思いました!
どなたかのお役に立てば幸いです。それでは!