EventBridgeなどの他のサービス経由で EC2 インスタンスが起動できない事象への対応方法

EC2 にアタッチされている EBS が KMS キー(カスタマーマネージドキー)で暗号化されている場合、他のサービスを用いて EC2 を起動する際に 他のサービスが用いる IAM ロールに KMS キーを復号化する IAM ポリシーが必要です。
2024.01.09

困っていること

EventBridge スケジューラを用いて定時に EC2 を起動する仕組みを作りました。

しかし、EventBridge スケジューラの実行時刻になっても、EC2 が起動されませんでした。

EvenrBridge スケジューラの実行ロールには EC2 を Start する許可がある IAM ポリシーが付与されています。

EC2 にアタッチされている EBS は暗号化されています。

解決方法を教えてください。

どう解決すればいいの?

EC2 にアタッチされている EBS が KMS キー(カスタマーマネージドキー)で暗号化されている場合、他のサービスを用いて EC2 を起動する際に 他のサービスが用いる IAM ロールに KMS キーを復号化する IAM ポリシーが必要です。

そのため、EventBridge の実行ロールに下記の権限が必要となります。

{
  "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:<region>:<AccountID>:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }
  ]
}

やってみた

EC2 インスタンスを作成します。作成時に、ルートボリュームをカスタマーマネージドキーで暗号化します。

EventBridge Scheduler で EC2 を起動するスケジュールを作成し、実行ロールに AWS 管理ポリシーの EC2FullAccess を付与します。

スケジュールが実行されましたが、インスタンスが起動されていませんでした。CloudTrail には下記の記録が残っていました。

{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROASAMPLESAMPLESAMPL:SAMPLESAMPLESAMPLESAMPLE",
        "arn": "arn:aws:sts::<AccountID>:assumed-role/ScheduleRoleFullAccess/SAMPLESAMPLESAMPLESAMPLE",
        "accountId": "<AccountID>",
        "accessKeyId": "ASIASAMPLESAMPLESAMPL",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROASAMPLESAMPLESAMPL",
                "arn": "arn:aws:iam::<AccountID>:role/ScheduleRoleFullAccess",
                "accountId": "<AccountID>",
                "userName": "ScheduleRoleFullAccess"
            },
            "attributes": {
                "creationDate": "2024-01-09T01:29:23Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2024-01-09T01:29:23Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "StartInstances",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "123.123.123.123",
    "userAgent": "AmazonEventBridgeScheduler, aws-sdk-java/2.22.10 Linux/5.10.201-191.748.amzn2.x86_64 OpenJDK_64-Bit_Server_VM/17.0.9+13-LTS Java/17.0.9 kotlin/1.6.21-release-334(1.6.21) vendor/Amazon.com_Inc. md/internal exec-env/AWS_ECS_FARGATE io/async http/NettyNio cfg/retry-mode/legacy",
    "requestParameters": {
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-<instanceid>"
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "6b0db447-abcd-1234-abcd-1234567890ab",
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-<instanceid>",
                    "currentState": {
                        "code": 0,
                        "name": "pending"
                    },
                    "previousState": {
                        "code": 80,
                        "name": "stopped"
                    }
                }
            ]
        }
    },
    "requestID": "6b0db447-abcd-1234-abcd-1234567890ab",
    "eventID": "6ec420f5-abcd-1234-abcd-1234567890ab",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AccountID>",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "ec2.ap-northeast-1.amazonaws.com"
    }
}

EC2 インスタンスの状態が stopped から pending に変化していますが、マネジメントコンソールでは stopped に戻っていました。

カスタマーマネージドキーで暗号化された EBS ボリュームがアタッチされた EC2 は、管理ポリシー EC2FullAccess では不足していることが分かりました。

では、EventBridge Scheduler の実行ロールにカスタマーマネージドキーへのアクセス権限を付与します。

スケジュールの実行後、インスタンスが起動されたことが確認できました。

参考資料

EventBridgeスケジューラを使ってEC2の定期起動/停止を行う方法 | DevelopersIO

暗号化されたボリュームがアタッチされた状態でインスタンスを起動すると、インスタンスはすぐに停止します | AWS re:Post