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

最終更新日: 2020 年 9 月 25 日

暗号化されたボリュームがアタッチされた状態で Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを起動したのですが、インスタンスは起動しません。インスタンスはただちに保留状態から停止状態になります。AWS コマンドラインインターフェイス (AWS CLI) コマンド describe-instance を実行すると、次のエラーが発生します。

....
"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 ユーザーは、カスタマーマスターキー (CMK) を復号化するための AWS KMS へのアクセス許可を持っている必要があります。

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

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

解決方法

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

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

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

2    [JSON] タブを選択し、次のポリシーをコピーして貼り付けます。

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

3    [ポリシーの確認] をクリックします。

4    [名前] に、わかりやすい名前を入力し、[ポリシーの作成] を選択します。

5    手順 4 で作成したポリシーを選択します。

6    [ポリシーの使用状況] タブを選択し、[アタッチ] をクリックします。

7    [名前] で、CMK にアクセス許可を付与する IAM エンティティを選択し、[ポリシーのアタッチ] をクリックします。

IAM プリンシパルに CMK への明示的なアクセスを許可する

1    AWS KMS コンソールを開き、[カスタマーの管理下にあるキー] を選択します。

2    [キー ID] で、お使いのキー ID を選択します

3    [キーユーザー] で [追加] を選択します。

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

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

{
            "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 は、ユーザーに代わってそのサービスからの対話を許可します。プリンシパルに CMK と統合サービスを使用するアクセス許可があることを確認してください。詳細については、「KMS: ViaService 条件キーの制限」を参照してください。

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

"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"
      }    
},

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