目的
AWS IoTにおいて、モノにアタッチされていない証明書を削除する。
不要な証明書を大量に作成してしまった場合用。
クラス
import boto3
class CertKiller():
def __init__(self):
# AWS IoTを操作するクラスをインスタンス化
self.client = boto3.client('iot')
return
def delete_not_attached_cert_all(self):
'''
モノにアタッチされていない証明書を削除
'''
# 証明書情報のリストを取得
list_cert = self.get_list_cert()
# モノにアタッチされていない証明書を削除
for cert in list_cert:
self.__delete_not_attached_cert(cert)
return
def get_list_cert(self):
'''
証明書情報のリストを取得
'''
list_cert = self.client.list_certificates(pageSize=100)['certificates']
return list_cert
def __delete_not_attached_cert(self, cert):
'''
証明書がどのモノにもアタッチされていなかった場合、削除
'''
# 証明書情報を取得
cert_arn = cert['certificateArn']
cert_id = cert['certificateId']
# 証明書をアタッチしてあるモノの一覧を取得
thing_attached_cert = self.client.list_principal_things(principal=cert_arn)['things']
print(cert_arn, thing_attached_cert)
# 証明書がどのモノにもアタッチされていなかった場合、削除
if len(thing_attached_cert) == 0:
self.__delete_cert(cert_arn, cert_id)
else:
pass
return
def __delete_cert(self, cert_arn, cert_id):
'''
証明書を削除
'''
# 削除前に無効化する必要がある
self.client.update_certificate(certificateId=cert_id, newStatus='INACTIVE')
# 削除前にポリシーをデタッチする必要がある
self.__detach_all_policy(cert_arn, cert_id)
# 削除
self.client.delete_certificate(certificateId=cert_id, forceDelete=False)
print('{} has been deleted.'.format(cert_arn))
return
def __detach_all_policy(self, cert_arn, cert_id):
'''
証明書にアタッチされている全てのポリシーをデタッチ
'''
# 証明書にアタッチされているポリシーのリストを取得
list_policy = self.client.list_attached_policies(target=cert_arn)['policies']
# デタッチ
for policy in list_policy:
policy_name = policy['policyName']
self.client.detach_policy(policyName=policy_name, target=cert_arn)
return
実行
cert_killer = CertKiller()
cert_killer.delete_not_attached_cert_all()
備考
- もし使用いただける場合は自己責任でお願いします。
- デバイスにアタッチされている証明書が削除される心配はありません。
(delete_certificate() で forceDelete=Falseとしているため) - モノにアタッチされていない=不要 とは限らないと思いますので、
複数名でAWS IoTを使用している場合は、削除前に他のユーザーに確認を取ると良いと思います。
感想
めちゃめちゃ初心者なので、本当に些細なことでもご指摘・コメント等いただけますと幸いです。