AWS

AWS SDKを用いてIAMユーザーを削除する方法

mackey

こんにちは、エンジニアの牧田です。最近は競プロにハマっています。約2ヶ月前に始めたAtCoderのレートが茶色に到達したので、これからも頑張っていきたいところです。

概要

今回はAWS SDKを用いてIAMユーザーを削除する方法を解説します。
直近開発したアプリケーションで、不要になったIAMユーザーを削除する処理を実装する必要がありました。その時の実装が少し面倒だったので、必要な手順を紹介したいと思います。

何が面倒なのか

AWS SDKにあるDeleteUserという関数を用いると、特定の名前のIAMユーザーを削除することができます。
しかし、マネジメントコンソール経由で削除する場合はユーザーに紐づいている情報が自動的に削除されるのですが、CLIやSDK経由で削除する場合は、それらの情報を事前に削除しておかなければいけません。

公式ドキュメントを参照すると、事前に削除すべき項目は以下の9つとなっています。
https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteUser.html

Deletes the specified IAM user. Unlike the AWS Management Console, when you delete a user programmatically, you must delete the items attached to the user manually, or the deletion fails. For more information, see Deleting an IAM user. Before attempting to delete a user, remove the following items:

  • Password (DeleteLoginProfile)
  • Access keys (DeleteAccessKey)
  • Signing certificate (DeleteSigningCertificate)
  • SSH public key (DeleteSSHPublicKey)
  • Git credentials (DeleteServiceSpecificCredential)
  • Multi-factor authentication (MFA) device (DeactivateMFADevice, DeleteVirtualMFADevice)
  • Inline policies (DeleteUserPolicy)
  • Attached managed policies (DetachUserPolicy)
  • Group memberships (RemoveUserFromGroup)


各項目について

事前に削除すべき各項目について説明します。

Password

パスワード。コンソール経由でAWSにアクセスするときに必要なものです。
DeleteLoginProfileで削除します。

Access keys

アクセスキー。CLI等経由でAWSにアクセスするときに必要なものです。
DeleteAccessKeyで削除します。

Signing certificate

署名証明書。

特定のAWS製品インターフェイスへのセキュアなアクセスに、デジタル署名用証明書(X.509 証明書)を使用します。

DeleteSigningCertificateで削除します。

SSH public key

SSH パブリックキー。CodeCommitにSSH接続するために使用するものです。
DeleteSSHPublicKeyで削除します。

Git credentials

Git 認証情報。CodeCommitにHTTPS接続するために使用するものです。
DeleteServiceSpecificCredentialで削除します。

Multi-factor authentication (MFA) device

MFA(多要素認証)デバイス。AWS にサインインする際のMFAを設定するものです。
仮想デバイス(Authyなど)を用いている場合は、DeactivateMFADeviceで非アクティブ化した後、DeleteVirtualMFADeviceで削除します。

Inline policies

ユーザーのインラインポリシー。
DeleteUserPolicyで削除します。

Attached managed policies

ユーザーにアタッチされた管理ポリシー。
DetachUserPolicyでデタッチします。

Group memberships

ユーザーが所属しているIAMグループ。
RemoveUserFromGroupでグループからユーザーを削除します。

サンプルコード(Go)

// importなど省略
type AWSIAMClient struct {
Service *iam.IAM
Config *aws.Config
}
func (c *AWSIAMClient) connect() (*iam.IAM, error) {
if c.Service != nil {
return c.Service, nil
}
sess, err := session.NewSession(c.Config)
c.Service = iam.New(sess)
return c.Service, nil
}
// IAMユーザーを削除する関数
func (c *AWSIAMClient) DeleteUserAll(groupName, userName string) error {
svc, err := c.connect()
// インラインポリシーを全て削除
output, err := svc.ListUserPolicies(&iam.ListUserPoliciesInput{
UserName: aws.String(userName),
})
for _, v := range output.policyNames {
_, err = svc.DeleteUserPolicy(&iam.DeleteUserPolicyInput{
PolicyName: aws.String(*v),
UserName: aws.String(userName),
})
}
// パスワード情報を削除
_, err = svc.DeleteLoginProfile(&iam.DeleteLoginProfileInput{
UserName: aws.String(userName),
})
// MFAを全て削除
output, err := svc.ListMFADevices(&iam.ListMFADevicesInput{
UserName: aws.String(userName),
})
for _, v := range output.MFADevices {
_, err = svc.DeactivateMFADevice(&iam.DeactivateMFADeviceInput{
SerialNumber: v.SerialNumber,
UserName: aws.String(userName),
})
_, err = svc.DeleteVirtualMFADevice(&iam.DeleteVirtualMFADeviceInput{
SerialNumber: v.SerialNumber,
})
}
// グループからユーザーを削除
_, err = svc.RemoveUserFromGroup(&iam.RemoveUserFromGroupInput{
GroupName: aws.String(groupName),
UserName: aws.String(userName),
})
// 最後にユーザーを削除
_, err = svc.DeleteUser(&iam.DeleteUserInput{
UserName: aws.String(userName),
})
return nil
}

※エラーをReturnする部分は省略しています

このコードでは、今回のアプリケーションで削除する必要のあった

  • Password
  • Multi-factor authentication (MFA) device
  • Inline policies
  • Group memberships

の4つを事前に削除しています。
他の項目についても、公式ドキュメントに言語ごとの実装方法が書いてあるので、それを参照すれば実装できると思います。

注意点として、Delete~ 関数で削除すべきものが複数の場合がある項目では、Delete~ 関数を実行する前にList~ 関数を実行して削除すべき対象の要素を取得する必要があります。その後、それぞれの要素についてDelete~ 関数を実行します。サンプルコードの場合、MFAの削除とインラインポリシーの削除がそれに該当します。グループに関しては今回はユーザーが1つのグループにのみ所属する形であったので、グループ名を直接指定しています。

なお、実際のアプリケーションでは、IAMユーザーを削除するLambda関数をCloudWatch Eventsをトリガーに定期実行することによって、不要になったIAMユーザーを定期的に削除する処理を実現しました。

まとめ

今回はAWS SDKを用いてIAMユーザーを削除する方法を解説しました。コンソール上で行う場合と比べて少々面倒ですが、事前に削除すべき項目を一つ一つ削除することによって実現することができました。

AUTHOR
mackey
mackey
記事URLをコピーしました