[小ネタ]AWS IoTの構築した環境を削除するRake

2016.02.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

以前[AWS IoT]クライアントからのメッセージをS3へ保存する環境をRakeで構築するという記事で、AWS IoTの環境を構築するRakeを記述しました。今回はこの環境を削除するRakeを書きました。

IoT端末からデータを送り、正しくAWS IoTに連携できるかを試行錯誤している時など、作成した環境の一部を削除して作り直したいことは多いかと思います。また環境全てを削除することもあるでしょう。これらを考慮し、AWS IoTのThingや証明書などを個別で削除する処理と、全体を削除する処理の両方をRakeで記述しました。

Rakefile

では、作成したRakefileです。

require_relative "rake_helper"

THING_NAME = "t-honda-thing"
POLICY_NAME = "t-honda-dsl-policy"
ROLE_NAME = "t_honda_dsl_role"
ROLE_POLICY_NAME = "t-honda-dsl-role-policy"
RULE_NAME = "t_honda_dsl_rule"
TABLE_NAME = "t_honda_dsl_table"

@region = "ap-northeast-1"

task :clean => [
  :delete_certificate,
  :delete_rule,
  :delete_policy,
  :delete_thing,
  :delete_role,
]

task :delete_role do
  iam.delete_role_policy({
    role_name: ROLE_NAME,
    policy_name: ROLE_POLICY_NAME,
  })

  iam.delete_role({
    role_name: ROLE_NAME,
  })
end

task :delete_thing do
  iot.delete_thing({
    thing_name: THING_NAME,
  })
end

task :delete_policy do
  iot.delete_policy({
    policy_name: POLICY_NAME,
  })
end

task :delete_rule do
  iot.delete_topic_rule({
    rule_name: RULE_NAME,
  })
end

task :delete_certificate do
  raise "certificate_id is required." if !ENV["certificate_id"]

  certificate_id = ENV["certificate_id"]
  cetificate_arn = nil

  resp = iot.list_certificates
  resp.certificates.each do |certificate|
    cetificate_arn = certificate.certificate_arn if certificate_id == certificate.certificate_id
  end

  raise "certificate_id is not found." if !cetificate_arn

  iot.update_certificate({certificate_id: certificate_id,
                          new_status: "INACTIVE",
                          })

  iot.detach_principal_policy({policy_name: POLICY_NAME,
                               principal: cetificate_arn,
                              })

  iot.detach_thing_principal({thing_name: THING_NAME,
                              principal: cetificate_arn,
                            })

  iot.delete_certificate({certificate_id: certificate_id})
end

「clean」タスクが全体を削除するタスク、それ以下が個々のThingやPolicyなどを削除するタスクです。各タスク内ではAWS SDK for Rubyの「delete・・・」メソッドを呼び出しています。

「clean」および「delete_certificate」タスクを実行するには、引数としてcertificate idを渡すようにしました。引数のチェックは60行目で行っています。例えば全体を削除する場合、以下の様なコマンドを実行すると以前の記事で作成した環境が削除される筈です。

$ bundle exec rake clean certificate_id=YourCertificateID -t

「rake_helper」や「Gemfile」については、以前の記事を参考にしてください。

まとめ

環境の構築・削除を繰り返す時などは、その処理をスクリプト化することで非常に楽になると感じました。また証明書を削除する「delete_certificate」タスクなどにおいては、削除前にデタッチを行うという処理の流れが一目で分かることもスクリプト化するメリットかと思います。