def METHOD_NAME(
    self,
    request: ResourceRequest[IAMPolicyProperties],
) -> ProgressEvent[IAMPolicyProperties]:
    """
    Create a new resource.
    Primary identifier fields:
      - /properties/Id
    Required properties:
      - PolicyDocument
      - PolicyName
    Read-only properties:
      - /properties/Id
    """
    model = request.desired_state
    iam_client = request.aws_client_factory.iam
    policy_doc = json.dumps(util.remove_none_values(model["PolicyDocument"]))
    policy_name = model["PolicyName"]
    for role in model.get("Roles", []):
        iam_client.put_role_policy(
            RoleName=role, PolicyName=policy_name, PolicyDocument=policy_doc
        )
    for user in model.get("Users", []):
        iam_client.put_user_policy(
            UserName=user, PolicyName=policy_name, PolicyDocument=policy_doc
        )
    for group in model.get("Groups", []):
        iam_client.put_group_policy(
            GroupName=group, PolicyName=policy_name, PolicyDocument=policy_doc
        )
    # the physical resource ID here has a bit of a weird format
    # e.g. 'stack-fnSe-1OKWZIBB89193' where fnSe are the first 4 characters of the LogicalResourceId (or name?)
    suffix = "".join(random.choices(string.ascii_uppercase + string.digits, k=13))
    model["Id"] = f"stack-{model.get('PolicyName', '')[:4]}-{suffix}"
    return ProgressEvent(status=OperationStatus.SUCCESS, resource_model=model)