Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう

2023年7月4日(火)
大関 研丞 (Kenneth Ozeki)
第5回となる今回は、Policy as Codeの概要を解説し、「Pulumi CrossGuard」を利用してPulumiでリソースを作成する際のポリシーチェック を行うハンズオンを実践していきます。

Pulumi Projectの新規作成

実際にポリシーチェックを行うための、Pulumi Programを作成していきます。

  1. 作業用ディレクトリの階層に戻ります。
    $ cd ../
    
    $ pwd   
    /****/test-crossguard
  2. Pulumi Project用のディレクトリを作成して、ディレクトリ移動します。
    $ mkdir program && cd program
  3. 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.
  4. 「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/
  5. 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の準備が整ったので、実際にポリシーチェックの動作確認を実施していきます。

  1. リソース作成の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>
  2. ここでポリシーに適合するように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)
  3. 再度リソース作成の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)
著者
大関 研丞 (Kenneth Ozeki)
クリエーションライン株式会社 Data Platform Team
前職では保険や金融エンタープライズのミッションクリティカルシステム(オンプレミス、仮想サーバー、CDN等のインフラ系業務)の設計/構築を経験。クリエーションラインに転職後はクラウドエンジニアとしてGCP関連の案件でインフラの設計/構築、IaCやCI/CDを用いたDevOpsの導入、コンテナ(Kubernetes)基盤の構築、運用自動化ツールの作成などを担当。
クリエーションラインの技術ブログをチェック

連載バックナンバー

システム運用技術解説
第10回

Pulumiの最新機能「Pulumi ESC」を使ってみよう

2023/12/26
最終回となる今回は、2023年12月時点でリリースされている新機能の紹介と、その新機能の中から「Pulumi ESC」を用いたハンズオンを実践していきます。
システム運用技術解説
第9回

TerraformからPulumiへの移行

2023/11/28
第9回となる今回は、既にTerraformでAWS環境に作成されているリソースをPulumiへ移行するケースを想定して、CoexistenceとConversionのハンズオンを実践していきます
システム運用技術解説
第8回

既に存在するリソースをPulumiで管理してみよう

2023/10/19
第8回となる今回は、既にクラウド環境にデプロイされているリソースをPulumiで管理(import)する方法について、ハンズオンで実践していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています