0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Github Actions + AWS CLIでCDしたECSタスクのIPアドレスをWAF IPsetに登録する

Posted at

やりたいこと

開発環境なのでwafを設定している。
ただし一部spaなのでデプロイしたIPでは許可してやりたい

結論

CLUSTER="XXX_CLUSTER_NAME"
SERVICE="XXX_SERVICE_NAME"
IPSET="XXX_IPSET_NAME"

IPS=$(aws ecs list-tasks --cluster $CLUSTER --service $SERVICE --query 'taskArns' --output text | \
           xargs aws ecs describe-tasks --cluster $CLUSTER --query 'tasks[*].attachments[0].details[?name==`networkInterfaceId`].value' --output text --tasks | \
           xargs aws ec2 describe-network-interfaces --query 'NetworkInterfaces[*].Association.PublicIp' --output text --network-interface-ids | \
           awk '{print $1"/32"}')
IP_SET=$(aws wafv2 list-ip-sets --scope CLOUDFRONT --region=us-east-1 --query "IPSets[?Name=='$IPSET'][].{Id:Id,LockToken:LockToken}" --output json)
IP_SET_ID=$(echo "${IP_SET}" | jq -r '.[0].Id')
LOCK_TOKEN=$(echo "${IP_SET}" | jq -r '.[0].LockToken')
aws wafv2 update-ip-set --name $IPSET --scope CLOUDFRONT --region=us-east-1 --id "$IP_SET_ID" --addresses "$IPS" --lock-token "$LOCK_TOKEN"

解説

分けて考える。

IPSの箇所は以下の4つのコマンドに分けられる。

# ①
aws ecs list-tasks --cluster $CLUSTER --service $SERVICE --query 'taskArns' --output text
# ②
xargs aws ecs describe-tasks --cluster $CLUSTER --query 'tasks[*].attachments[0].details[?name==`networkInterfaceId`].value' --output text --tasks
# ③
xargs aws ec2 describe-network-interfaces --query 'NetworkInterfaces[*].Association.PublicIp' --output text --network-interface-ids
# ④
awk '{print $1"/32"}'

それぞれ解説すると
①: ECSクラスターとサービスからタスクARNの一覧を取得する
②: タスクARNからネットワークインターフェースIDの一覧を取得する
③: ネットワークインターフェースIDからパブリックIPアドレスの一覧を取得する
④: 取得したパブリックIPアドレスに"/32"を追加し、CIDR形式に変換する

そうして最終的に出力される④の結果をIPSの変数に入れている。

以下のコマンドについて解説を行います。

# ⑤
IP_SET=$(aws wafv2 list-ip-sets --scope CLOUDFRONT --region=us-east-1 --query "IPSets[?Name=='$IPSET'][].{Id:Id,LockToken:LockToken}" --output json)
# ⑥
IP_SET_ID=$(echo "${IP_SET}" | jq -r '.[0].Id')
# ⑦
LOCK_TOKEN=$(echo "${IP_SET}" | jq -r '.[0].LockToken')
# ⑧
aws wafv2 update-ip-set --name $IPSET --scope CLOUDFRONT --region=us-east-1 --id "$IP_SET_ID" --addresses "$IPS" --lock-token "$LOCK_TOKEN"

⑤: AWS WAF v2 の list-ip-sets コマンドを使って、指定した IP セット名 (IPSET) を持つ IP セットの情報を取得します。スコープは CLOUDFRONT、リージョンは us-east-1 に設定されています。結果は JSON 形式で取得され、Id と LockToken のみが抽出されます。

⑥: 取得した IP_SET の JSON から、jq コマンドを使って IP セットの ID を抽出します。

⑦: 同様に、取得した IP_SET の JSON から、jq コマンドを使って IP セットの LockToken を抽出します。

⑧: aws wafv2 update-ip-set コマンドを使って、指定した IP セット名 (IPSET)、スコープ (CLOUDFRONT)、リージョン (us-east-1)、IP セット ID (IP_SET_ID)、IP アドレス (IPS)、およびロックトークン (LOCK_TOKEN) を使用して IP セットを更新します。

これらのコマンドを実行することで、AWS WAF の IP セットに ECS タスクの IP アドレスが登録され、開発環境でのアクセス制限が適切に行われるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?