背景
現状Elastic Beanstalkのサービスとして、EBSを暗号化するための設定を行う機能はありません。
EBSを暗号化するには下記のうち、どちらかの方法をとる必要があります。
(1) EBSボリュームがデフォルトで暗号化されるよう設定する
(2) Elastic Beanstalk環境用のAMI から、EBSボリュームに対して暗号化の設定を行なったカスタムAMIを作成し、そのAMIを使用する
今回は(1)の方法を使ってEBSを暗号化する方法を紹介します。
この方法の注意点としてはデフォルト暗号化を有効化すると、以降設定したリージョン内で構築されるEBSが全て暗号化されます。
手順
KMSを作成する
デフォルトKMSキーを使用する場合はこの手順は飛ばして問題ないです。
※デフォルトKMSキーを使用すると暗号化したスナップショットをAWSアカウント間でコピーが行えなくなるので注意
カスタマーキーを作成する際、注意点としてオートスケーリングで使用するサービスロールからKMSへのアクセス許可をキーポリシーで明示しておく必要があります。
Elastic Beanstalkはオートスケーリングを使ってEC2を起動するため、サービスロールがKMSへのアクセスができないとEC2が起動できずターミネートされてしまいます。
キーポリシー例
{ "Id": "key-consolepolicy-3", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::アカウントID:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": "オートスケーリングのサービスロール" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": { "AWS": "オートスケーリングのサービスロール" }, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } } ] }
※躓きメモ
僕は最初Elastic Beanstalkのサービスロールをキーポリシーで許可していました。
何度やってもEC2が立ち上がらず苦戦していたのですが、「どのサービスがEC2を起動しているのか?」を考えたら分かりました。
Elastic Beanstalkはオートスケーリングの設定を行う所までしか関与して良いないので、オートスケーリング側に対してKMSへのアクセス許可を与えてあげる必要があります。
EBSのデフォルト暗号化設定
KMSを作成したらEC2が起動する際にEBSがデフォルトで暗号化されるようにします。
EC2のダッシュボード画面から「設定」を押してください。
設定画面が表示されるので以下のように設定してください。デフォルトKMSキーを使用する場合は「(デフォルト)aws/ebs」というものをデフォルトの暗号化キーで指定してください。
Elastic Beanstalkを使って環境を作成する
これで準備は完了です。特にElastic Beanstalk側で設定を変更する必要は無いです。いつも通りのやり方でElastic Beanstalkを使って環境を作成すればEBSが暗号化された状態で構築されます。
まとめ
Elastic BeanstalkでEBSを暗号化するには現状だと少し工夫が必要になります。
カスタムAMIを作成して暗号化を行う方法だと別途AMIの作成を行う必要があるため工数がかかりますが、デフォルト暗号化を使った方法だと簡潔に実現できます。
カスタムAMIを作成する方法はいずれまた別の記事として投稿しようかなと考えてます。