cloudformationでEC2インスタンス作成してSSH接続&Webサーバしたいだけなのに、すごく大変だった・・・。
とりあえず、EC2単体で作成
AMI(Amazon Machine Image)とサーバー性能(t2.micro)だけ指定して、ECインスタンスを作ってみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
AWSTemplateFormatVersion: '2010-09-09' Resources: # オレだよオレ、EC2だよ! OreOreEC2: Type: AWS::EC2::Instance Properties: # AWSコンソールからコピペ ImageId: ami-06ad9296e6cf1e3cf # 無料枠で InstanceType: t2.micro Tags: - Key: Name Value: OreOreEC2 |
AWSコンソールで見てみると、パブリックIP有りで起動している!
ブラウザでIPアドレスを叩いても接続出来ない。Webサーバが起動してないからか~。
AWSコンソールからSSH接続しようとしたら警告が出た。
アクセス可能にするためにはポート 22 を開く必要があるため、このインスタンスに接続できない場合があります。現在のセキュリティグループでは、ポート 22 が開いていません。
インスタンスがキーペアに関連付けられていません。
このインスタンスはキーペアに関連付けられていません。キーペアがなければ、SSH 経由でインスタンスに接続できません。
EC2 Instance Connect を使用すれば、有効なユーザー名のみで接続できます。必要なアクセス許可が付与されている場合は、Session Manager を使用して接続できます
接続方法を「スタンドアロン SSH クライアント」から「EC2 Instance Connect (ブラウザベースの SSH 接続) 」に変更したら接続出来たっぽいけど、コンソールに何も表示されない…。
SSH接続したいなら、セキュリティグループ(ファイアウォール)を作ってポート22番を開放しろって事か。
cloudformationでセキュリティグループを作るには、所属元となるVPCが必要みたいだから、VPCも作成する。
EC2作成時に、自作セキュリティグループを指定する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
AWSTemplateFormatVersion: '2010-09-09' Resources: # 自作VPCの名前 OreOreVPC: # VPC作成 Type: AWS::EC2::VPC Properties: # ホスト部は16bit CidrBlock: 10.0.0.0/16 # 名前は必ず付けた方がいい Tags: - Key: Name Value: OreOreVPC # 自作セキュリティグループ OreOreSecurityGroup: Type: "AWS::EC2::SecurityGroup" Properties: GroupDescription: OreOreSecurityGroup # 自作VPC VpcId: !Ref OreOreVPC Tags: - Key: 'Name' Value: 'OreOreSecurityGroup' # 許可するポート設定 SecurityGroupIngress: - IpProtocol: tcp # 全パケット CidrIp: 0.0.0.0/0 FromPort: 22 ToPort: 22 # オレだよオレ、EC2だよ! OreOreEC2: Type: AWS::EC2::Instance Properties: # AWSコンソールからコピペ ImageId: ami-06ad9296e6cf1e3cf # 無料枠で InstanceType: t2.micro # 自作セキュリティグループを指定 SecurityGroupIds: - !GetAtt OreOreSecurityGroup.GroupId Tags: - Key: Name Value: OreOreEC2 |
なんかエラーになった
1 2 3 4 5 6 7 8 |
aws cloudformation deploy --template-file C:\aws\ec2.yaml --stack-name ec2-stack Waiting for changeset to be created.. Waiting for stack create/update to complete Failed to create/update the stack. Run the following command to fetch the list of events leading up to the failure aws cloudformation describe-stack-events --stack-name ec2-stack |
なんかセキュリティグループには、サブネットが必要なようです・・・。
Security group sg-xxxxxxxxxxxxxxxxx and subnet subnet-yyyyyyyy belong to different networks.
しょうがない、サブネットも追加して、EC2に追加だ!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
AWSTemplateFormatVersion: '2010-09-09' Resources: # 自作VPCの名前 OreOreVPC: # VPC作成 Type: AWS::EC2::VPC Properties: # ホスト部は16bit CidrBlock: 10.0.0.0/16 # 名前は必ず付けた方がいい Tags: - Key: Name Value: OreOreVPC # 自作の公開サブネット OreOrePublicSubnet: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref OreOreVPC CidrBlock: '10.0.1.0/24' Tags: - Key: 'Name' Value: 'OreOrePublicSubnet' # 自作セキュリティグループ OreOreSecurityGroup: Type: "AWS::EC2::SecurityGroup" Properties: GroupDescription: OreOreSecurityGroup # 自作VPC VpcId: !Ref OreOreVPC Tags: - Key: 'Name' Value: 'OreOreSecurityGroup' # 許可するポート設定 SecurityGroupIngress: - IpProtocol: tcp # 全パケット CidrIp: 0.0.0.0/0 FromPort: 22 ToPort: 22 # オレだよオレ、EC2だよ! OreOreEC2: Type: AWS::EC2::Instance Properties: # AWSコンソールからコピペ ImageId: ami-06ad9296e6cf1e3cf # 無料枠で InstanceType: t2.micro # 自作セキュリティグループを指定 SecurityGroupIds: - !GetAtt OreOreSecurityGroup.GroupId # サブネット SubnetId: !Ref OreOrePublicSubnet Tags: - Key: Name Value: OreOreEC2 |
これでポート22のエラーは消えた。次は公開鍵か。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
AWSTemplateFormatVersion: '2010-09-09' Parameters: # SSH用キーペアの指定 KeyPair: Description: KeyPair Name Type: AWS::EC2::KeyPair::KeyName Resources: # 自作VPCの名前 OreOreVPC: # VPC作成 Type: AWS::EC2::VPC Properties: # ホスト部は16bit CidrBlock: 10.0.0.0/16 # 名前は必ず付けた方がいい Tags: - Key: Name Value: OreOreVPC # 自作の公開サブネット OreOrePublicSubnet: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref OreOreVPC CidrBlock: '10.0.1.0/24' # 外部のインターネットからアクセスできるか?(グローバルIPを付与するか?) MapPublicIpOnLaunch: 'true' Tags: - Key: 'Name' Value: 'OreOrePublicSubnet' # 自作セキュリティグループ OreOreSecurityGroup: Type: "AWS::EC2::SecurityGroup" Properties: GroupDescription: OreOreSecurityGroup # 自作VPC VpcId: !Ref OreOreVPC Tags: - Key: 'Name' Value: 'OreOreSecurityGroup' # 許可するポート設定 SecurityGroupIngress: - IpProtocol: tcp CidrIp: 0.0.0.0/0 FromPort: 22 ToPort: 22 # オレだよオレ、EC2だよ! OreOreEC2: Type: AWS::EC2::Instance Properties: # AWSコンソールからコピペ ImageId: ami-06ad9296e6cf1e3cf # 無料枠で InstanceType: t2.micro # キーペア KeyName: !Ref KeyPair # 自作セキュリティグループを指定 SecurityGroupIds: - !GetAtt OreOreSecurityGroup.GroupId # サブネット SubnetId: !Ref OreOrePublicSubnet Tags: - Key: Name Value: OreOreEC2 |
ローカルで公開鍵を作成して、パラメータ引数で指定する。 –parameter-overrides KeyPair=ローカルで作成した公開鍵ファイルのパス
1 |
aws cloudformation deploy --template-file C:\aws\ec2.yaml --stack-name ec2-stack --parameter-overrides KeyPair=ローカルで作成した公開鍵ファイルのパス |
コンソールから返事が返ってこない・・・。
「すでにリソースにアタッチされているセキュリティグループの削除」かな? 1時間タイムアウトするまで頑張るらしい。
1 2 3 4 5 6 7 8 9 |
#ctrl+cでコマンドをキャンセル # cloudformationの方はstatus UPDATE_IN_PROGRESSになっているので、それもキャンセル aws cloudformation cancel-update-stack --stack-name ec2-stack # 更新は無理っぽいので、スタックを削除する aws cloudformation delete-stack --stack-name ec2-stack # スタックを1から作り直す aws cloudformation deploy --template-file C:\aws\ec2.yaml --stack-name ec2-stack --parameter-overrides KeyPair=C:\Users\t.suzuki\Dropbox\公開鍵\raspi4\id_ed25519.pub |
う~ん、どうもaws-cliだと途中で止まってしまうので、ブラウザのAWSコンソールから実行してみたらSSH接続できた。
ステップ・バイ・ステップでやってると、なかなか完成しないので、一気に作ってしまおう。
ec2にnginxインストールも、cloudformationで行う。
これでWebサーバの完成!ブラウザからIPで行けた。
1, VPC(Virtual Private Cloud)を作る
2, IGW(Internet GateWay)を作る
3, VPCにIGWをアタッチする
4, ルートテーブルを作る
5, ルータを作る
6, VPCにサブネットを作る
7, サブネットグループを作って、サブネットを所属させる
8 EC2を作る(nginxもインストール)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
AWSTemplateFormatVersion: '2010-09-09' Parameters: # SSH用キーペアの指定 KeyPair: Description: KeyPair Name Type: AWS::EC2::KeyPair::KeyName Resources: # VPCの名前 OreOreVPC: # VPC作成 Type: AWS::EC2::VPC Properties: # ホスト部は16bit CidrBlock: 10.0.0.0/16 Tags: - Key: Name Value: OreOreVPC #名前は必ず付けた方がいい # インターネットとの接続口 OreOreInternetGateway: # InternetGateway作成 Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: OreOreVPC-IGW #名前は必ず付けた方がいい # VPCとIGWを接続 OreOreAttachGateway: # アタッチを行う Type: AWS::EC2::VPCGatewayAttachment Properties: # VPCとIGWを指定 VpcId: !Ref OreOreVPC InternetGatewayId: !Ref OreOreInternetGateway # ルートテーブルは、ポート80のパケットはWebサーバへ!という設定ね OreOreRouteTable: Type: AWS::EC2::RouteTable # DependsOnは必須。無所属のルートテーブルは存在しない DependsOn: OreOreAttachGateway Properties: VpcId: !Ref OreOreVPC Tags: - Key: Name Value: OreOreVPC-Route # 実際にルーティング処理をするルート OreOreRoute: Type: AWS::EC2::Route DependsOn: OreOreAttachGateway Properties: # 設定したルートテーブル RouteTableId: !Ref OreOreRouteTable # 全てのIPに適応 DestinationCidrBlock: 0.0.0.0/0 # IGWも指定 GatewayId: !Ref OreOreInternetGateway # VPC内に新しいサブネットを作成 Subnet: Type: AWS::EC2::Subnet DependsOn: OreOreAttachGateway Properties: # ホスト部を指定(1バイト) CidrBlock: 10.0.1.0/24 # 外部のインターネットからアクセスできるか?(グローバルIPを付与するか?) MapPublicIpOnLaunch: 'true' VpcId: !Ref OreOreVPC Tags: - Key: Name Value: OreOreVPC-Subnet # サブネットにもルーティングを適用 OreOreSubnetRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref Subnet RouteTableId: !Ref OreOreRouteTable # 自作セキュリティグループ OreOreSecurityGroup: Type: "AWS::EC2::SecurityGroup" Properties: GroupDescription: OreOreSecurityGroup # 自作VPC VpcId: !Ref OreOreVPC Tags: - Key: 'Name' Value: 'OreOreSecurityGroup' # 許可するポート設定 SecurityGroupIngress: - IpProtocol: tcp CidrIp: 0.0.0.0/0 FromPort: 22 ToPort: 22 - IpProtocol: tcp CidrIp: 0.0.0.0/0 FromPort: 80 ToPort: 80 # オレだよオレ、EC2だよ! OreOreEC2: Type: AWS::EC2::Instance Properties: # AWSコンソールからコピペ ImageId: ami-06ad9296e6cf1e3cf # 無料枠で InstanceType: t2.micro # キーペア KeyName: !Ref KeyPair # 自作セキュリティグループを指定 SecurityGroupIds: - !GetAtt OreOreSecurityGroup.GroupId # サブネット SubnetId: !Ref Subnet # nginxのインストール UserData: Fn::Base64: | #!/bin/bash sudo amazon-linux-extras install -y nginx1.12 sudo systemctl start nginx.service Tags: - Key: Name Value: OreOreEC2 |