今日からはじめる Pulumiでカンタン インフラ運用・管理 5

Pulumi Programの編集

Pulumi Programの編集

Pulumi Programを編集して、新たにポリシーチェック対象となるリソースを追加していきます。

  1. Pulumi Project用のディレクトリに移動します。
    $ cd ../program
    
    $ pwd
    /***/test-crossguard/program
  2. Pulumi Programを以下に書き換えます。ポリシーにも記載のVPC/Subnet/EC2あたりを追加で作成します。ちなみに、書き換えたProgramは先ほどカスタマイズした全てのポリシーにあえて違反するような内容となっています。
    import pulumi
    import pulumi_aws as aws
    
    # スタックの名前を取得
    stack_name = pulumi.get_stack()
    
    # スタックの設定を読み込む
    config = pulumi.Config()
    
    # S3バケットの作成
    bucket = aws.s3.Bucket("my-bucket")
    
    # VPCの作成
    vpc = aws.ec2.Vpc(
        "my-vpc",
        cidr_block="192.168.0.0/16",
    )
    # VPC IDのoutput export
    pulumi.export("vpc_id", vpc.id)
    
    # サブネットの作成
    subnet = aws.ec2.Subnet(
        "my-subnet",
        vpc_id=vpc.id,
        cidr_block="192.168.1.0/24",
        availability_zone="us-east-1a"
    )
    
    # EC2インスタンスの作成
    ami = aws.ec2.get_ami(
        filters=[{
            "name": "name",
            "values": ["amzn2-ami-hvm-*-x86_64-gp2"],
        }],
        most_recent=True
    )
    instance = aws.ec2.Instance(
        "my-instance",
        instance_type="a1.large",
        subnet_id=subnet.id,
        ami=ami.id
    )

ポリシー適用確認②

ポリシーのカスタマイズとProgramの編集ができたので、再度ポリシーチェックの様子を確認していきます。

  1. 先ほどと同様に、リソース作成のdry-runコマンド「pulumi preview」を実行します。コマンドのオプションに「--policy-pack」を指定し、先ほどの手順で作成したポリシーが置かれているディレクトリのパスを指定します。
    $ pwd 
    /***/test-crossguard/program
    
    $ pulumi preview --policy-pack ../policypack
    以下のようなポリシー違反のメッセージが表示されました。すべてのポリシーで違反しているのが確認できます。
    Previewing update (kenneth_prv_org/dev)
    
    View in Browser (Ctrl+O): https://app.pulumi.com/kenneth_prv_org/test-project/dev/previews/c901afbf-f895-4bd7-9d0c-6a89f1b7ab56
    
         Type                 Name              Plan       Info
     +   pulumi:pulumi:Stack  test-project-dev  create     1 error
     +   ├─ aws:s3:Bucket     my-bucket         create     
     +   ├─ aws:ec2:Vpc       my-vpc            create     
     +   ├─ aws:ec2:Subnet    my-subnet         create     
     +   └─ aws:ec2:Instance  my-instance       create     
    
    
    Diagnostics:
      pulumi:pulumi:Stack (test-project-dev):
        error: preview failed
    
    Policy Violations:
        [mandatory]  aws-python v0.0.1  ec2_instance_type (aws:ec2/instance:Instance: my-instance)
        Check EC2 instance type
        EC2 instance my-instance uses restricted instance type
        Please use in any type of ['t2.nano', 't2.micro', 't2.small']
        
        [mandatory]  aws-python v0.0.1  name_prefix (aws:ec2/instance:Instance: my-instance)
        Check resource prefix
        Resource name my-instance should have prefix 'dev-'
        
        [mandatory]  aws-python v0.0.1  name_prefix (aws:ec2/subnet:Subnet: my-subnet)
        Check resource prefix
        Resource name my-subnet should have prefix 'dev-'
        
        [mandatory]  aws-python v0.0.1  name_prefix (aws:s3/bucket:Bucket: my-bucket)
        Check resource prefix
        Resource name my-bucket should have prefix 'dev-'
        
        [mandatory]  aws-python v0.0.1  network_cidr_block (aws:ec2/subnet:Subnet: my-subnet)
        Check VPC/Subnet CIDR block
        aws:ec2/subnet:Subnet my-subnet uses restricted CIDR block
        Please use in ip range of 10.0.0.0/16
        
        [mandatory]  aws-python v0.0.1  network_cidr_block (aws:ec2/vpc:Vpc: my-vpc)
        Check VPC/Subnet CIDR block
        aws:ec2/vpc:Vpc my-vpc uses restricted CIDR block
        Please use in ip range of 10.0.0.0/16
        
        [mandatory]  aws-python v0.0.1  subnet_availability_zone (aws:ec2/subnet:Subnet: my-subnet)
        Check subnet availability zone
        Subnet my-subnet uses restricted availability zone
        Please use in any az of ['ap-northeast-1a', 'ap-northeast-1c']
        
    Outputs:
        vpc_id: output<string>
  2. ここでポリシーに適合するように再度programを編集します。最終的に、programは以下のようになります。
    import pulumi
    import pulumi_aws as aws
    
    # スタックの名前を取得
    stack_name = pulumi.get_stack()
    
    # スタックの設定を読み込む
    config = pulumi.Config()
    
    # S3バケットの作成
    bucket = aws.s3.Bucket(f"{stack_name}-my-bucket")
    
    # VPCの作成
    vpc = aws.ec2.Vpc(
        "my-vpc",
        cidr_block="10.0.0.0/16",
    )
    # VPC IDのoutput export
    pulumi.export("vpc_id", vpc.id)
    
    # サブネットの作成
    subnet = aws.ec2.Subnet(
        f"{stack_name}-my-subnet",
        vpc_id=vpc.id,
        cidr_block="10.0.1.0/24",
        availability_zone="ap-northeast-1a"
    )
    
    # EC2インスタンスの作成
    ami = aws.ec2.get_ami(
        filters=[{
            "name": "name",
            "values": ["amzn2-ami-hvm-*-x86_64-gp2"],
        }],
        most_recent=True
    )
    instance = aws.ec2.Instance(
        f"{stack_name}-my-instance",
        instance_type="t2.micro",
        subnet_id=subnet.id,
        ami=ami.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/kenneth_prv_org/test-project/dev/previews/7dd3e462-713e-44f0-a259-1333c1684cfb
    
         Type                 Name              Plan       
     +   pulumi:pulumi:Stack  test-project-dev  create     
     +   ├─ aws:s3:Bucket     dev-my-bucket     create     
     +   ├─ aws:ec2:Vpc       my-vpc            create     
     +   ├─ aws:ec2:Subnet    dev-my-subnet     create     
     +   └─ aws:ec2:Instance  dev-my-instance   create     
    
    
    Outputs:
        vpc_id: output<string>
    
    Resources:
        + 5 to create
    
    Policy Packs run:
        Name              Version
         (../policypack)  (local)

ハンズオンは以上です。ハンズオンではリソース作成前のdry-run(pulumi preview)のみ実施しているため、特にAWS上にリソースは作成していません。実際にリソースを作成したい場合は「pulumi up」コマンドを実施してください。

おわりに

今回は、Policy as Codeの概要とPulumiのPolicy as Code「CrossGuard」について解説しました。

自動的にポリシーチェックができる最大の利点は、リソースの更新頻度が増えても「自動的にポリシーをチェックしてくれている」という、心理的に安心できる点にあると個人的には考えています。PulumiのようなIaCとCrossGuardのようなPaCをCI/CDで組み合わせてみて、インフラ構築をより加速させてみるのも良さそうです。次回もお楽しみに!

【参考】Pulumi公式ホームページ(英語)

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る