質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1295閲覧

AWS ALB CloudFormationの設定で、接続先の特定のURLを443/tcp公開にしたいです。

hanju8810tt

総合スコア16

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2022/08/03 23:22

前提

・AWS Cloudformationでリソースをコードで管理・構築しています。
以下のソースコードがそれにあたりますが、会社を特定できる情報は省いたり、伏字を使ったりしています。

実現したいこと

・ListnerRuleを使い、「/api/v1/sstart/*」にアクセスしたときのみセキュリティグループ「ElbSecurityGroupFullOpen:」を適用して
443/tcp(フルオープン)にしたいです。
・そのほかのURLにアクセスしたときには「ElbSecurityGroup」を適用して送信元IPによりアクセスを制限したいです。

発生している問題・エラーメッセージ

・このコード上部にある制限付きのセキュリティグループ「ElbSecurityGroup」が適用されてしまい、フルオープンにならないです。
※エラーにはなりません。  

該当のソースコード

Cloudformation(yaml形式)

1AWSTemplateFormatVersion: 2010-09-09 2 3Parameters: 4 Environment: 5 Type: String 6 AllowedValues: 7 - prd 8 - stg 9 - dev 10 SystemName: 11 Type: String 12 Default: "hanju" 13 DomainName: 14 Type: String 15 PublicHostedZoneId: 16 Type: String 17 18 pCertificateArn: 19 Type: String 20 pBlueGrenTarget: 21 Type: String 22 AllowedValues: 23 - blue 24 - green 25 26Conditions: 27 DevResource: 28 !Equals [!Ref Environment, dev] 29 StgResource: 30 !Equals [!Ref Environment, stg] 31 PrdStgResource: 32 !Or [ !Equals [!Ref Environment, prd],!Equals [!Ref Environment, stg] ] 33 AccountResource: 34 !Or [ !Equals [!Ref Environment, prd],!Equals [!Ref Environment, stg], !Equals [!Ref Environment, dev] ] 35 BlueTarget: 36 !Equals [!Ref pBlueGrenTarget, blue] 37 38 39Resources: 40 41 # SecurityGroup 42 43 ElbSecurityGroup: 44 Type: AWS::EC2::SecurityGroup 45 Properties: 46 GroupDescription: Only HTTPS Access 47 SecurityGroupIngress: 48 - IpProtocol: "TCP" 49 Description: "Allow From VT Vpn NatGateway PublicIP Address" 50 CidrIp: !Sub "${VpnPublicIP}/32" 51 FromPort: 443 52 ToPort: 443 53 - IpProtocol: "TCP" 54 Description: "Allow From NatGateway1 ElasticIP Address" 55 CidrIp: 56 Fn::Join: 57 - "" 58 - - Fn::ImportValue: !Sub "${SystemName}-${Environment}-natgateway-eip01" 59 - "/32" 60 FromPort: 443 61 ToPort: 443 62 - IpProtocol: "TCP" 63 Description: "Allow From NatGateway2 ElasticIP Address" 64 CidrIp: 65 Fn::Join: 66 - "" 67 - - Fn::ImportValue: !Sub "${SystemName}-${Environment}-natgateway-eip02" 68 - "/32" 69 FromPort: 443 70 ToPort: 443 71 72 73 VpcId: 74 Fn::ImportValue: !Sub "${SystemName}-${Environment}-vpc" 75 76 ElbSecurityGroupFullOpen: 77 Type: AWS::EC2::SecurityGroup 78 Properties: 79 GroupDescription: Allow https to client host 80 VpcId: 81 Fn::ImportValue: !Sub "${SystemName}-${Environment}-vpc" 82 SecurityGroupIngress: 83 - IpProtocol: tcp 84 FromPort: 443 85 ToPort: 443 86 CidrIp: 0.0.0.0/0 87 88 89 # ##### 90 # v3 resources 91 # ##### 92 93 hanjuLoadBalancer: 94 Type: AWS::ElasticLoadBalancingV2::LoadBalancer 95 Properties: 96 Name: !Join 97 - '' 98 - - !Ref SystemName 99 - "-" 100 - !Ref Environment 101 - "-hanju-elb" 102 Subnets: 103 - Fn::ImportValue: !Sub "${SystemName}-${Environment}-public-subnet01" 104 - Fn::ImportValue: !Sub "${SystemName}-${Environment}-public-subnet02" 105 SecurityGroups: 106 - !Ref ElbSecurityGroup 107 - Fn::ImportValue: !Sub "${SystemName}-${Environment}-default-sg" 108 Tags: 109 - Key: Name 110 Value: !Join 111 - '' 112 - - !Ref SystemName 113 - "-" 114 - !Ref Environment 115 - "-hanju-elb" 116 Scheme: internet-facing 117 LoadBalancerAttributes: 118 - Key: access_logs.s3.enabled 119 Value: true 120 - Key: access_logs.s3.bucket 121 Value: !Sub "logs-${AWS::AccountId}" 122 123 hanjuLoadBalancerListener: 124 Type: AWS::ElasticLoadBalancingV2::Listener 125 Properties: 126 LoadBalancerArn: !Ref hanjuLoadBalancer 127 Port: 443 128 Protocol: HTTPS 129 SslPolicy: ELBSecurityPolicy-FS-1-2-Res-2020-10 130 Certificates: 131 - CertificateArn: !Ref pCertificateArn 132 DefaultActions: 133 - Type: forward 134 TargetGroupArn: !If [ BlueTarget, !Ref hanjuTargetGroupBlue, !Ref hanjuTargetGroupV3Green ] 135 136 hanjuTestLoadBalancerListener: 137 Type: AWS::ElasticLoadBalancingV2::Listener 138 Properties: 139 LoadBalancerArn: !Ref hanjuLoadBalancer 140 Port: 8443 141 Protocol: HTTPS 142 SslPolicy: ELBSecurityPolicy-FS-1-2-Res-2020-10 143 Certificates: 144 - CertificateArn: !Ref pCertificateArn 145 DefaultActions: 146 - Type: forward 147 TargetGroupArn: !If [ BlueTarget, !Ref hanjuTargetGroupBlue, !Ref hanjuTargetGroupV3Green ] 148 149 hanjuLoadBalancerListenerRule: 150 Type: 'AWS::ElasticLoadBalancingV2::ListenerRule' 151 Properties: 152 Actions: 153 - Type: forward 154 Conditions: 155 - Field: path-pattern 156 PathPatternConfig: 157 Values: 158 - "/api/v1/sstart/*" 159 ListenerArn: !Ref hanjuTestLoadBalancerListener 160 Priority: 1 161 162 hanjuTestLoadBalancerListenerRule: 163 Type: 'AWS::ElasticLoadBalancingV2::ListenerRule' 164 Properties: 165 Actions: 166 - Type: forward 167 Conditions: 168 - Field: path-pattern 169 PathPatternConfig: 170 Values: 171 - "/api/v1/sstart/*" 172 ListenerArn: !Ref hanjuTestLoadBalancerListener 173 Priority: 1 174 175 hanjuTargetGroupBlue: 176 Type: AWS::ElasticLoadBalancingV2::TargetGroup 177 Properties: 178 Name: !Sub "${SystemName}-${Environment}-blue-tg" 179 VpcId: 180 Fn::ImportValue: 181 !Sub "${SystemName}-${Environment}-vpc" 182 Port: 80 183 Protocol: HTTP 184 TargetType: ip 185 HealthCheckPath: / 186 187 hanjuTargetGroupV3Green: 188 Type: AWS::ElasticLoadBalancingV2::TargetGroup 189 Properties: 190 Name: !Sub "${SystemName}-${Environment}-green-tg" 191 VpcId: 192 Fn::ImportValue: 193 !Sub "${SystemName}-${Environment}-vpc" 194 Port: 80 195 Protocol: HTTP 196 TargetType: ip 197 HealthCheckPath: / 198 199 hanjuElbRecord: 200 Type: AWS::Route53::RecordSet 201 Properties: 202 HostedZoneId: !Ref PublicHostedZoneId 203 AliasTarget: 204 DNSName: !GetAtt hanjuLoadBalancer.DNSName 205 HostedZoneId: !GetAtt hanjuLoadBalancer.CanonicalHostedZoneID 206 Name: !Sub "api.${DomainName}" 207 Type: "A" 208 209

試したこと

やはり、ALBのリスナールールで変更するのだと思うのですがわかりません。

補足情報(FW/ツールのバージョンなど)

とくになし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リスナールールの条件にセキュリティグループを使うことはできません。
そもそも、セキュリティグループはレイヤー的にはネットワーク的にALB自体にアクセスできるか否かを制御しているので、今回の目的だとALB自体には443をフルオープンにしたセキュリティグループのみ使うことになります。
リスナールールはALBにアクセスがあった場合にどう振り分けるかを制御するものです。

・ListnerRuleを使い、「/api/v1/sstart/*」にアクセスしたときのみセキュリティグループ「ElbSecurityGroupFullOpen:」を適用して443/tcp(フルオープン)にしたいです。
・そのほかのURLにアクセスしたときには「ElbSecurityGroup」を適用して送信元IPによりアクセスを制限したいです。

これは
/api/v1/sstart/*に対するアクセスだけ制限無しでアクセスさせ、それ以外は特定の送信元IPからのみ接続を許可したい
ということでいいでしょうか。

それであれば、例えば下記のようなリスナールールで実現可能かと思います。
※上の方が優先度が高いルールとして設定してください。

  • パスが/api/v1/sstart/*のとき、送信したいターゲットグループにリクエストを送る
  • 許可したい送信元のIPレンジのみ、送信したいターゲットグループにリクエストを送る
  • (デフォルトルール)固定レスポンスを返す(403のエラーなど)

あとは上記をCfnのコードに落としてみてください。

設定をコード化するのは良いのですが、うまく行かないときはコンソールでやりたいことを実現できるか一度試してみることをお勧めします。

参考
Application Load BalancerのリスナールールによるIP制限
ALBリスナールールを使って特定パス以下のアクセスを許可IPからのみに制限する

投稿2022/08/04 04:55

yu_1985

総合スコア7447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問