これ↓を嘆いていたら次の日には通りすがりの方が解決してくださった
cf. https://github.com/aws/aws-cdk/issues/9233
※ お金があればそもそも NATゲートウェイ使おう
PrivateLink使おう
で解決すると思います
FargateServicePropsにはある assignPublicIp?
に相当するプロパティが EcsTaskPropsにはない。
じゃあデフォルト値=enableでパブリックIPを自動割り当てするのかというと、なんとデフォルト値はdisabledなので割り当てられない。
パブリックIPがないのでECSタスクはECRからimageをpullすることもできず堕ちる
SubnetPropsの mapPublicIpOnLaunch?
に一縷の望みを託して独自にパブリックサブネットを作って配下に置いてみたがダメだった。無駄無駄ァ!
たぶんダメだろうけどScheduledFargateTaskPropsという搦手があるいはと思うこともあったが試す気力はなかった
どう解決したのか
-
EcsTaskProps.SubnetSelection.SubnetType =
PUBLIC
を指定した- デフォルト値が
PRIVATE
になっているらしい - https://github.com/aws/aws-cdk/blob/c647e389bd279b34e91110c9418885fe904739c3/packages/%40aws-cdk/aws-events-targets/lib/ecs-task.ts#L166
- サブネットのほうのパブリックIP割り当て設定を引き継いでくれても良いのではと今でも思っている
- デフォルト値が
- ECSタスク設定では、VPCサブネットのことを深く考えないことにした
- 当時は
subnets
で細かく指定しようとしていた -
subnetType
と競合した のでやむなくsubnets
は諦めた - つまり
SubnetType = PUBLIC
だけの指定になった≒パブリックであることしか指定しないのでVPC内のパブリックサブネットが複数あったときどうなるのかわからないがそもそもVPCとサブネットの関係とはそんなものなのかもしれないので考えるのをやめた
- 当時は
こんな感じの指定をする
const nanikaNoTask = new eventstargets.EcsTask({
cluster: nanikaNoCluster,
taskDefinition: nanikaNoTaskDefinition,
taskCount: 1,
securityGroup: nanikaNoSecurityGroup,
subnetSelection: {
subnetType: ec2.SubnetType.PUBLIC, // <- これ
availabilityZones: [nanika.no.availabilityZones.a],
// subnets: [nanikaNoPublicSubnet1], <- これがsubnetTypeと同時指定できない
},
platformVersion: ecs.FargatePlatformVersion.VERSION1_4,
});