開発日誌
更新日 (2021/09/06)
Autoscaling起動時にEIPをアタッチさせる
 外部APIとの接続があるときautoscalingで起動されたec2にも固定IPをつけたくなることがあると思います。その場合はNATゲートウェイを使うのがベストプラクティスだそうです。しかし、NATゲートウェイは意外と料金が高くつくので今回はEIPをAutoscaling時に自動でアタッチさせる方法を試してみます。 

実装手順

  1.  1. アタッチさせるEIPを事前にプールしておく
  2.  2. IAMポリシーの作成
  3.  3. シェルスクリプトの設定
 
  1. 1. アタッチさせるEIPを事前にプールしておく
    今回はこちらのIPを使っていきます。概要欄に割り当てIDが表示されているのでコピーしておきます。
  1. 2. IAMポリシーの作成
   EC2 APIの多くはリソースレベルでのアクセス許可制限が可能ですがすべてのEC2アクションでリソースを指定できるわけではないそうです。そして今回のアクションがリソースレベルのアクセス許可がサポートされていないアクションだそうです。。。       スクリプトを貼り付けて実行するだけでは権限が足りないようでこんなエラーが出ます。
An error occurred (UnauthorizedOperation) when calling the DescribeAddresses operation: You are not authorized to perform this operation.
{
    "Version": "2012-10-17",
    "Statement": [
        {
           "Sid": "ec2eip",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateImage",
                "ec2:CreateSnapshot",
                "ec2:Describe*",
                "ec2:DescribeInstances",
                "ec2:DescribeAddresses",
                "ec2:AssociateAddress"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "ec2",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1::instance/"
            ]
        }
    ]
}
なのでAutoscalingのEC2にアタッチするポリシーを作る必要があります。ポリシーを作成してAutoscalingで利用するロールにアタッチします。  
  1. 3. シェルスクリプトの設定
 インスタンスの起動時にスクリプトを実行させるためユーザーデータの設定に下記のコードを設定します。
    ・ Autoscaling起動設定の作成 ->追加設定 -> ユーザーデータ
#!/bin/bash

yum install jq -y

# EIPの割り当てID
eip_alloc_ids="eipalloc-07fad2290f8915762"
export AWS_DEFAULT_REGION=ap-northeast-1 instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

available_alloc_id=$(aws ec2 describe-addresses --allocation-ids ${eip_alloc_ids} | jq -r '[.Addresses[] | select(.InstanceId == null)][0] | .AllocationId')

echo $available_alloc_id

aws ec2 associate-address --instance-id ${instance_id} --allocation-id ${available_alloc_id}
■まとめ
 今回はAutoscaling起動時のec2のIPを固定化するためにEIPをアタッチさせました。EIPは月に300円程度なのでNatゲートウェイを使うよりも安く収まります。しかし、Natゲートウェイを利用したほうがec2をプライベートサブネットに置くことができるなどのメリットがあるのでNatゲートウェイの利用をおすすめします。

■参考
https://aws.amazon.com/jp/blogs/security/demystifying-ec2-resource-level-permissions/?nc1=h_ls
https://dev.classmethod.jp/articles/choose-eip-from-addresspool/