連載 [第5回] :
今日からはじめる Pulumiでカンタン インフラ運用・管理Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
2023年7月4日(火)
第5回となる今回は、Policy as Codeの概要を解説し、「Pulumi CrossGuard」を利用してPulumiでリソースを作成する際のポリシーチェック を行うハンズオンを実践していきます。
Pulumi Projectの新規作成
実際にポリシーチェックを行うための、Pulumi Programを作成していきます。
- 作業用ディレクトリの階層に戻ります。
$ cd ../ $ pwd /****/test-crossguard
- Pulumi Project用のディレクトリを作成して、ディレクトリ移動します。
$ mkdir program && cd program
- Pulumi Project作成コマンド「pulumi new <テンプレート名>」を実行します。今回はAWSリソースをpythonで作成するためで、テンプレート名は「aws-python」になります。
$ pulumi new aws-python 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.
- 「pulumi new <テンプレート名>」コマンド実行後は「Pulumi Project名(project name)」「Pulumi Projectの説明(project description)」「Pulumi Stack名(stack name)」「AWSのデフォルトリージョン(aws:region)」をプロンプトに従って設定していきます。各項目右の括弧内の値は、特に指定がない場合のデフォルト値を示します。ここでは「Pulumi Project名(project name)」は「test-project」を入力します。「Pulumi Projectの説明(project description)」および「Pulumi Stack名(stack name)」はデフォルト値を設定するため、そのまま<ENTER>を押下します。「AWSのデフォルトリージョン(aws:region)」は「アジアパシフィック(東京)」に設定するため、「ap-northeast-1」を設定してから<ENTER>を押下しました。
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: (program) test-project project description: (A minimal AWS Python Pulumi program) Created project 'test-project' 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
以降は自動的にPulumiの実行に必要なファイルやpythonのdependenciesなどが自動的にインストール/作成され、Pulumi ProjectおよびStackの作成が完了します。Installing dependencies... Creating virtual environment... Finished creating virtual environment Updating pip, setuptools, and wheel in virtual environment... Collecting pip Using cached pip-23.1.2-py3-none-any.whl (2.1 MB) 〜〜(略)〜〜 Successfully installed arpeggio-2.0.0 attrs-23.1.0 dill-0.3.6 grpcio-1.51.3 parver-0.4 protobuf-4.23.3 pulumi-3.72.2 pulumi-aws-5.41.0 pyyaml-6.0 semver-2.13.0 six-1.16.0 typing-extensions-4.6.3 Finished installing dependencies Finished installing dependencies Your new project is ready to go! ✨ To perform an initial deployment, run `pulumi up`
この時点で以下「Pulumi.yaml(Pulumi Projectのメタデータが記述されたファイル)」「Pulumi.dev.yaml(Pulumi Stackのkey-value形式の設定ファイル、dev環境用)」「__main__.py(Python用のPulumi Program)」「requirements.txt / venv(開発言語(runtime)特有のファイル/ディレクトリ)」が生成されます。$ pwd /***/test-crossguard/program $ ls -F Pulumi.dev.yaml Pulumi.yaml __main__.py requirements.txt venv/
- Programを編集します。Bucketに「acl="public-read"」を加えて、インターネット公開させる設定にします。最終的に、programは以下のようになります。
$ cat __main__.py """An AWS Python Pulumi program""" import pulumi from pulumi_aws import s3 # Create an AWS resource (S3 Bucket) bucket = s3.Bucket('my-bucket', acl="public-read") # Export the name of the bucket pulumi.export('bucket_name', bucket.id)
ポリシー適用確認①
ポリシーとPulumi Programの準備が整ったので、実際にポリシーチェックの動作確認を実施していきます。
- リソース作成のdry-runコマンド「pulumi preview」を実行します。コマンドのオプションに「--policy-pack」を指定して、前述の手順で作成したポリシーが置かれているディレクトリのパスを指定します。
$ pwd /***/test-crossguard/program $ pulumi preview --policy-pack ../policypack
Programの内容は「インターネット公開されるS3 Bucket作成」、ポリシーは「S3 Bucketがインターネット公開されていないかどうか」となるため、ポリシーチェックの結果はエラー(error: preview failed)となり、ポリシー違反のメッセージが表示されます。Enforcement Levelが「mandatory」のポリシー違反となるため、実際のリソースデプロイ(pulumi up)でもポリシー違反となり、デプロイがブロックされます。Previewing update (kenneth_prv_org/dev) View in Browser (Ctrl+O): https://app.pulumi.com/*/test-project/dev/previews/* Type Name Plan Info + pulumi:pulumi:Stack test-project-dev create 1 error + └─ aws:s3:Bucket my-bucket create Diagnostics: pulumi:pulumi:Stack (test-project-dev): error: preview failed Policy Violations: [mandatory] aws-python v0.0.1 s3-no-public-read (aws:s3/bucket:Bucket: my-bucket) Prohibits setting the publicRead or publicReadWrite permission on AWS S3 buckets. 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 Outputs: bucket_name: output<string>
- ここでポリシーに適合するようにprogramを編集します。Bucketの「acl="public-read"」を削除し、Bucketの公開をPrivate設定にします。最終的に、programは以下のようになります。
$ cat __main__.py """An AWS Python Pulumi program""" import pulumi from pulumi_aws import s3 # Create an AWS resource (S3 Bucket) bucket = s3.Bucket('my-bucket') # Export the name of the bucket pulumi.export('bucket_name', bucket.id)
- 再度リソース作成のdry-runコマンド「pulumi preview」を実行します。
$ pulumi preview --policy-pack ../policypack
先ほどとは異なり、ポリシー違反とならずにリソースをデプロイできるようになりました。Previewing update (kenneth_prv_org/dev) View in Browser (Ctrl+O): https://app.pulumi.com/*/test-project/dev/previews/* Type Name Plan + pulumi:pulumi:Stack test-project-dev create + └─ aws:s3:Bucket my-bucket create Outputs: bucket_name: output
Resources: + 2 to create Policy Packs run: Name Version (../policypack) (local)
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう
- 「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- PulumiでAWSリソースをデプロイしよう
- TerraformからPulumiへの移行
- 既に存在するリソースをPulumiで管理してみよう
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- Oracle Cloud Hangout Cafe Season7 #2「IaC のベストプラクティス」(2023年7月5日開催)
- 「Terraform」のコードを自分で書けるようになろう
- Pulumiの最新機能「Pulumi ESC」を使ってみよう