As duas classes diferentes são sobre diferentes níveis de abstração.
- As classes Cliente são wrappers de baixo nível em torno de cada ação da API. ie. AutorizeSecurityGroupIngress
- As classes Recurso são orientadas a objetos, você instancia um objeto para representar o grupo e interage com ele dessa maneira. Ele fornece um nível mais alto de abstração que desacopla você das chamadas de API individuais e fornece alguma persistência
para mostrar a diferença, vamos criar um grupo de segurança e abrir a porta 80 para a internet.
com o cliente
ec2 = boto3.client('ec2')
response = ec2.create_security_group(GroupName='testgroup2',Description='testme')
ec2.authorize_security_group_ingress(GroupId=response['GroupId'],IpProtocol="tcp",CidrIp="0.0.0.0/0",FromPort=80,ToPort=80)
com recurso:
ec2 = boto3.resource('ec2')
mysg = ec2.create_security_group(GroupName="testgroup",Description='testme')
mysg.authorize_ingress(IpProtocol="tcp",CidrIp="0.0.0.0/0",FromPort=80,ToPort=80)
A principal diferença aqui é que o objeto resource elimina a necessidade de uma variável "response" e se encarrega de lembrar o grupo Security para uso posterior. Não parece ser uma grande diferença, mas torna seu código mais limpo e mais orientado a objetos. veja os docs do boto: link para mais detalhes sobre eles.