2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【AWS IoT】モノにアタッチされていない証明書を削除する

Last updated at Posted at 2019-12-30

目的

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を使用している場合は、削除前に他のユーザーに確認を取ると良いと思います。

感想

めちゃめちゃ初心者なので、本当に些細なことでもご指摘・コメント等いただけますと幸いです。

参照

Boto 3 Documentation

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?