PrivateLink を CloudFormation で作ってみた
少しづつ CloudFormation から離れつつあります、那須です。
ちょっと前に CloudFormation で PrivateLink が作れるって AWS さんからニュースが出てました。
AWS PrivateLink リソースに対する CloudFormation サポートの導入
最近手作業で PrivateLink を構築したばっかりだったので、実際にやってみました!
作る AWS リソース
テンプレート内容
NLB、VPC Endpoint Service、VPC Endpoint の 3 つのリソースを一気に作成するテンプレートでテストしてみました。 NLB のパラメータは雑に入れてしまいましたが、とりあえず作りたいだけだったのでこれでよしとします。
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "NlbArn": { "Type": "String", "Description": "NLB ARN" }, "VpcId": { "Type": "String", "Description": "VPC-ID for VPC Endpoint" }, "SecurityGroupId": { "Type": "String", "Description": "SG-ID for VPC Endpoint" }, "SubnetId": { "Type": "String", "Description": "SubnetID for VPC Endpoint" } }, "Resources": { "Nlb": { "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties": { "Name": "testnlb", "Scheme": "internal", "Type": "network", "Subnets": [ "subnet-xxxxxxxx", "subnet-xxxxxxxx" ] } }, "VpcEndpointService": { "Type": "AWS::EC2::VPCEndpointService", "Properties": { "NetworkLoadBalancerArns": [ { "Ref": "Nlb" } ], "AcceptanceRequired": true }, "DependsOn": [ "Nlb" ] }, "VpcEndpoint": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { "VpcId": { "Ref": "VpcId" }, "ServiceName": { "Fn::Sub": "com.amazonaws.vpce.${AWS::Region}.${VpcEndpointService}" }, "VpcEndpointType": "Interface", "SubnetIds": [ { "Ref": "SubnetId" } ], "SecurityGroupIds": [ { "Ref": "SecurityGroupId" } ] }, "DependsOn": [ "VpcEndpointService" ] } } }
結果
NLB、VPC Endpoint Service、VPC Endpoint の 3 つのリソースは作成されました! が、よく見ると VPC Endpoint Service で エンドポイントの接続承認待ちの状態で止まってしまいました。 そのまま放っておくとエラーになってロールバックされますが、承認待ちの状態で手作業で承認すると CloudFormation のスタック作成は成功しました。
承認タスクは CloudFormation で対応できないか?
エンドポイントサービスのドキュメントを見ると下記のように書かれていました。
docs.aws.amazon.com
To accept a request, use AcceptVpcEndpointConnections.
というわけで、現時点では手作業か API コールするしかなさそうです。 AcceptanceRequired を false にすればいいと思いますが、そのような運用になっている場面ってあまりなさそうなので、そのうち対応されることを期待しておこうと思います。
まとめ
PrivateLink を CloudFormation で作成する機会ってあまりなさそうですが、もしそういう場面に直面された方の参考になればうれしいです。