The policy store is the central authorization engine for your application. It contains the schema that defines your entity types (users, documents, roles) and the Cedar policies that control access.
Create Empty Policy Store
Navigate to AWS Verified Permissions
Open the AWS Console
Search for “Verified Permissions” in the search bar
Click on the service to open the AVP dashboard
Create new policy store
Click the “Create policy store” button.
Select empty policy store
Select “Empty policy store” — do NOT use “Guided Setup”. The guided setup uses a different schema structure.
Choose the option to start with an empty policy store.
Name your policy store
Enter a name for your policy store: You can use a different name, but this guide uses FinancialDocsStore for consistency.
Create the policy store
Click “Create” to finalize the policy store creation.
Copy the Policy Store ID
You MUST save the Policy Store ID — you’ll need it for SAM deployment in the next step.
After creation, you’ll see a dashboard with your policy store details. The Policy Store ID looks like: Copy this ID to your clipboard or a text file.
The schema defines the structure of your authorization model: what entity types exist, what attributes they have, and what actions can be performed.
Open schema editor
In your policy store dashboard:
Click on the “Schema” tab
Click “Edit” to open the schema editor
Clear existing content
Delete any default content in the schema editor (it should be mostly empty for a new policy store).
Paste the FinancialApp schema
Copy and paste the following JSON schema: {
"FinancialApp" : {
"entityTypes" : {
"User" : {
"shape" : {
"type" : "Record" ,
"attributes" : {
"department" : {
"type" : "String" ,
"required" : true
},
"clearance_level" : {
"type" : "Long" ,
"required" : true
}
}
},
"memberOfTypes" : [ "Role" ]
},
"Document" : {
"shape" : {
"type" : "Record" ,
"attributes" : {
"classification" : {
"type" : "String" ,
"required" : true
},
"department" : {
"type" : "String" ,
"required" : true
}
}
}
},
"Role" : {
"memberOfTypes" : []
}
},
"actions" : {
"Read" : {
"appliesTo" : {
"principalTypes" : [ "User" ],
"resourceTypes" : [ "Document" ]
}
},
"Edit" : {
"appliesTo" : {
"principalTypes" : [ "User" ],
"resourceTypes" : [ "Document" ]
}
},
"Delete" : {
"appliesTo" : {
"principalTypes" : [ "User" ],
"resourceTypes" : [ "Document" ]
}
}
}
}
}
Save the schema
Click “Save changes” at the bottom of the schema editor. If there are any syntax errors, the console will highlight them. Ensure the JSON is valid before saving.
Understanding the Schema
Entity Types
The schema defines three entity types:
User
"User" : {
"shape" : {
"type" : "Record" ,
"attributes" : {
"department" : { "type" : "String" , "required" : true },
"clearance_level" : { "type" : "Long" , "required" : true }
}
},
"memberOfTypes" : [ "Role" ]
}
Attributes :
department: The department the user belongs to (e.g., “Finance”, “HR”)
clearance_level: Numeric security clearance level (1-5)
Hierarchy : Users can be members of Roles
The "memberOfTypes": ["Role"] field is critical. It allows AVP to evaluate Cedar expressions like principal in Role::"Analyst". Without this, role-based policies won’t work.
Document
"Document" : {
"shape" : {
"type" : "Record" ,
"attributes" : {
"classification" : { "type" : "String" , "required" : true },
"department" : { "type" : "String" , "required" : true }
}
}
}
Attributes :
classification: Security classification (e.g., “Public”, “Confidential”, “Secret”)
department: Department that owns the document
Role
"Role" : {
"memberOfTypes" : []
}
Roles are simple groupings with no attributes. They exist to group users (e.g., “Analyst”, “Auditor”).
Actions
The schema defines three actions that Users can perform on Documents:
"actions" : {
"Read" : {
"appliesTo" : {
"principalTypes" : [ "User" ],
"resourceTypes" : [ "Document" ]
}
},
"Edit" : { ... },
"Delete" : { ... }
}
Each action specifies:
principalTypes : Who can perform the action (only Users)
resourceTypes : What the action can be performed on (only Documents)
Verify Schema Configuration
After saving, verify your schema:
The schema editor should show no errors
You should see the schema JSON rendered in the console
The “Schema” tab should show a green checkmark or “Active” status
At this point, your policy store has a schema but no policies. This is expected — you’ll add policies interactively during the demo after deploying the application.
Next Steps
With your policy store created and schema configured, you’re ready to deploy the backend infrastructure:
Deploy with SAM Build and deploy Lambda functions and API Gateway