【AWS】Elastic Beanstalk環境のELBについてアクセスログ出力等の設定を行う
よく訓練されたアップル信者、都元です。Elastic Beanstalkは、アプリケーションの一般的な実行環境をサクッと立ち上げてくれる、いわばPaaSのような立ち位置にあるサービスです。
誤解を恐れずざっくりと表現すると、Auto ScalingするEC2(Webサーバ)とELB、必要に応じてRDSをひとまとめに作ってくれます。当然、EC2の中では、必要なミドルウェア(TomcatやPHP等)が自動的にセットアップされ、利用者はS3にアップロードしたアプリケーションを指定するだけで、それをデプロイしてくれる、というサービスです
そんなわけで、その上で動くアプリケーションは、ある程度Beanstalkのお作法に則った構成が必要となってしまいます。例えば、RDSへの接続エンドポイント名等は、アプリケーション内にハードコーディングするのではなく、外部から注入されるのがベストです。例えばこのような外部からの設定値の受け取り方には、Beanstalkなりのお作法があったりします。
これとは逆に、アプリケーションの方からBeanstalk構成に対して、構成・設定の調整をすることも可能です。今回は、Beanstalkが自動的にセットアップするELBについて、この設定を変更する方法を小ネタとしてご紹介します。
.ebextensions
先ほど、利用者はアプリケーションをS3にアップロードする、と言いました。Javaであればwarファイルを、その他プラットフォームであれば、ソースコードをzipで固めたものをS3にアップロードします。このようなzipファイルをBeanstalkでは「アプリケーションバンドル」と呼びます。
このアプリケーションバンドル内のルート・ディレクトリ直下に.ebextensionsというディレクトリを作り、その内部に(任意の名前).configというファイルを置いておくことにより、アプリケーション側からBeanstalkに対して、設定の指示を行うことができます。
.ebextensionsからELBの設定を行う
BeanstalkにおけるELBは通常デフォルトの設定で構築されますが、最近ELBには「クロスゾーン設定」や「アクセスログ出力」「コネクションドレーニング」等の拡張機能が実装されており、これらの設定はされません。しかし、Beanstalkでもアクセスログは取りたいですよね! ということで、この.ebextensionsディレクトリの下に、下記のようなelb.configを配置してみてください。
Resources: AWSEBLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: CrossZone: true ConnectionDrainingPolicy: Enabled: true Timeout: 300 AccessLoggingPolicy: Enabled: true S3BucketName: eb-elb-logs-xxx
YAML形式の短いテキストファイルです。CloudFormationを触ったことがある方であれば、あのJSONをYAMLに書き換えたものだな、というのは容易に想像がつくと思います。
このファイルをBeanstalkが認識すると、ELBを「クロスゾーンルーティングON」「300秒のコネクションドレーニングを有効に」「ログファイルを有効に」した状態で作成してくれます。(もちろん、S3BucketNameは自分で作成したバケット名にきちんと書き換えましょう)
簡単ですね。とくにまとめることもないくらい…。既にBeanstalkでアプリを運用している場合、ディレクトリを1つとファイルを1つ作るだけで、ELBのログを得られるようになります。特にデメリットも無いと思うので、是非試してみてください!