5.3. サンプルアプリケーションのデプロイ
サンプルアプリケーション用に新しいプロジェクトを作成します。
$ oc new-project hello-world
Hello World アプリケーションをデプロイします。
$ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
事前に作成済みのサービスリソースを NodePort サービスタイプに変換します。
$ oc -n hello-world patch service hello-openshift -p '{"spec":{"type":"NodePort"}}'
AWS Load Balancer Operator を使用して AWS ALB をデプロイします。
$ cat << EOF | oc apply -f - apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-openshift-alb namespace: hello-world annotations: alb.ingress.kubernetes.io/scheme: internet-facing spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Exact backend: service: name: hello-openshift port: number: 8080 EOF
AWS ALB Ingress エンドポイントを curl して、Hello World アプリケーションにアクセスできることを確認します。
注記AWS ALB のプロビジョニングには数分かかります。
curl: (6) Could not resolve host
というエラーが表示された場合は、待機してから再試行してください。$ INGRESS=$(oc -n hello-world get ingress hello-openshift-alb -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') $ curl "http://${INGRESS}"
出力例
Hello OpenShift!
5.3.1. AWS WAF の設定
AWS WAF サービスは Web アプリケーションファイアウォールです。ROSA などの保護対象の Web アプリケーションリソースに転送される HTTP および HTTPS 要求を監視、保護、制御できます。
Web ACL に適用する AWS WAF ルールファイルを作成します。
$ cat << EOF > ${SCRATCH}/waf-rules.json [ { "Name": "AWS-AWSManagedRulesCommonRuleSet", "Priority": 0, "Statement": { "ManagedRuleGroupStatement": { "VendorName": "AWS", "Name": "AWSManagedRulesCommonRuleSet" } }, "OverrideAction": { "None": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "AWS-AWSManagedRulesCommonRuleSet" } }, { "Name": "AWS-AWSManagedRulesSQLiRuleSet", "Priority": 1, "Statement": { "ManagedRuleGroupStatement": { "VendorName": "AWS", "Name": "AWSManagedRulesSQLiRuleSet" } }, "OverrideAction": { "None": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "AWS-AWSManagedRulesSQLiRuleSet" } } ] EOF
これにより、コア (共通) および SQL AWS マネージドルールセットが有効になります。
上記で指定したルールを使用して、AWS WAF の Web ACL を作成します。
$ WAF_ARN=$(aws wafv2 create-web-acl \ --name ${CLUSTER}-waf \ --region ${REGION} \ --default-action Allow={} \ --scope REGIONAL \ --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=${CLUSTER}-waf-metrics \ --rules file://${SCRATCH}/waf-rules.json \ --query 'Summary.ARN' \ --output text)
Ingress リソースに AWS WAF の Web ACL ARN のアノテーションを付けます。
$ oc annotate -n hello-world ingress.networking.k8s.io/hello-openshift-alb \ alb.ingress.kubernetes.io/wafv2-acl-arn=${WAF_ARN}
ルールが反映されるまで 10 秒待ち、アプリケーションがまだ動作するかテストします。
$ curl "http://${INGRESS}"
出力例
Hello OpenShift!
WAF が不正な要求を拒否することをテストします。
$ curl -X POST "http://${INGRESS}" \ -F "user='<script><alert>Hello></alert></script>'"
出力例
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> </body> </html
注記AWS WAF 統合の有効化には数分かかる場合があります。
403 Forbidden
エラーが表示されない場合は、数秒待ってからもう一度お試しください。予期される結果は
403 Forbidden
エラーです。このエラーが返されれば、アプリケーションは AWS WAF によって保護されています。