暗号化されたボリュームが添付された状態でインスタンスをスタートすると、インスタンスはすぐに「起動時のクライアントエラー」というエラーで停止します。

最終更新日: 2022 年 1 月 7 日

暗号化されたボリュームが添付された Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを起動しましたが、インスタンスがスタートしません。インスタンスは直ちに保留状態からシャットダウンし、最終的には終了状態になります。終了したインスタンスで AWS Command Line Interface (AWS CLI) コマンド describe-instances を実行すると、次のエラーが表示されます。

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

このエラーはどのように解決すればよいですか。

簡単な説明

この問題は、次の場合に、暗号化されたボリュームが添付された状態の EC2 インスタンスで発生します。

  • インスタンスを起動する AWS Key Management Service (AWS KMS) または AWS Identity and Access Management (IAM) ユーザーに必要なアクセス許可がない場合。
  • KMS キーの使用が SourceIP 条件キーによって制限されている場合。

IAM ユーザーには、AWS KMS キーを復号化するための AWS KMS に対する許可が必要です。

KMS キーを復号化するためのアクセスを許可するには、IAM ポリシーまたは grant と共にキーポリシーを使用する必要があります。KMS キーへのアクセスを許可するには IAM ポリシーだけでは不十分ですが、それらを KMS キーのポリシーと組み合わせて使用できます。

デフォルトで、KMS キーはルートアカウントにのみアクセス権を付与します。EC2 の完全な権限が IAM ユーザーまたはロールに提供されている場合、AWS KMS 許可は、KMS キーのポリシーへのアクセス権を明示的に付与する必要があります。

解決方法

IAM ポリシーを作成して、IAM プリンシパルが AWS KMS API を呼び出せるようにする

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

1.    IAM コンソールを開き、[Policies] (ポリシー) を選択してから、[Create policy] (ポリシーの作成) をクリックします。

2.    [JSON] タブを選択し、 Resourceキー ARN を使用して、このポリシーをコピーして貼り付けます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:Encrypt",
        "kms:GenerateDataKey*",
        "kms:DescribeKey",
        "kms:CreateGrant"
      ],
      "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }
  ]
}

3.    [Review policy] (ポリシーの確認) を選択します。

4.    [Name] (名前) で、わかりやすい名前を入力し、[Create policy] (ポリシーの作成) を選択します。

5.    ステップ 4 で作成したポリシーを選択します。

6.    [Policy usage] (ポリシーの使用状況) タブを選択してから、[Attach] (アタッチ) を選択します。

7.    [Name] (名前) で KMS キーへの許可を付与する IAM エンティティを選択してから、[Attach policy] (ポリシーのアタッチ) を選択します。

KMS キーへの明示的なアクセス権を IAM プリンシパルに付与する

1.    AWS KMS コンソールを開き、[Customer managed keys] (カスタマーマネージドキー) を選択します。

2.    [Key ID] (キー ID) で、キー ID を選択します。

3.    [Key users] (キーユーザー) で、[Add] (追加) を選択します。

4.    [Name] (名前) で IAM ユーザーまたはロールを選択し、[Add] (追加) をクリックします。

注意: デフォルトのキーポリシーの代わりにカスタムキーポリシーを使用している場合、KMS キーは以下の許可を明示的に付与する必要があります。

{
      "Sid": "Allow use of the key",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
        "arn:aws:iam::123456789012:role/MyRoleName",
          "arn:aws:iam::123456789012:user/MyUserName"
        ]
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow attachment of persistent resources",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
      "arn:aws:iam::123456789012:role/MyRoleName",
          "arn:aws:iam::123456789012:user/MyUserName"
        ]
      },
      "Action": [
        "kms:CreateGrant",
        "kms:ListGrants",
        "kms:RevokeGrant"
      ],
      "Resource": "*",
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": "true"
        }
      }
    }

IP アドレス条件を使用する

AWS KMS を使用して統合サービスのデータを保護する場合は、IP アドレス条件演算子を指定するときや、同じアクセスポリシーステートメントで aws:SourceIp 条件キーを指定するときには注意してください。暗号化された Amazon Elastic Block Store (Amazon EBS) ボリュームを Amazon EC2 インスタンスに添付すると、Amazon EC2 は AWS KMS にリクエストを送信します。このリクエストにより、ボリュームの暗号化されたデータキーが復号します。このリクエストは、ユーザーの IP アドレスではなく、EC2 インスタンスに関連付けられた IP アドレスから取得します。つまり、SourceIp 条件が設定されている場合、復号リクエストは拒否され、インスタンスが失敗します。

KMS: ViaService 条件キーを使用します。AWS KMS は、ユーザーに代わってそのサービスからのやり取りを許可します。KMS キーと、統合されたサービスを使用するための許可がプリンシパルにあることを確認してください。詳細については、kms:ViaService 条件キーの制限を参照してください。

注: ログオンしたユーザーが存在する EC2 インスタンスは、この条件とは対話できません。ユーザーに代わるサービスの操作のみが可能です。このインタラクションは AWS CloudTrail ログに記録され、確認することができます。

次の例では、API コールの CloudTrail エントリが AWS KMS に対して作成されます。これは、特定の IP アドレスからではなく、Amazon EC2 インフラストラクチャによって呼び出されます。AWS KMS が Amazon EC2 との対話を許可するポリシーをユーザーに追加すると、API 呼び出しが完了します。

"userIdentity": {
  "sessionContext": {
  "sessionIssuer": {
    "accountId": "450822418798",
    "principalId": "450822418798:aws:ec2-infrastructure",
    "userName": "aws:ec2-infrastructure",
    "arn": "arn:aws:iam::450822418798:role/aws:ec2-infrastructure",
    "type": "Role"
   },
...
  "eventType": "AwsApiCall",
  "@log_group": "CloudTrail/AllRegionLogGroup",
  "awsRegion": "eu-west-1",
  "requestParameters": {
    "encryptionContext": {
    "aws:ebs:id": "vol-0ca158925aa9c1883"
    }
}