1. Docs
  2. Pulumi IaC
  3. Using Pulumi
  4. Policy as code
  5. AWSGuard

AWSGuard policies

Overview

AWSGuard codifies best practices for AWS. It is an open source library that you can configure and use to enforce these best practices for your own Pulumi stacks or organization.

For more information on Pulumi’s Policy as Code solution, visit our docs.

Trying AWSGuard

In this guide, we’ll show you how to create a Policy Pack that configures and uses the policies available in AWSGuard.

Prerequisites

Verify your version of the Pulumi CLI

pulumi version # should be v1.14.0 or later
Copy

Authoring a Policy Pack that uses AWSGuard policies

To use AWSGuard policies, you must create a Policy Pack that references the @pulumi/awsguard npm package and creates a new instance of the AwsGuard class.

  1. Create a directory for your new Policy Pack, and change into it.

    mkdir awsguard && cd awsguard
    
    Copy
  2. Run the pulumi policy new command.

    $ pulumi policy new awsguard-typescript
    
    Copy
  3. Tweak the code in the index.ts file as desired. The default implementation provided by the awsguard-typescript template creates a new instance of AwsGuard with all policies set to have an enforcement level of advisory.

    new AwsGuard({ all: "advisory" });
    
    Copy

    From here, you can change the enforcement level for all policies or configure individual policies.

    For example:

    To make all policies mandatory rather than advisory:

    new AwsGuard({ all: "mandatory" });
    
    Copy

    To make all policies mandatory, but change certain policies to be advisory:

    new AwsGuard({
        all: "mandatory",
        ec2InstanceNoPublicIP: "advisory",
        elbAccessLoggingEnabled: "advisory",
    });
    
    Copy

    To disable a particular policy:

    new AwsGuard({
        ec2InstanceNoPublicIP: "disabled",
    });
    
    Copy

    To disable all policies except ones explicitly enabled:

    new AwsGuard({
        all: "disabled",
        ec2InstanceNoPublicIP: "mandatory",
        elbAccessLoggingEnabled: "mandatory",
    });
    
    Copy

    To specify additional configuration for policies that support it:

    new AwsGuard({
        ec2VolumeInUseCheck: { checkDeletion: false },
        encryptedVolumes: { enforcementLevel: "mandatory", kmsId: "id" },
        redshiftClusterMaintenanceSettingsCheck: { preferredMaintenanceWindow: "Mon:09:30-Mon:10:00" },
        acmCheckCertificateExpiration: { maxDaysUntilExpiration: 10 },
    });
    
    Copy

Test the new Policy Pack

Policy Packs can be tested on a user’s local workstation to facilitate rapid development and testing of policies.

  1. Run npm install in the Policy Pack directory.

  2. Use the --policy-pack flag with pulumi preview or pulumi up to specify the path to the directory containing your Policy Pack when previewing/updating a Pulumi program.

    If you don’t have a Pulumi program readily available, you can create a new project for testing by running pulumi new aws-typescript in an empty directory. This AWS example will create an S3 bucket, which is perfect for testing our Policy.

    $ mkdir test-program && cd test-program
    $ pulumi new aws-typescript
    
    Copy

    In the Pulumi project’s directory run:

    $ pulumi preview --policy-pack <path-to-policy-pack-directory>
    
    Copy

    If the stack is not in compliance, the policy violation will be displayed. Since the enforcement level for all policies are set to advisory, a warning is shown for any resources that are not in compliance with the AWSGuard policies. In this case, logging must be defined for S3 buckets.

    Previewing update (dev):
    
    Type                 Name           Plan       Info
    +   pulumi:pulumi:Stack  test-dev       create
    +   └─ aws:s3:Bucket     my-bucket      create     1 warning
    
    Diagnostics:
    aws:s3:Bucket (my-bucket):
    advisory: [s3-bucket-logging-enabled] Checks whether logging is enabled for your S3 buckets.
    Bucket logging must be defined.
    
    Resources:
    + 2 to create
    Copy
  3. If you had wanted the preview to fail for any policy violations, the Policy Pack can be modified to configure all policies to be mandatory.

    new AwsGuard({ all: "mandatory" });
    
    Copy
  4. Running the pulumi preview command again will now fail the preview operation.

    Previewing update (dev):
    
    Type                 Name           Plan       Info
    +   pulumi:pulumi:Stack  test-dev       create     1 error
    +   └─ aws:s3:Bucket     my-bucket      create     1 error
    
    Diagnostics:
    pulumi:pulumi:Stack (test-dev):
    error: preview failed
    
    aws:s3:Bucket (my-bucket):
    mandatory: [s3-bucket-logging-enabled] Checks whether logging is enabled for your S3 buckets.
    Bucket logging must be defined.
    Copy
  5. If you do not want to enforce this particular policy, you can modify the Policy Pack to disable it.

    new AwsGuard({
        all: "mandatory",
        s3BucketLoggingEnabled: "disabled",
    });
    
    Copy

Next Steps

Once you’ve validated the behavior of the AWSGuard policies you’ve configured in your Policy Pack, an organization administrator can publish the Policy Pack to the Pulumi Cloud to be enforced across your organization. To learn more see Enforcing a Policy Pack Across an Organization.

Now that you’ve seen how to configure and use AWSGuard policies, you may want to write your own policies. See the Getting Started tutorial to get started.

Was this page helpful?

PulumiUP May 6, 2025. Register Now.