I referred a similar answer somewhere. I hope this helps:
To start with boto3.resources is a high level services class wrap around boto3.client.
That means to attach connected resources to later use other resources without having to specify the original resource-id.
OTH, boto3.client are low level, you don't have an "entry class object", thus you must explicitly specify the exact resources it connect to for every action you perform.
It depends on individual needs. However, boto3.resources doesn't wrap all the boto3.client functionality, so sometime you need to call boto3.client , or use boto3.resource.meta.client () to get the job done.