へっぽこエンジニアの覚え書き

主に、バッチとTeraTermマクロのことについて書きます。

VMWareWorkstationのネットワーク設定

OSをインストールするたびにネットワーク設定に時間がかかるので備忘のために残します。

※OSのインストールは完了していることが前提。

 

nmcli con mod ens33 connection.autoconnect "yes"

結局、↑をすればとりあえずローカルPCからSSHできるようになった。

IPはブリッジにしてルータからもらってる感じ?よくわかってません。

とりあえず、繋がったのでよかった。

 

ただ、今回はなぜかGUIでインストールされたので、それを下のコマンドで永続的にCUIで起動するようにした。
# systemctl set-default multi-user.target

f:id:gbsdjpagiefuihzds:20210112090449p:plain

環境設定1

f:id:gbsdjpagiefuihzds:20210112090649p:plain

環境設定2

 

IEセキュリティ構成の強化をPowerShellで無効にする

IEセキュリティがヤバいくらいにうっとおしいのでPowerShellで無効化する方法を探したけど見つからなかったのでメモ

function Disable-IEESC
{
$admin = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}"
$user = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}"
Set-ItemProperty -Path $admin -Name "IsInstalled" -Value 0 -Force
Set-ItemProperty -Path $user -Name "IsInstalled" -Value 0 -Force
Remove-ItemProperty -Path $admin -Name "IsInstalled" -Force
Remove-ItemProperty -Path $user -Name "IsInstalled" -Force
}
Disable-IEESC

AWS CloudFormationを部品ごとに構成できるようにテンプレートを書いた

CloudFormationはとっても便利なのですが、VPCからインスタンスまで一つのテンプレート内に書くと、構成がしっかり決まっている場合は問題ないのですが、後から構成を変える場合にはいったん全部消えてしまうことがあり融通がきかない面があります。

そういった場合のためにテンンプレートを部品ごとに分割して、あとから構成を変更、インスタンスの追加などを行えるようなテンプレートを書きました。

#########################################################
# ここで分割
#########################################################
AWSTemplateFormatVersion'2010-09-09'
Parameters:
  Prefix:
    TypeString
    Description"A prefix that does not conflict with other instances when multiple instances are launched"
  VPCCidr:
    TypeString
    DescriptionIP Address range for the VPN connected VPC
    ConstraintDescriptionmust be a valid IP CIDR range of the form x.x.x.x/x.
    MinLength9
    MaxLength18
    Default10.0.0.0/16
    AllowedPattern(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
Resources:
  MainVpc:
    Type'AWS::EC2::VPC'
    Properties:
      CidrBlock!Ref VPCCidr
      Tags:
        - Key'Name'
          Value!Sub ${Prefix}-main-vpc
  MainInetGateway:
    Type'AWS::EC2::InternetGateway'
    Properties:
      Tags:
      - Key'Name'
        Value!Sub ${Prefix}-main-igw
  MainVpcGatewayAttachment:
    Type'AWS::EC2::VPCGatewayAttachment'
    Properties:
      InternetGatewayId!Ref MainInetGateway
      VpcId!Ref MainVpc
Outputs:
  VPCCidr:
    Value!Ref VPCCidr
    Export:
      Name'VPCCidr'
  MainVpc:
    Value!Ref MainVpc
    Export:
      Name'main-vpc-id'
  MainInetGateway:
    Value!Ref MainInetGateway
    Export:
      Name'main-igw-id'
#########################################################
# 分割
#########################################################
AWSTemplateFormatVersion'2010-09-09'
Parameters:
  Prefix:
    TypeString
    Description"A prefix that does not conflict with other instances when multiple instances are launched"
  SubnetCidr:
    TypeString
    DescriptionSubnetCidr
    ConstraintDescriptionmust be a valid IP CIDR range of the form x.x.x.x/x.
    MinLength9
    MaxLength18
    Default10.0.1.0/24
    AllowedPattern(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
Resources:
  PublicSubnet:
    Type'AWS::EC2::Subnet'
    Properties:
      CidrBlock!Ref SubnetCidr
      MapPublicIpOnLaunchtrue
      VpcId: {'Fn::ImportValue''main-vpc-id'}
      Tags:
        - Key'Name'
          Value!Sub ${Prefix}-public-subnet
  PublicRouteTable:
    Type'AWS::EC2::RouteTable'
    Properties:
      VpcId: {'Fn::ImportValue''main-vpc-id'}
      Tags:
        - Key'Name'
          Value!Sub ${Prefix}-public-rtb
  PublicDefaultRoute:
    Type'AWS::EC2::Route'
    Properties:
      RouteTableId!Ref PublicRouteTable
      DestinationCidrBlock0.0.0.0/0
      GatewayId: {'Fn::ImportValue''main-igw-id'}
  PublicSubnetRouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref PublicSubnet
      RouteTableId!Ref PublicRouteTable
Outputs:
  SubnetCidr:
    Value!Ref SubnetCidr
    Export:
      Name'SubnetCidr'
  PublicSubnet:
    Value!Ref PublicSubnet
    Export:
      Name!Sub 'public-subnet-id'
#########################################################
# 分割
#########################################################
AWSTemplateFormatVersion'2010-09-09'
Parameters:
  Prefix:
    TypeString
    Description"A prefix that does not conflict with other instances when multiple instances are launched"
Resources:
  PublicSecurityGroupWin:
    Type"AWS::EC2::SecurityGroup"
    Properties:
      GroupNamepublic-sg-Win
      GroupDescription"SecurityGroup for Public EC2 Linux"
      SecurityGroupIngress:
      - IpProtocoltcp
        FromPort'3389'
        ToPort'3389'
        CidrIp0.0.0.0/0
      Tags:
        - Key'Name'
          Value!Sub ${Prefix}-public-sg
      VpcId: {'Fn::ImportValue''main-vpc-id'}
  PublicSecurityGroupLinux:
    Type"AWS::EC2::SecurityGroup"
    Properties:
      GroupNamepublic-sg-Linux
      GroupDescription"SecurityGroup for Public EC2 Windows"
      SecurityGroupIngress:
      - IpProtocoltcp
        FromPort'80'
        ToPort'80'
        CidrIp0.0.0.0/0
      - IpProtocoltcp
        FromPort'22'
        ToPort'22'
        CidrIp0.0.0.0/0
      Tags:
        - KeyName
          Value!Sub ${Prefix}-public-sg
      VpcId: {'Fn::ImportValue''main-vpc-id'}
Outputs:
  PublicSecurityGroupWin:
    Value!Ref PublicSecurityGroupWin
    Export:
      Name!Sub 'PublicSecurityGroupWin-id'
  PublicSecurityGroupLinux:
    Value!Ref PublicSecurityGroupLinux
    Export:
      Name!Sub 'PublicSecurityGroupLinux-id'
#########################################################
# 分割
#########################################################
AWSTemplateFormatVersion'2010-09-09'
Parameters:
  Ec2KeyName:
    Type'AWS::EC2::KeyPair::KeyName'
  WindowsLatestAmi:
    Type : AWS::SSM::Parameter::Value<String>
    AllowedValues: ["/aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base""/aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base"]
    Default"/aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base"
    Description'Select Windows Server 2016 or 2019'
  InstanceType:
    TypeString
    AllowedValues: ["t2.nano""t2.micro""t2.small""t2.medium""t2.large""t2.xlarge""t2.2xlarge"]
    Default"t2.micro"
    Description'Select InstanceType'
  Prefix:
    TypeString
    Description"A prefix that does not conflict with other instances when multiple instances are launched"
  PrivateIpAddress:
    TypeString
    DescriptionPrivateIpAddress x.x.x.x
    ConstraintDescriptionmust be a valid IP CIDR range of the form x.x.x.x
    MinLength9
    MaxLength18
    Default10.0.1.10
    AllowedPattern(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})
  Hostname:
    TypeString
    Description"Input Hostname"
Resources:
  EC2Win:
    Type'AWS::EC2::Instance'
    Properties:
      ImageId!Ref WindowsLatestAmi
      InstanceType!Ref InstanceType
      KeyName!Ref Ec2KeyName
      SubnetId!ImportValue public-subnet-id
      PrivateIpAddress!Ref PrivateIpAddress
      SecurityGroupIds: [ !ImportValue PublicSecurityGroupWin-id ]
      UserData:
        Fn::Base64!Sub |
          <powershell>
          # disabled IEenhanced security
          $AdminPath = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}"
          $UserPath = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}"
          $AdminPath, $UserPath | % { Set-ItemProperty -Path $_ -Name "IsInstalled" -Value 0 }
          Stop-Process -Name Explorer

          # set JST TimeZone
          tzutil /s "Tokyo Standard Time"
          Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\TimeZoneInformation" -Name "RealTimeIsUniversal" -Value 1

          # disabled firewall
          Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled false

          # show fileext and hidden file
          Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "HideFileExt" -Value 0
          Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "Hidden" -Value 1

          # set high performance
          powercfg.exe -SETACTIVE 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
          
          # Set Hostname
          !Ref Rename-Computer -NewName ${Hostname} -Force
          </powershell>
      Tags:
        - Key'Name'
          Value!Sub ${Prefix}-EC2Win

#########################################################
# 分割
#########################################################
AWSTemplateFormatVersion'2010-09-09'
Parameters:
  Prefix:
    TypeString
    Description"A prefix that does not conflict with other instances when multiple instances are launched"
    
Parameters:
  Ec2KeyName:
    Type'AWS::EC2::KeyPair::KeyName'
    Description'Select KeyPair'
  LinuxLatestAmi:
    TypeAWS::SSM::Parameter::Value<String>
    Default"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    Description'Latest Amazon Linux 2 Version'
  InstanceType:
    TypeString
    AllowedValues: ["t2.nano""t2.micro""t2.small""t2.medium""t2.large""t2.xlarge""t2.2xlarge"]
    Default"t2.micro"
    Description'Select InstanceType'
  Prefix:
    TypeString
    Description"A prefix that does not conflict with other instances when multiple instances are launched"
  PrivateIpAddress:
    TypeString
    DescriptionPrivateIpAddress x.x.x.x
    ConstraintDescriptionmust be a valid IP CIDR range of the form x.x.x.x
    MinLength9
    MaxLength18
    Default10.0.1.30
    AllowedPattern(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})
Resources:
  EC2Linux:
    Type'AWS::EC2::Instance'
    Properties:
      ImageId!Ref LinuxLatestAmi
      InstanceType!Ref InstanceType
      KeyName!Ref Ec2KeyName
      SubnetId!ImportValue public-subnet-id
      PrivateIpAddress!Ref PrivateIpAddress
      SecurityGroupIds: [ !ImportValue PublicSecurityGroupLinux-id ]
      UserData!Base64 |
            #!/bin/bash -ex
            sudo su -
            yum -y update
            yum -y install httpd
            systemctl start httpd
            systemctl status httpd
            systemctl enable httpd
      Tags:
        - Key'Name'
          Value!Sub ${Prefix}-EC2Linux
 

Visual Studio Code の拡張機能を作ったので自分用メモ

Azure DevOpsでアカウントを作る

ScopesはFull Accessを設定する
OrganizationはAll accessible organizationsを設定する
アクセストークン(パスワード?)がとても大事なのでどこかにメモっておく

 

vsceをインストール
npm install -g vsce

Publisherの設定
この途中で、さっきメモしたアクセストークンを聞かれるので以下で入力
vsce create-publisher Publisher名
vsce login Publisher名

Marketplaceに登録するには以下のファイルが必要です。
アイコン
package.json
README.md
LICENSE.md

ライセンスは↓をコピペして同じフォルダに入れておけばOK
[year] と[fullname]を書き換える
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ここから:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
MIT License

Copyright (c) [year] [fullname]

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ここまで:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

package.jsonには最低以下の内容を追記する必要があります。
私はアイコンはなくてもいけてしまいましたが・・・。
"publisher": "Publisher名",
"icon": "アイコン画像.png",
アイコンは128X128pixels

f:id:gbsdjpagiefuihzds:20200618144545p:plain

iconsize

https://code.visualstudio.com/api/references/extension-manifest

 

そして公開
以下のコマンドで公開できます。
vsce publish

のですが、すぐに微々たる誤りを見つけてしまい更新しようとvsce publishコマンドを実行しましたが

f:id:gbsdjpagiefuihzds:20200618144758p:plain

というエラーが発生。
検索するとプロキシのエラーとのこと。
私の環境にプロキシは入っていないので全くわからず2日費やしてしまいました。

答えは↓の通り

f:id:gbsdjpagiefuihzds:20200618144933p:plain

publishだけでなくバージョン番号も入れてあげる必要がありました。
つまり
vsce publish 0.0.6
とかやってあげないと、意味不明のエラーになりはまります。

追記
vsce publish 0.0.6
と書きましたが、もっと便利な方法がありましたので書いておきます。
バージョン番号は左からmajor、minor、patchという順番になっており
上の例でいうと、0(major).0(minor).6(patch)となります。
実際にアップデートするときは
vsce publish patch
とすれば、上の例では0.0.7に勝手にバージョンアップしてくれます。
便利です。

色々な方がvsce publishを紹介されているのですが、後ろにverNoまで付けて紹介されている方がおられなかったので大ハマリしました。
バージョンは前回と同じだとエラーになるので、package.json内のversionに合わせてください。

ついでに
Manage Publishers & Extensionsページに手動アップロードするときも↓の【+ New extension】を押してバージョンアップすると

f:id:gbsdjpagiefuihzds:20200618145219p:plain

以下のようなエラーになります。

f:id:gbsdjpagiefuihzds:20200618145508p:plain

already exists なのでバージョンが誤ってるのか?とこちらも半日ほど悩みました。

ちなみに手動バージョンアップの正解の方法ですが、

f:id:gbsdjpagiefuihzds:20200618152523p:plain

ここを選択してUpdateを選択する必要があります。
どちらも、エラーメッセージが不親切です。
私のようにハマった方のお役に立てれば幸いです。

 

 

OutlookでVBA

Option Explicit

Sub houkoku_mail()

Dim OL As Outlook.Application
Dim ML As Outlook.MailItem

Set OL = CreateObject("Outlook.Application")
Set ML = OL.CreateItem(olMailItem)
ML.To = "butyo@kaisya.com" 'To
ML.CC = "syatyo@kaisya.com" 'CC
ML.BCC = "jibun@kaisya.com" 'BCC
ML.Subject = "ご報告" '件名

ML.Body = "お疲れ様です。" & vbCrLf & _
"俺です。" & vbCrLf & vbCrLf & _
"本日のご報告です。" & vbCrLf & _
"特にもありませんでした。" & vbCrLf & vbCrLf & _
"以上です。" & vbCrLf & _
"よろしくです。" & vbCrLf & vbCrLf & _
"from 俺" & vbCrLf '本文

ML.Display 'メール表示

Set ML = Nothing
Set OL = Nothing

End Sub

AWS CFnの超簡単なスタックの起動方法

AWS CFnで基本的な構成を起動させる手順の覚書です。

本当に基本的な構成ですのでセキュリティが甘いなどはご容赦ください。

 

CFnへログインしてください。

管理者権限が必要です。

キーは作成済みということにしています。

 コードはVSCodeで作成しています。拡張機能はCloudFormationとYAMLだけいれています。特に、↓はCloudFormationを入れていれば捗ります。

新規ファイル作成(Ctrl+O)→言語モードの変更(Ctrl+Shift+P)→『YML』→言語モードがYAMLになったことを確認。ここで名前を付けて保存しても良いかも。

 

startと入力して以下の一覧を入力

start

start

 いらない部分が多いので、↓のように削る。

要するにResourcesだけにする。

start2

start2

Resourcesの下の行にタブを一つ入れてVPC

vpc

vpc

vpc2

vpc2

上のように一覧が表示される。

ここではCidrBlock:を編集する。私は習慣的にVPCは10.0.0.0/16とします。

それ以外がよければそちらでかまわないと思いますが、

以後はこのCidrを使いますので、これ以外の場合はアドレス範囲にご注意ください。

Resources
  VPC:
    TypeAWS::EC2::VPC
    Properties:
      CidrBlock10.0.0.0/16
      EnableDnsSupporttrue
      Tags:
        - KeyName
          ValueVPC

次にsubnetを作成します。

subnet1

subnet1

ここではsubnet1としました

subnet2

subnet2

赤文字の箇所を編集しました。

 

# ap-northeast-1aは東京AZです。他がよければ変えても良いとも思います。

AvailabilityZone: ap-northeast-1a
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
Tags:
- Key: Name
Value: Subnet1

  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcIdVPC
      CidrBlock10.0.1.0/24
      Tags:
        - KeyName
          Valuesubnet1
 

ここではこのように作りました。
ここで、一端CFnで起動してみます。

  

デザイナーでテンプレートを作成

デザイナーでテンプレートを作成

デザイナーでテンプレートを作成をクリック

 

YML選択

YML選択

テンプレート

テンプレート

↑をそれぞれ選択

VSCodeで入力したコードを貼り付けてみます。

右上の『グラフの更新』をクリック

f:id:gbsdjpagiefuihzds:20200421114008p:plain

vpc+subnet

VPCとSubnetが確認できました。

とりあえず、ここまでは成功しています。

ここまでのコードです。

AWSTemplateFormatVersion: 2010-09-09

Resources
  VPC:
    TypeAWS::EC2::VPC
    Properties:
      CidrBlock10.0.0.0/16
      EnableDnsSupporttrue
      Tags:
        - KeyName
          ValueVPC
  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcIdVPC
      CidrBlock10.0.1.0/24
      Tags:
        - KeyName
          Valuesubnet1

 

VSCodeに戻ります。

SSH接続するためのキー設定を行います。

これまで記入していたResourcesの上部にParamertersを追加して以下を記入します。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  KeyPair:
    DescriptionKeyPair Name
    TypeAWS::EC2::KeyPair::KeyName

外部インターネットへ出るためにInternetGatewayを作成する必要があります。

以下のコードを入力します。

  InternetGateway:
    TypeAWS::EC2::InternetGateway
    Properties:
      Tags:
        - KeyName
          ValueInternetGateway
  AttachGateway:
    TypeAWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId!Ref VPC
      InternetGatewayId!Ref InternetGateway

 InternetGatewayを入力するとattachmentまで自動入力されました。

VSCode便利ですね。

次に、Route、RouteTable、SubnetRouteTableAssociationの3つを入力します。

これはそれぞれ入力する必要があると思います。

初期状態は↓の通りです。

  routeName:
    TypeAWS::EC2::Route
    Properties:
      RouteTableIdrtable-id
      DestinationCidrBlock--.--.--.--/--
      GatewayIdgataway-id
  routeTableName:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcIdvpc-id
      Tags:
        - Keykeyname
          Valuevalue
  routeTableAssocName:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetIdsubnet-id
      RouteTableIdrtable-id

↓になりました。

各IDを!Refで紐づけていくだけです。

項目の追加はありません。

  Route:
    TypeAWS::EC2::Route
    Properties:
      RouteTableId!Ref RouteTable
      DestinationCidrBlock0.0.0.0/0
      GatewayId!Ref InternetGateway
  RouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref VPC
      Tags:
        - KeyName
          ValueRouteTable
  RouteTableAssoc:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref subnet1
      RouteTableId!Ref RouteTable

次にSecurityGroupを作成します。

これもSecurityぐらいまで入力すれば以下のようになるはず。

f:id:gbsdjpagiefuihzds:20200421120050p:plain

Security

SecurityGroupの初期状態は↓の通りです。

  secGroupName:
    TypeAWS::EC2::SecurityGroup
    Properties:
      GroupName
      GroupDescription
      VpcId:
      SecurityGroupIngress:
        - Security Group Rule
      SecurityGroupEgress:
        - Security Group Rule
      Tags:
        - Key:
          Value:

      GroupName: は削除

      SecurityGroupIngress:
        - Security Group Rule
      SecurityGroupEgress:
        - Security Group Rule

はSecurityGroupIngress:だけにします。

要するに

  secGroupName:
    TypeAWS::EC2::SecurityGroup
    Properties:
      GroupDescription
      VpcId:
      SecurityGroupIngress:
      Tags:
        - Key:
          Value:

となります。

↑が

↓となります。

 
  SecurityGroup:
    TypeAWS::EC2::SecurityGroup
    Properties:
      GroupDescriptionSG
      VpcId!Ref VPC
      SecurityGroupIngress:
      - IpProtocoltcp
        FromPort'22'
        ToPort'22'
        CidrIp0.0.0.0/0
      Tags:
        - KeyName
          ValueSG

SecurityGroupはできました。

次に、このままですとグローバルIPアドレスがありませんので、外に出られません。

グローバルIPアドレスを取得するする設定が必要です。

subnet内に
MapPublicIpOnLaunch: 'true'

を入力します。

  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcId!Ref VPC
      CidrBlock10.0.1.0/24
      Tags:
        - KeyName
          Valuesubnet1

  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcId!Ref VPC
      CidrBlock10.0.1.0/24
      MapPublicIpOnLaunch'true'
      Tags:
        - KeyName
          Valuesubnet1

とします。

次に、Linuxインスタンスを起動する設定を行います。

subnetの下でec2くらいを入力すると以下のようになると思います。

f:id:gbsdjpagiefuihzds:20200421130744p:plain

EC2

一番上のEC2-Instanceをエンターで選択

デフォルトは以下のようになるはずです。

  myEC2Instance:
    TypeAWS::EC2::Instance
    Properties:
      KeyName
      DisableApiTermination
      ImageId
      InstanceType
      Monitoringtrue|false
      SecurityGroupIds:
        - sg-id
      UserData!Base64 |
        #!/bin/bash -ex
        # put your script here
      Tags:
        - Keykey
          Valuevalue

これもいくつかの行を削ります。

DisableApiTermination: 

Monitoring: true|false:

↑2行を削りました。

  myEC2Instance:
    TypeAWS::EC2::Instance
    Properties:
      KeyName
      ImageId
      InstanceType
      SecurityGroupIds:
        - sg-id
      UserData!Base64 |
        #!/bin/bash -ex
        # put your script here
      Tags:
        - Keykey
          Valuevalue

のようになるはずです。

ここで

      KeyName
      ImageId
      InstanceType

      KeyName!Ref KeyPair
      ImageIdami-923d12f5
      InstanceTypet2.micro

 

 

      SecurityGroupIds:
        - sg-id

      SecurityGroupIds:
        - !GetAtt SecurityGroup.GroupId

 

 

      UserData!Base64 |
        #!/bin/bash -ex
        # put your script here

      UserData:
        Fn::Base64!Sub |
          #!/bin/bash
          yum -y update

 ↑は#!/bin/bashyum -y updateの前にインデントが必要です。

 

ここがポイントなのですが、デフォルトでは出てこないSubnetIdを追記します。

      SubnetId!Ref subnet1

最後に、Tagsを編集します。

      Tags:
        - Keykey
          Valuevalue

      Tags:
        - KeyName
          ValueEC2Linux

として、IDを変えます。

そして↓こうなりました。

  EC2Linux:
    TypeAWS::EC2::Instance
    Properties:
      KeyName!Ref KeyPair
      ImageIdami-923d12f5
      InstanceTypet2.micro
      SecurityGroupIds:
        - !GetAtt SecurityGroup.GroupId
      SubnetId!Ref subnet1
      UserData:
        Fn::Base64!Sub |
          #!/bin/bash
          yum -y update
      Tags:
        - KeyName
          ValueEC2Linux

これで編集は完了です。

ここまでのコードでCFnでLinuxが起動できるはずです。

 

最後に、全コードです。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
KeyPair:
DescriptionKeyPair Name
TypeAWS::EC2::KeyPair::KeyName
Resources
  VPC:
    TypeAWS::EC2::VPC
    Properties:
      CidrBlock10.0.0.0/16
      EnableDnsSupporttrue
      Tags:
        - KeyName
          ValueVPC
  InternetGateway:
    TypeAWS::EC2::InternetGateway
    Properties:
      Tags:
        - KeyName
          ValueInternetGateway
  AttachGateway:
    TypeAWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId!Ref VPC
      InternetGatewayId!Ref InternetGateway
  Route:
    TypeAWS::EC2::Route
    Properties:
      RouteTableId!Ref RouteTable
      DestinationCidrBlock0.0.0.0/0
      GatewayId!Ref InternetGateway
  RouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref VPC
      Tags:
        - KeyName
          ValueRouteTable
  RouteTableAssoc:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref subnet1
      RouteTableId!Ref RouteTable
  SecurityGroup:
    TypeAWS::EC2::SecurityGroup
    Properties:
      GroupDescriptionSG
      VpcId!Ref VPC
      SecurityGroupIngress:
      - IpProtocoltcp
        FromPort'22'
        ToPort'22'
        CidrIp0.0.0.0/0
      Tags:
        - KeyName
          ValueSG
  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcId!Ref VPC
      CidrBlock10.0.1.0/24
      MapPublicIpOnLaunch'true'
      Tags:
        - KeyName
          Valuesubnet1
  EC2Linux:
    TypeAWS::EC2::Instance
    Properties:
      KeyName!Ref KeyPair
      ImageIdami-923d12f5
      InstanceTypet2.micro
      SecurityGroupIds:
        - !GetAtt SecurityGroup.GroupId
      SubnetId!Ref subnet1
      UserData:
        Fn::Base64!Sub |
          #!/bin/bash
          yum -y update
      Tags:
        - KeyName
          ValueEC2Linux

 

雰囲気くらいはおわかり頂けますでしょうか。
↑はコピペできますので、CFnで起動してみれば感じはおわかり頂ると思います。
うまく起動できない場合は、!Refの後ろの名前が、コードの中にあるか検索してみてください。
詳しくはググって欲しいのですが、!Refの後ろの名前はコード内にないとエラーになります。
デフォルトの名前を変えずにいるとエラーになると思います。
コードの行間がおかしいです。
見づらくてすみません。