EKS ALB Ingressのための設定（忘備録）

# サブネット
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/alb-ingress.html

-  Public サブネットは下記のようにタグを設定すること
```
Key: kubernetes.io/cluster/<クラスタ名>
Value: owned

Key: kubernetes.io/role/elb
Value: 1
```


- Private サブネットは下記のように設定すること
```
Key: kubernetes.io/role/internal-elb
Value: 1
```


---
# IngressのYamlファイル
## 概要
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/aws-load-balancer-controller.html

- 上記の手順を通して、`Helm`で`aws-load-balancer-controller`を導入し、Ingressを作成すると、ALBが作成される
> 最初はserviceaccountが存在しないので、手順の中にある`--set serviceAccount.create=false` を`true`に設定してた

- ALBの設定を`annotations`で設定する
- annotationに関する説明

https://stackoverflow.com/questions/72879630/eks-alb-not-attached-to-the-ingres-with-service-type-clusterip-and-target-type

## 手順
Step1. Ingress.yamlファイルを作成すること
```ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: eks-ingress
  namespace: eks
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: instance
    alb.ingress.kubernetes.io/security-groups: sg-00000000000000000 # Clusterのセキュリティグループを指定すること
spec:
  ingressClassName: alb
  rules:
  - host: xxxxxxxxxxxxx.xxxxxxxxxxxx.xxxxxx # Route53のAレコード名を入れること
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: (service-name)
            port:
              number: 80
```

Step2. ingressを適応すること
```
kubectl apply -f ./ingress.yaml
```


Step3. AWS画面でALBが作成されることを確認
> 作成されてなかった場合、`aws-load-balancer-controller`Podのログを確認すること

Step4. Route53周りを対応する（ホスト、DNS、ACM、CNAME）など
> Aレコード名を指定するときがあるが、`ingress.yaml`の`host`欄を入れる。この場合は（xxxxxxxxxxxxx.xxxxxxxxxxxx.xxxxxx）を入れる


Step5. Ingress設定を修正する
```
kubectl edit ingress eks-ingress -n eks
```

```(修正前)ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: eks-ingress
  namespace: eks
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: instance
    alb.ingress.kubernetes.io/security-groups: sg-00000000000000000 # Clusterのセキュリティグループを指定すること
spec:
  ingressClassName: alb
  rules:
  - host: xxxxxxxxxxxxx.xxxxxxxxxxxx.xxxxxx # Route53のホスト名を入れること
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: (service-name)
            port:
              number: 80
```


```(修正後)ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: eks-ingress
  namespace: eks
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: instance

## 修正箇所
    alb.ingress.kubernetes.io/security-groups: sg-00000000000000000 # Clusterのセキュリティグループを指定すること
　　　　　　　　alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/actions.redirect-to-https: |
      {"Type":"redirect","RedirectConfig":{"Port":"443","Protocol":"HTTPS","StatusCode":"HTTP_302"}}
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:000000000000:certificate/00000000-0000-0000-0000-000000000000 # ACMの証明書のARNを入れること
## 修正箇所

spec:
  ingressClassName: alb
  rules:
  - host: xxxxxxxxxxxxx.xxxxxxxxxxxx.xxxxxx # Route53のホスト名を入れること
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: (service-name)
            port:
              number: 80
```
修正を完成する
```
:wq!
```

Step6. ALBのリスナーとルール欄にPort443が開放されていることを確認する

Step7. レコードが登録するまで数分待って、Aレコードの`xxxxxxxxxxxxx.xxxxxxxxxxxx.xxxxxx`でアクセスしてみる