スキップしてコンテンツを表示

Amazon EC2 のフルアクセス許可を持つ IAM ユーザーまたはロールが EC2 インスタンスを起動できないのはなぜですか。

所要時間2分
0

AWS Identity and Access Management (IAM) エンティティに Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのアクセス許可があります。インスタンスを起動しようとしましたが、ステータスが [Pending] から [Stopped] に変わりました。

解決策

EC2 インスタンスの [Stopped] ステータスの原因特定

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

Amazon Elastic Block Store (Amazon EBS) ボリュームを EC2 インスタンスにアタッチした場合、ボリュームの暗号化を確認してください。EBS ボリュームを AWS Key Management Service (AWS KMS) キーで暗号化した場合、アクセス許可に問題がある可能性があります。StartInstances API アクションを呼び出す IAM プリンシパルには、Amazon EC2 に対する権限を作成するための kms:CreateGrant アクセス許可が必要です。この権限により、Amazon EC2 は AWS KMS キーを使用してボリュームのデータキーを復号できます。

EBS ボリュームは GenerateDataKeyWithoutPlaintext API コールを AWS KMS に送信します。これにより、新しいデータキーが作成され、AWS KMS キーで暗号化されます。AWS KMS は、暗号化されたデータキーを EBS ボリュームに送信します。ボリュームはそのデータキーをインスタンスにアタッチします。このデータキーは、インスタンスおよび AWS KMS キーと同じ AWS アカウントにあります。

インスタンスが [Stopped] ステータスになっている理由を特定するには、describe-instances AWS CLI コマンドを実行します。

aws ec2 describe-instances --instance-id your-instance-id --query "Reservations[*].Instances[*].StateReason"

**注:**your-instance-id は実際のインスタンス ID に置き換えます。

出力例:

[  
  [
    {
      "Message": "Client.InternalError: Client error on launch",
      "Code": "Client.InternalError"
    }
  ]
]

上記のエラーは、ルートボリュームまたは追加のアタッチ済みボリュームが暗号化されている可能性があることを示しています。AWS KMS キーにアクセスして復号化するアクセス許可がありません。

CreateGrant というイベント名で AWS CloudTrail イベントをフィルタリングすることもできます。

出力例:

"errorMessage": "User: arn:aws:iam::123456789012:user/test is not authorized to perform: kms:CreateGrant on resource: arn:aws:kms:eu-west-1:123456789012:key/8e3426b8-87b4-434c-ae74-8e63dadf354a"

上記のエラーは、IAM プリンシパルに、Amazon EC2 がデータキーを復号化するための CreateGrant アクセス許可がないことを示しています。そのため、インスタンスは起動できません。

**注:**AWS マネージドキーを使用する場合、このエラーは、プリンシパルの IAM ポリシーまたはサービスコントロールポリシー (SCP) で明示的に拒否されている場合にのみ発生します。AWS マネージドキーの使用には、追加の IAM アクセス許可は不要です。

AWS KMS キータイプの確認

次の手順を実行します。

  1. Amazon EC2 コンソールを開きます。
  2. ナビゲーションペインで [Instances] を選択します。
  3. インスタンス ID を選択し、[Storage] を選択します。
  4. [Volume ID] で、暗号化されたボリュームのボリューム ID を選択します。
  5. KMS キー ID については、AWS KMS キー ID をコピーします。
  6. 同じ AWS リージョンで AWS KMS コンソールを開きます。
  7. ナビゲーションペインで [Customer managed keys] を選択します。その後、手順 4 の AWS KMS キー ID を検索します。
  8. [AWS KMS key ID] を選択します。
  9. [Description][General configuration] で、AWS KMS キータイプを確認します。

IAM ポリシーをアタッチする

次の例のように IAM ポリシーを IAM プリンシパルにアタッチします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:CreateGrant"
      ],
      "Resource": [
        "arn:aws:kms:region:123456789012:key/ExampleKey"
      ],
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": true
        }
      }
    }
  ]
}

kms:GrantIsForAWSResource 条件キーにより、IAM プリンシパルは AWS リソースに対してのみ AWS KMS キーの権限を作成することができます。このポリシーでは、IAM プリンシパルが別の IAM プリンシパルに権限を作成することはできません。Amazon EC2 へのアクセスを制限するには、 kms:ViaService 条件キーを使用してください。

次の例に示すように、IAM プリンシパルに追加した IAM アクセス許可は、アカウントのキーポリシーを通じてアクティブ化する必要があります。

{
  "Sid": "Enable IAM User Permissions",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::123456789012:root"},
  "Action": "kms:*",
  "Resource": "*"
}

キーポリシーに IAM プリンシパルを追加して CreateGrant API アクションを許可することもできます。

AWS KMS キーと IAM プリンシパルが同じアカウントにある場合は、プリンシパルをキーポリシーに明示的に含めることができます。AWS KMS キーにアクセスするのための IAM アクセス許可は不要です。

キーポリシーを通じて明示的なアクセス許可を付与するには、キーポリシーに次のステートメントを追加します。

{
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:role/Role_Name"
  },
  "Effect": "Allow",
  "Action": [
    "kms:CreateGrant"
  ],
  "Resource": [
    "*"
  ],
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": true
    }
  }
}

タスクの実行に必要なアクセス許可に最小特権を付与するのがベストプラクティスです。

Amazon EC2 Auto Scaling グループを使用してインスタンスを作成する場合は、「暗号化ボリュームで使用するために必要な AWS KMS キーポリシー」を参照してください。

関連情報

Amazon EBS の暗号化

インスタンスがすぐに終了する

AWS公式更新しました 2ヶ月前
コメントはありません

関連するコンテンツ