テックメモ

技術的に気になったことをメモしていきます

ElasticBeantalkで作成されるリソース間の参照方法

はじめに

今年はブログたくさん書きたいなぁと思っていたらもう4月でした。
これで今年2本目のブログです。やばい。

直近でAWSのElasticBeanstalkで使える ebextensions について調べたのでメモしておきます。

ebextensionsのこと

そもそもみなさんはElasticBeanstalkを使ったことはあるでしょうか? docs.aws.amazon.com

たまにPaaSと表現されたりもしますが、僕はAWSリソースのプロビジョニングとアプリケーションのデプロイを統合して面倒を見てくれる、それはそれは素敵で業の深いサービスだと思っています。
ElasticBeanstalkの酸いも甘いも経験された方、一杯飲みに行きましょう。

さて、肝心の ebextensions について。

これはアプリケーションのソースコード内に .ebextensions というフォルダを作り、そこへ xxx.config という感じで命名した設定ファイルを放り込むことで、環境設定、パッケージの導入、CloudFormation記法を使ってのリソース作成、などが出来る控えめに言って黒魔法な存在です。
個人的にはあまり黒魔法すぎない程度(パッケージの導入やロケールの設定)に使うと良いと思っているのですが、バランス良く使うのはとても難しいです。

そんな ebextensions の、リソース作成にフォーカスした話題です。

本題

ElasticBeanstalkで作成されるリソース間の参照方法をまとめたいと思います。
まずElasticBeanstalkのリソースには、以下の2つのタイプが存在する事を意識しておくと良いです。

  • ElasticBeanstalkによって作成される標準リソース
  • ebextensionsResources プロパティによって作成されるカスタムリソース

標準リソースはこちらのドキュメントを参考にしてください。 docs.aws.amazon.com

カスタムリソースはこちらのドキュメントを参考にしてください。 docs.aws.amazon.com

さて、もちろんAWSリソースを作成する際には依存関係のあるリソース定義も必要になります。
この時は、標準リソースであっても、カスタムリソースであってもリソース情報を参照する術が必要となります。

上述したドキュメントには両者の答えとなる素晴らしいサンプルが記述されています。
そちらを抜粋したのが下記となります。

Resources:

  hooktopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: "my-email@example.com"
          Protocol: email

  lifecyclehook:
    Type: AWS::AutoScaling::LifecycleHook
    Properties:
      AutoScalingGroupName: { "Ref" : "AWSEBAutoScalingGroup" }
      LifecycleTransition: autoscaling:EC2_INSTANCE_TERMINATING
      NotificationTargetARN: { "Ref" : "hooktopic" }
      RoleARN: { "Fn::GetAtt" : [ "hookrole", "Arn"] }

これはLifeCyclehookとSNS Topicの作成例です。

着眼していただきたいのは、カスタムリソースの lifecyclehook 作成部分になります。
ここには、標準リソースの参照方法と、カスタムリソースの参照方法のエッセンスが詰まっています。

標準リソースの参照方法

カスタムリソースの lifecyclehook を作成する為に、ElasticBeanstalkが作成する標準リソースの AutoScalingName が必要としています。

ここの部分です。

      AutoScalingGroupName: { "Ref" : "AWSEBAutoScalingGroup" }

通常 AutoScalingName はElasticBeanstalkにより作成されるため不定の値となるので、これを標準リソース AWSEBAutoScalingGroup から Ref 関数で参照するようにしています。

つまり、標準リソースからは Ref 関数を用いることでリソース情報を参照できます。

カスタムリソースの参照方法

またまたカスタムリソースの lifecyclehook を作成する部分を見ていくと、今度はカスタムリソースの hooktopic を必要としている記述があります。

ここの部分です。

      NotificationTargetARN: { "Ref" : "hooktopic" }

これは直前で定義されている以下 hooktopic のARNを Ref で参照しています。

  hooktopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: "my-email@example.com"
          Protocol: email

また、データを参照する方法は Ref 以外にもあります。

以下のように Fn::GetAtt を使って各リソースのアトリビュートも取得可能です。(この辺りはCloudFormationの世界ですね)

      RoleARN: { "Fn::GetAtt" : [ "hookrole", "Arn"] }

つまり、カスタムリソースからは RefFn::GetAtt でリソース情報が参照できます。

WAFを適用するスニペット

最後に、ググってもヒットしなかったのでElasticBeanstalkにWAFを適用できるスニペットを貼っておきます。

Resources:
  webACLAssociation:
    Type: AWS::WAFRegional::WebACLAssociation
    Properties:
      ResourceArn: { "Ref": "AWSEBV2LoadBalancer" }
      WebACLId: { "Ref": "wafACLId" }

AWSEBV2LoadBalancerは標準リソースからの参照です。
wafACLIdは別途パラメーターに定義するなどしてご利用ください。