EC2 をIAMユーザ/アクセスキーからIAM Roleへ移行する手順を検証

2017.02.10

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

こんにちは、菊池です。

本日(2017/2/10)、既存のEC2に後からIAM Roleを適用することができるようになりました!

はじめに

EC2のアプリケーションでAWSの認証を行う上では、IAM Roleを利用するのがベストプラクティスです。しかし、IAM Roleの適用はインスタンスを新規作成する際にしかできませんでした。そのため、後から必要になった際に止むを得ずIAMユーザのアクセスキー/シークレットキーを利用していた方も多いのではないでしょうか。

今回のアップデートにより、IAM Roleへの移行を検討されることもあると思いますので、移行時の手順・注意点をまとめました。

手順と注意点

基本的な手順は以下のようになります。

  1. IAM Roleの適用
  2. 利用する認証情報をIAMユーザのアクセスキー/シークレットキーからIAM Roleへ変更
  3. アクセスアドバイザーでIAMユーザの権限が利用されていないことを確認
  4. IAMユーザのアクセスキーを無効化

以下、IAMユーザ/IAM Roleを切り替えていくにあたり、AWS CLIのaws sts get-caller-identityで権限の状態を確認していきます。わかりやすくするため、IAMユーザとIAM Roleで別のアカウントIDを使いました。

作業前の確認です。

$ aws sts get-caller-identity
{
"Account": "xxxxxxxx2334",
"UserId": "AIDAIANC5E2KUCN3NEH3G",
"Arn": "arn:aws:iam::xxxxxxxx2334:user/iam-test"
}

アカウント"xxxxxxxx2334"の、"iam-test"というIAMユーザを利用しています。

まずは対象インスタンスにIAM Roleを適用します。以下のブログでも紹介の通り、現時点ではCLIでの操作になります。

$ aws ec2 associate-iam-instance-profile --instance-id i-07e43f94a47957f26 --iam-instance-profile Name=iam-test
{
    "IamInstanceProfileAssociation": {
        "InstanceId": "i-07e43f94a47957f26",
        "State": "associating",
        "AssociationId": "iip-assoc-02d186fea75bc6761",
        "IamInstanceProfile": {
            "Id": "AIPAJ7WCC5JAQ2QW2VWBO",
            "Arn": "arn:aws:iam::yyyyyyyy6521:instance-profile/iam-test"
        }
    }
}

この時点では、まだ元のIAMユーザの権限が利用可能なのでアカウントIDを取得すると、

$ aws sts get-caller-identity
{
"Account": "xxxxxxxx2334",
"UserId": "AIDAIANC5E2KUCN3NEH3G",
"Arn": "arn:aws:iam::xxxxxxxx2334:user/iam-test"
}

上記の通り、IAM Role適用前と同じ結果となります。IAM Roleが適用されたインスタンスでも、IAMユーザのアクセスキーが指定されていればそちらを優先して利用します。なので、新規に割り当てたIAM Roleの権限が不足していた場合などでも、突然権限でエラーになることはありません。逆に、慌ててIAMユーザのアクセスキーを無効化してしまわないようにしましょう。この時点でアクセスキーを無効化してしまうと、

$ aws sts get-caller-identity

An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid.

このように認証でエラーとなってしまいます。回避するためにアプリケーションが利用する認証情報をIAMユーザからIAM Roleに切り替えてやる必要があります。

AWS CLIのaws configureコマンドでアクセスキー/シークレットキーを設定した場合には、~/.aws/credentialsに保存されていますので、このファイルを削除します。

$ rm ~/.aws/credentials

複数のOSユーザで利用していた場合、各ユーザ毎に設定されてますのでご注意ください。これにより、IAM Roleの権限が利用されるようになります。

$ aws sts get-caller-identity
{
    "Account": "yyyyyyyy6521",
    "UserId": "AROAIHK74VWTQZH3MJ22C:i-07e43f94a47957f26",
    "Arn": "arn:aws:sts::yyyyyyyy6521:assumed-role/iam-test/i-07e43f94a47957f26"
}

アカウント"yyyyyyyy6521"のIAM Roleが利用できています。

切り替え後しばらく運用したら、元のIAMユーザのアクセスアドバイザーを参照し、その認証情報が利用された形跡がないか確認しましょう。

iam-user-to-role-001

もし切り替え以降に利用している形跡があれば、どこかのアプリケーションに埋め込まれたアクセスキーが残っている可能性がありますので、CloudTrailなどで利用元を調査しましょう。

最後に、不要になったアクセスキーを無効化し、最終的に削除すれば完全に移行完了です。

最後に

今回のアップデートで、IAM Role適用が進むと思いましたので検証してみました。少しでもお役に立てれば幸いです。