share facebook facebook twitter menu hatena pocket slack

2020.05.18 MON

AWS Elastic BeanstalkでEBSボリュームを暗号化するには?

菊池 宣明

WRITTEN BY 菊池 宣明

背景

現状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を作成する方法はいずれまた別の記事として投稿しようかなと考えてます。

元記事はこちら

AWS Elastic BeanstalkでEBSボリュームを暗号化するには?

菊池 宣明

菊池 宣明

MSPの中の人。最近はMSP業務の運用改善や構築業務をやったりしてます。学生時代はタンパク質の研究をしてました。好きなタンパク質はヘモリシンです。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。