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によって作成される標準リソース
ebextensions
のResources
プロパティによって作成されるカスタムリソース
標準リソースはこちらのドキュメントを参考にしてください。 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"] }
つまり、カスタムリソースからは Ref
や Fn::GetAtt
でリソース情報が参照できます。
WAFを適用するスニペット
最後に、ググってもヒットしなかったのでElasticBeanstalkにWAFを適用できるスニペットを貼っておきます。
Resources: webACLAssociation: Type: AWS::WAFRegional::WebACLAssociation Properties: ResourceArn: { "Ref": "AWSEBV2LoadBalancer" } WebACLId: { "Ref": "wafACLId" }
AWSEBV2LoadBalancerは標準リソースからの参照です。
wafACLIdは別途パラメーターに定義するなどしてご利用ください。