web-dev-qa-db-ja.com

CloudformationテンプレートでVPCの自動スケーリンググループにEIPを割り当てる方法

予約済みのElasticIP(ec2 classic ip)の1つをVPCのAutoscalingグループに割り当てたい。 AWS Cliを使用して、ipをvpcに移動しました。

$ aws ec2 move-address-to-vpc --public-ip 23.23.23.23

そして、aws concoleで、このIPがVPCに渡されたことがわかりました。リソースのCloudformationテンプレートのAutoscalingGroupのタグに割り当てられています:

"Process": {
        "Type" : "AWS::AutoScaling::AutoScalingGroup",
        "Properties": {
            "LaunchConfigurationName": {"Ref": "PreprocessorLC"},
            "LoadBalancerNames": [{"Ref": "ProcessELB"}],
            "VPCZoneIdentifier" : [{ "Fn::Join" : [",", [ { "Ref" : "PublicSubnet1"}, { "Ref" : "PublicSubnet2"} ]]}],
            "AvailabilityZones": {"Ref": "AZs"},
            "MinSize" : "1",
            "MaxSize" : "1",
            "HealthCheckGracePeriod": 300,
            "Tags" : [
                {"Key": "Name", "Value": {"Fn::Join": ["", [{"Ref": "Env"}, "-Process"]]}, "PropagateAtLaunch": true},
                {"Key": "WorkersScalingGroup", "Value": {"Fn::Join": ["", ["Offering-", {"Ref": "Env"},  "-Process-Worker"]]}, "PropagateAtLaunch": true},
                {"Key": "EIP", "Value": {"Ref": "ProcessIP"}, "PropagateAtLaunch": true},
                {"Key": "Environment", "Value": {"Ref": "Env"}, "PropagateAtLaunch": true}
            ]
        }
    }

そしてパラメータの「ProcessIP」の付加価値:

"ProcessIP":{
            "Description": "DEV: 23.23.23.23",
            "Type": "String",
            "Default": "23.23.23.23",
            "AllowedValues": ["23.23.23.23"]
}

そして、それは機能しませんでした。それでもランダムIPを取得します。誰かが私がどこが間違っているのか、それを機能させるために何を追加する必要があるのか​​を知ることができたら?

ありがとう!

7
muzafarow

簡単なbashスクリプトは次のとおりです。

#!/bin/sh
# Region in Which instance is running
EC2_REGION='us-east-1'
AWS_ACCESS_KEY='xxxxxxxxxxxx'
AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

#Instance ID captured through Instance meta data
InstanceID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`

#Elastic IP captured through the EIP instance tag
Elastic_IP=`/opt/aws/apitools/ec2/bin/ec2-describe-tags -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --filter resource-id=$InstanceID --filter key='EIP' | cut -f5`
Allocate_ID=`/opt/aws/apitools/ec2/bin/ec2-describe-tags -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --filter resource-id=$InstanceID --filter key="AllocationID" | cut -f5`

#Assigning Elastic IP to Instance
aws ec2 associate-address --instance-id $InstanceID --allocation-id $Allocate_ID
9
muzafarow

私の場合、割り当てられていないEIPのバンクを保持し、起動時にEC2にランダムに割り当てる必要がありました。そうすれば、サーバーが他の場所でホワイトリストに登録できる特定のIPリストを使用することを常に知っています。

「prod-pool」という名前のEIPを複数作成する場合は、このスクリプトを使用できます。

apt install -y jq awscli
ALLOCATION_ID=`aws ec2 describe-addresses --filters="Name=tag:Name,Values=prod-pool" | jq -r '.Addresses[] | "\(.InstanceId) \(.AllocationId)"' | grep null | awk '{print $2}' | xargs shuf -n1 -e`

if [ ! -z $ALLOCATION_ID ]; then
    aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOCATION_ID --allow-reassociation
fi

このポリシーをIAMユーザーに添付できます

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowEIPAttachment",
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Action": [
        "ec2:AssociateAddress",
        "ec2:DisassociateAddress"
      ]
    }
  ]
}
9
Steve Robbins

ElasticIPアドレスを目的のEC2インスタンスに明示的に関連付ける必要があります。これは、起動時にuserdataスクリプトで実行するか、他のスクリプトまたは構成管理を介して外部で実行できます。

PropagateAtLaunchは、AutoScalingグループからAutoScalingアクションの結果として起動されたインスタンスにタグを伝播するだけです。タグ付けされたElasticIPアドレスが起動されたインスタンスに関連付けられるような魔法を私は知りません。

EIPを使用した起動時スクリプトの詳細な説明と例を参照してください ここ

2
jarmod

プールから自動スケーリンググループのインスタンスにElasticIPアドレスを自動的にバインドするAWSLambda関数を作成しました。これにより、インスタンスのブートスクリプトでEIPアドレスを取得する必要がなくなります。完全な説明については、チェックアウトしてください https://binx.io/blog/2019/09/02/how-to-dynamically-bind-elastic-ip-addresses-to-an-auto-scaling-group/

0