連載 [第5回] :
今日からはじめる Pulumiでカンタン インフラ運用・管理Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
2023年7月4日(火)
第5回となる今回は、Policy as Codeの概要を解説し、「Pulumi CrossGuard」を利用してPulumiでリソースを作成する際のポリシーチェック を行うハンズオンを実践していきます。
【ハンズオン】Pulumi CrossGuardによるポリシー適用
ハンズオンの流れ
今回のハンズオンの流れと関連するサービス/リソースの全体像は以下のとおりです。ハンズオン実施前には「事前準備」を行います(後述)。最初はPulumi公式HP記載の手順に沿う形ですが、後半はポリシー設定をカスタマイズしてポリシーチェックの様子を確認します。ポリシーおよびPulumi ProgramはPythonで作成し、AWSリソースをデプロイしていきます。
- 新規でポリシーを作成する
- 新規でProject/Stack(dev)を作成する
- ポリシーの適用を確認する①
- ポリシーをカスタマイズする
- Programを編集する
- ポリシーの適用を確認する②
また、ハンズオン実施時の最終的なディレクトリ構成は以下のようになります。
test-crossguard ├── policypack │ ├── PulumiPolicy.yaml │ ├── __main__.py │ ├── requirements.txt │ ├── tmp.py │ └── venv └── program ├── Pulumi.dev.yaml ├── Pulumi.yaml ├── __main__.py ├── __main__.py.before ├── requirements.txt └── venv
前提
- ハンズオンを実施する上で必要なAWSのアクセス権限を有する
- VPC/サブネット/セキュリティグループなど、ひと通りのネットワーク関連のリソースを作成できる権限
- EC2インスタンスを作成できる権限
- PCにPythonを導入済み(version 3.7以上)
事前準備
Pulumiを利用したAWSリソースデプロイのハンズオンを実施するには、事前に以下の作業が実施済みである必要があります。前回で事前準備の手順を解説しているので、まだ実施されていない方はそちらをご確認ください。
- Pulumi CLIのインストール
- Pulumiアカウント新規作成
- AWSアカウントへのPulumiアクセス設定
ポリシーの新規作成
Pulumi Program作成前に、ポリシーを準備します。
- 作業用ディレクトリを作成し、ディレクトリを移動します。
$ mkdir test-crossguard && cd test-crossguard
- ポリシー用のディレクトリを作成し、ディレクトリを移動します。
$ mkdir policypack && cd policypack
- ポリシーテンプレート生成コマンド「pulumi policy new <テンプレート名>」を実行します。今回はAWSリソースをpythonで作成するため、テンプレート名は「aws-python」のようになります。
$ pulumi policy new aws-python Created Policy Pack! 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) Collecting setuptools Downloading setuptools-68.0.0-py3-none-any.whl (804 kB) |████████████████████████████████| 804 kB 2.8 MB/s Collecting wheel ~~~ Your new Policy Pack is ready to go! ✨ Once you're done editing your Policy Pack: * To run the Policy Pack against a Pulumi program, in the directory of the Pulumi program run `pulumi up --policy-pack /Users/k-ozeki/Desktop/cl-blog/pulumi-cl-blog/20230610-pulumi-crossguard/policypack` * To publish the Policy Pack, run `pulumi policy publish [org-name]`
作成が完了すると、以下のファイルが生成されます。$ ls -F PulumiPolicy.yaml __main__.py requirements.txt venv/
【参考】ポリシーテンプレートの選択
Pulumi Projectのテンプレート生成コマンド「pulumi new」と同じように、ポリシーのテンプレート生成もPythonやjavascriptなどの言語と、GCPやAWSなどクラウドプロバイダー/サービスとの組み合わせで多くのポリシーテンプレートが用意されています。テンプレート名が分からない場合は引数を指定せず「pulumi policy new」コマンドを実行すると以下のようにテンプレート一覧が表示されるため、この中から目的のテンプレートを選択できます。$ pulumi policy new Please choose a template: [Use arrows to move, type to filter] aws-javascript A minimal Policy Pack for AWS using JavaScript. aws-premium-policies-typescript A minimal Policy Pack for AWS using Pulumi Premium Policies and TypeScript. (See README.md for installation) > aws-python A minimal Policy Pack for AWS using Python. aws-typescript A minimal Policy Pack for AWS using TypeScript. awsguard-javascript A minimal AWSGuard Policy Pack using JavaScript. awsguard-typescript A minimal AWSGuard Policy Pack using TypeScript. azure-classic-javascript A minimal Policy Pack for Azure using JavaScript. azure-classic-python A minimal Policy Pack for Azure using Python. azure-classic-typescript A minimal Policy Pack for Azure using TypeScript. azure-javascript A minimal Policy Pack for Azure using JavaScript. azure-premium-policies-typescript A minimal Policy Pack for Azure using Pulumi Premium Policies and TypeScript. (See README.md for installation) azure-python A minimal Policy Pack for Azure using Python. azure-typescript A minimal Policy Pack for Azure using TypeScript. gcp-javascript A minimal Policy Pack for GCP using JavaScript. gcp-python A minimal Policy Pack ~~(略)~~
- テンプレート生成直後のポリシーコードを確認します。
$ cat __main__.py from pulumi_policy import ( EnforcementLevel, PolicyPack, ReportViolation, ResourceValidationArgs, ResourceValidationPolicy, ) def s3_no_public_read_validator(args: ResourceValidationArgs, report_violation: ReportViolation): if args.resource_type == "aws:s3/bucket:Bucket" and "acl" in args.props: acl = args.props["acl"] if acl == "public-read" or acl == "public-read-write": report_violation( "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") s3_no_public_read = ResourceValidationPolicy( name="s3-no-public-read", description="Prohibits setting the publicRead or publicReadWrite permission on AWS S3 buckets.", validate=s3_no_public_read_validator, ) PolicyPack( name="aws-python", enforcement_level=EnforcementLevel.MANDATORY, policies=[ s3_no_public_read, ], )
コードの各パートについて、以下で解説していきます。from pulumi_policy import ( EnforcementLevel, PolicyPack, ReportViolation, ResourceValidationArgs, ResourceValidationPolicy, )
・パッケージimportパートでは、Pulumi Policy SDKがimportされます。コードで利用されるPulumi Policy SDKの詳細はこちらで確認できます。def s3_no_public_read_validator(args: ResourceValidationArgs, report_violation: ReportViolation): if args.resource_type == "aws:s3/bucket:Bucket" and "acl" in args.props: acl = args.props["acl"] if acl == "public-read" or acl == "public-read-write": report_violation( "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")
・ポリシーチェック対象のリソースtype/propertyの指定と、propertyで具体的にどのような値を取る場合に、どのような違反メッセージを出力(report_violation)するかのvalidator定義部分になります。s3_no_public_read = ResourceValidationPolicy( name="s3-no-public-read", description="Prohibits setting the publicRead or publicReadWrite permission on AWS S3 buckets.", validate=s3_no_public_read_validator, )
・上記であらかじめ設定したvalidatorを用いてPolicyを作成します。Policy nameはPulumi OrganizationまたはPulumi Accountの中で重複しないようにします。PolicyPack( name="aws-python", enforcement_level=EnforcementLevel.MANDATORY, policies=[ s3_no_public_read, ], )
・PolicyPack classでは対象のPolicyとEnforcemenetLavelを指定します。Policyは複数指定できますが、今回は1つのPolicy「s3_no_public_read」のみ指定されています。PolicyPack nameはPulumi OrganizationまたはPulumi Accountの中で重複しないようにします。
コードの構成としてはシンプルで「validatorの作成」「Policyの作成」「PolicyPackの作成」が主になります。今回生成されたテンプレートでは「S3 Bucketがインターネット公開されていないかどうか」のポリシーチェックが行われるコードになります。
連載バックナンバー
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」を使ってみよう