やりたいこと
開発環境なので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 アドレスが登録され、開発環境でのアクセス制限が適切に行われるようになります。