AWSマーケットプレイスでのイメージ検索

AMI( HDDイメージのようなもの )の選択

AMIの選択はEC2を起動する際やここから検索できる ただ検索できた方が、なにかと自動化しやすい( わざわざブラウザで開かなくて良い )ので方法を残す

例えばAMI名に『KUSANAGI』を含むAMIを検索する場合

aws ec2 describe-images \
  --region ap-northeast-1 \
  --owners 'aws-marketplace' \
  --filters --filters 'Name=name,Values=*KUSANAGI*'

例えば Amazon Linux 2 の最新AMI IDが欲しい場合

aws ec2 describe-images \
       --region ap-northeast-1 \
       --query 'sort_by(Images, &CreationDate)[-1]' \
       --owners amazon \
       --filters 'Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2' | jq -r '.ImageId'

プロダクトコード、オーナーで検索する場合

「あるオーナーの更に、プロダクトごとに絞り込みたい」ようなケース。

オーナーは、大雑把にいうと「Amazonが所有者のもの( amazon )」と「それ以外( aws-marketplace )」な区分がある。

owners 分類
amazon アマゾンのオフィシャルAMI
aws-marketplace マーケットプレイスで公開されているイメージ郡( CentOSやkusanagiなど様々なディストリビューションがある )
099720109477 Ubuntu

プロダクトコードは、ある所有者のいくつかあるプロダクトのうち、一つに絞る、ようなケースで利用する。

product-code プロダクト名
f18wc0igqjhsxwoxouogwqb8m kusanagi 無料のイメージ
aws ec2 describe-images \
  --region ap-northeast-1 \
  --owners 'aws-marketplace'\
   --filters 'Name=product-code,Values=f18wc0igqjhsxwoxouogwqb8m'

プロダクトコードで絞り更に日付が一番あたらしいもの、ひとつだけ。

kusanagi の例

aws ec2 describe-images \
  --region ap-northeast-1 \
  --owners 'aws-marketplace' \
  --query 'sort_by(Images, &CreationDate)[-1].[ImageId]' \
  --filters 'Name=product-code,Values=f18wc0igqjhsxwoxouogwqb8m' \
  --output 'text'

ubuntu 18.04 の例( 必要なバージョンは異なる場合がある )

aws ec2 describe-images \
  --region ap-northeast-1 \
  --owners 099720109477 \
  --query 'sort_by(Images, &CreationDate)[-1].[ImageId]' \
  --filters 'Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*' \
  --output 'text'

EC2 セットアップ

下記はKusanagiでの例

  • ネットワーク: vpc-
  • サブネット: private と名前がついているどれか
  • 自動パブリックアドレス: サブネット設定を使用( 無効 ) <- 外部からダイレクトにアクセスする場合はパブリックアドレスをつけると良いが、セキュリティホールが増える側面もある
  • IAMロール: webfront
  • ストレージ: 扱うコンテンツによるが30GB程度
  • ステップ 6: セキュリティグループの設定: 既存の設定を利用する -> webfront

下記にAWS CLI での起動例をあげる。オプションで都度、検討するのは –tag-specifications インスタンス名は都度、変更する –instance-type は t2.medium にしているが変更しても良い( 起動後に要件に応じて変更した方が良いかも ) あたりは変更する。

ネットワーク環境は全く異なるので、それぞれに

  • –subnet-id
  • –security-group-ids は変えて実行する必要がある。 下記にサンプルを示す。

※ また『wordpress-test』、EC2のインスタンス名につけるタグ名は、ホスト名やサービス内容など何のサービスなのかつける事。

※ 出力されるIPアドレス、インスタンスIDは後ほど「sshログインの設定」と「ロードバランサーのターゲットグループへの追加」のために必要なのでメモしておくこと

EC2でKusanagiを起動する

aws ec2 run-instances \
--count 1 \
--key-name test-key \
--subnet-id subnet- \
--security-group-ids sg- \
--instance-type t2.medium \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=インスタンス名}]' \
--image-id $(aws ec2 describe-images --region ap-northeast-1 --owners 'aws-marketplace' --filters --filters 'Name=product-code,Values=f18wc0igqjhsxwoxouogwqb8m' --query 'sort_by(Images, &CreationDate)[-1].[ImageId]' --output 'text') \
| jq '.Instances[0] | {IpAddress: .NetworkInterfaces[0].PrivateIpAddress, InstanceId: .InstanceId}'
スポットフリートで起動

下記のようなjsonを用意する必要がある。

{
    "TargetCapacity": 1,
    "SpotPrice": "0.0035",
    "IamFleetRole": "arn:aws:iam::1234567890:role/ARN情報",
    "LaunchSpecifications": [
        {
            "ImageId": "ami-393c1957",
            "KeyName": "your key name", #ある場合
            "SecurityGroups": [
              { "GroupId":"セキュリティグループId"} #セキュリティグループに入れたい場合
            ],
            "InstanceType": "t1.micro"
        }
    ]
}

参考: joコマンドで自動生成する場合、検証目的でスポットフリートの t2.medium で Kusanagiを起動する』というケース サブネットやセキュリティグループは既存のもので置き換える必要があります。

jo \
  TargetCapacity=1 \
  -s SpotPrice=0.1 \
  IamFleetRole="arn:aws:iam::1111111:role/aws-ec2-spot-fleet-tagging-role" \
  LaunchSpecifications=$(
    jo -a $(
      jo \
        ImageId=ami-0f4cb688000b98d89 \
        KeyName=test-dockers \
        SecurityGroups=$( \
          jo -a $( \
            jo \
              GroupId=sg- \
          ) \
        ) \
        InstanceType=t2.medium \
        SubnetId=subnet- \
        TagSpecifications=$( \
          jo -a $( \
            jo \
              ResourceType="instance" \
              Tags=$( \
                jo -a $( \
                  jo \
                    Key=Name \
                    Value=Kusanagi-test \
                  ) \
              ) \
          ) \
        ) \
    ) \
  ) \
            | jq . > spot.json

上記のように spot.json を作成し、下記のようにしてスポットリクエストをする

aws ec2 request-spot-fleet --spot-fleet-request-config file://spot.json --region ap-northeast-1

参考

User
CloudFront
ALB
EC2
RDS