I have been looking into CloudSearch to introduce a "search everything" feature to my employer's core app. The interaction of user and resource policies was a little bit confusing, but I think it works as follows.
A CloudSearch resource policy is needed to allow access outside the owner's account, or to restrict access by IP address. A blank CloudSearch policy is a perfectly functional option for the owner. Although the UI says, "this will only allow access through the console," it actually means that only access policies set on the IAM user/role making the request are relevant. "The console" just happens to be running as the logged-in user, with those IAM permissions.
As I understand it, once CloudSearch is accessed, the permission checks proceed along these lines:
- Does the CloudSearch resource policy allow the account? If there's no policy, only the owner is permitted; otherwise, the policy is used to determine whether cross-account or anonymous access is permitted. (Caution: it's not clear to me whether a policy that specifies cross-account access, but doesn't include the owner, will deny the owner.) If the account is not permitted, then the request is denied.
- Is there an IP restriction? If so, and the caller's IP is not permitted, then the request fails. If there is no IP restriction, then the connection is permitted.
- Does the caller have permission through IAM (user or role) in their account to make this request? If there's no explicit grant, then the request is, once again, denied.
Putting my own AWS account ID in as the allowed account, with no IP address restrictions, did not seem to be sufficient to grant access. When I gave my instance access through an IAM role, no CloudSearch resource policy was necessary to allow access the domain.
The documentation notes that IP address restrictions must be given in the CloudSearch resource policy. I believe this arises because the IP can only be checked once a connection is made to CloudSearch. Prior to that point, the caller's IP address is not available for checking.
Likewise, if I understand the documentation properly, cross-account access needs both a CloudSearch resource policy set to allow access from the caller's AWS account, and the caller's IAM also needs to allow access to the CloudSearch domain. However, we only have the one account, so I haven't fully tested this scenario.