sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

PrivateLink を CloudFormation で作ってみた

少しづつ CloudFormation から離れつつあります、那須です。

ちょっと前に CloudFormation で PrivateLink が作れるって AWS さんからニュースが出てました。
AWS PrivateLink リソースに対する CloudFormation サポートの導入

最近手作業で PrivateLink を構築したばっかりだったので、実際にやってみました!

 

作る AWS リソース

f:id:nasrinjp1:20180626213546p:plain

 

テンプレート内容

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 で作成する機会ってあまりなさそうですが、もしそういう場面に直面された方の参考になればうれしいです。