【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のログを得られるようになります。特にデメリットも無いと思うので、是非試してみてください!