困っていること
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