hate_aaa3の技術備忘録メモ

自分用メモ(IT系)をストックしていきます。

端末のセットアップ(VSCode編)


プロジェクト移動やなんやでPCが変わったりするので、結構どこの案件でも使えそうな 設定情報やインストールしてるプラグインなんかを残しておこう。

実施環境:Windows10端末

目次

1.1. Pythonインストール

https://pythonlinks.python.jp/ja/index.html からダウンロードしてインストールする。

※インストールする時にはパスを通すにチェックをしてインストールすること。

1.2. VSCodeインストール

https://code.visualstudio.com/docs/?dv=win からダウンロードしてインストールする。

1.3. 追加プラグインインストール

インストール対象

No カテゴリ プラグイン 説明
1 共通 Japanese Language Pack for Visual Studio Code 日本語化
2 共通 Material Icon Theme アイコン
3 共通 Remote - SSH SSH接続
4 共通 Remote - SSH Editing Configuration Files SSH接続の設定ファイル
5 共通 draw.io AWS構成図の作成
6 コーディング全般 Trailing Spaces スペースがある時に目立つようにしてくれる
7 コーディング全般 EvilInspector 全角スペースを検知
8 コーディング全般 zenkaku 全角スペースを可視化
9 コーディング全般 Prettier コードの自動整形
10 CloudFormation CloudFormation Cloudformationコーディング
11 CloudFormation CloudFormation Linter CloudformationのLinter
12 CloudFormation YAML YAML
13 shell Bash IDE Bash コーディング
14 shell shellcheck shell構文解析
15 HTML Auto Rename Tag タグ名変更時の閉じタグ自動変換
16 HTML Auto Close Tag 開始タグ記述時に自動で閉じタグを生成
17 マークダウン Markdown All in One マークダウン作成
18 マークダウン Excel to Markdown table 表形式(エクセル/スプレッドシート)をマークダウン形式に変換
19 マークダウン Markdown Preview Enhanced マークダウンのプレビュー機能
20 マークダウン markdownlint マークダウンのプレビュー機能のLinter
21 マークダウン Text Tables マークダウン形式で表を作成支援


VSCodeのターミナルから以下を実行しプラグインをインストール

code --install-extension MS-CEINTL.vscode-language-pack-ja --force
code --install-extension PKief.material-icon-theme         --force
code --install-extension ms-vscode-remote.remote-ssh       --force
code --install-extension ms-vscode-remote.remote-ssh-edit  --force
code --install-extension hediet.vscode-drawio --force
code --install-extension shardulm94.trailing-spaces --force
code --install-extension saikou9901.evilinspector --force
code --install-extension mosapride.zenkaku --force
code --install-extension esbenp.prettier-vscode --force
code --install-extension aws-scripting-guy.cform --force
code --install-extension kddejong.vscode-cfn-lint --force
code --install-extension redhat.vscode-yaml --force
code --install-extension mads-hartmann.bash-ide-vscode     --force
code --install-extension timonwong.shellcheck --force
code --install-extension formulahendry.auto-rename-tag     --force
code --install-extension formulahendry.auto-close-tag      --force
code --install-extension yzhang.markdown-all-in-one --force
code --install-extension csholmq.excel-to-markdown-table   --force
code --install-extension shd101wyy.markdown-preview-enhanced --force
code --install-extension DavidAnson.vscode-markdownlint    --force
code --install-extension RomanPeshkov.vscode-text-tables --force

1.4. Cloudformation用lintの設定

VSCodeのターミナルから以下を実行しpipをインストール

python -m pip install --upgrade pip
pip install --user cfn-lint
pip install --user pydot

VSCodeのターミナルから以下を実行し現在の値を変数に格納する。 ※念のため、バックアップしておく。

[System.Environment]::GetEnvironmentVariable("Path", "User")
[System.Environment]::GetEnvironmentVariable("Path", "User") >> user_path.txt
$oldSystemPath = [System.Environment]::GetEnvironmentVariable("Path", "User")

VSCodeのターミナルから以下を実行しpythonのパスを確認。

pip show cfn-lint

・
・
Location:c:\users\hoge\appdata\roaming\python\python310\site-packages
・
・



VSCodeのターミナルから以下を実行し、現在の環境変数が格納されている文字列にpythonスクリプトパスを追加する。

※注意!前項で確認したパスの最後のフォルダを\site-packagesから\Scriptsに変更する必要があります。

$oldSystemPath += ";c:\users\hoge\appdata\roaming\python\python310\Scripts"


VSCodeのターミナルから以下を実行し環境変数を設定する。

[System.Environment]::SetEnvironmentVariable("Path", $oldSystemPath, "User")

VSCodeのターミナルから以下を実行し以下を設定し環境変数に設定されているか確認する。

Get-ChildItem env:PATH | ft -Wrap

1.5. 括弧の色付け

  1. VSCodeのメニューから[ファイル]→[ユーザ設定]→[設定]で画面を開く。
  2. ウィンドウの検索バーにbracketと入力する。
  3. [editor.bracketPairColorization.enabled]の項目にチェックを入れる。

テスト環境用のAWSリソース作成(セキュリティレイヤ-IAM) 【CloudFormation】

■参考にさせて頂いた情報、記事

CloudFormationでEC2用のIAMロールを作成するときはインスタンスプロファイルに注意する - やーまんぶろぐ

AWS CloudFormation で IAM マネージドポリシーを IAM ロールにアタッチする

TECHSCORE|知っておきたかったAWS SAM の小ネタ4選 | TECHSCORE BLOG

【はじめてのCI/CD】AWSでやってみるDevOps最初の一歩、CodeDeploy、CodePipelineを使った自動デプロイのハンズオン - YouTube



■作成リソース

・IAMロール

インスタンスプロファイル

AWSTemplateFormatVersion: 2010-09-09

Parameters:
#CodeDeployを使うのに必要な IAM マネージドポリシー
  ManagedPolicyParameter1:
    Type: String
    Description: 'S3ReadOnlyAccess'
    Default: "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"

  ManagedPolicyParameter2:
    Type: String
    Description: 'CodeDeployRole'
    Default: "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole"


# 環境名
  EnvironmentName:
    Description: environment name
    Type: String
    AllowedValues:
      - dev               #開発環境
      - stg               #ステージング環境
      - prd               #本番環境
    Default: dev


Resources:
###################################
# IAMロール作成
###################################
  iamRoleEC2:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${EnvironmentName}-${AWS::StackName}-iamRoleEC2
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: "/"
      ManagedPolicyArns:
        - !Ref ManagedPolicyParameter1
        - !Ref ManagedPolicyParameter2
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-iamRoleEC2

###################################
# インスタンスプロファイル作成
###################################
  BastionIAMInstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      InstanceProfileName: !Sub ${EnvironmentName}-${AWS::StackName}-BastionIAMInstanceProfile
      Path: "/"
      Roles:
        - Ref: iamRoleEC2


###################################
# 外部出力
###################################
Outputs:
  iamRoleEC2:
    Value: !Ref iamRoleEC2
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-iamRoleEC2

  BastionIAMInstanceProfile:
    Value: !Ref BastionIAMInstanceProfile
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-BastionIAMInstanceProfile

テスト環境用のAWSリソース作成(コマンド) 【CloudFormation】

テスト環境用のAWSリソース作成で作ったCloudFormationを使ってテスト環境を作成


■前提

・各種リソースを作れる権限をもつEC2(Linux)があること。


■必要ファイル

VPC.yml https://hate-aaa3.hatenablog.com/entry/2022/01/20/171002

・SG.yml https://hate-aaa3.hatenablog.com/entry/2022/01/20/171404

・IAM.yml https://hate-aaa3.hatenablog.com/entry/2022/01/24/163729

・testserver.yml https://hate-aaa3.hatenablog.com/entry/2022/01/20/173432


#クロススタック参照するリソースにスタック名を入れている都合上、一番はじめにスタック名のキー文字列を変数宣言して  少しでも柔軟にしたつもり。それでも、かっこ悪いので良い落としどころを見つけたい。

■作成時の実行コマンド(変更セットなし)

STACK_NAME="TestCF"
aws cloudformation deploy --template-file VPC.yml --stack-name ${STACK_NAME}-VPC
aws cloudformation deploy --template-file SG.yml --stack-name ${STACK_NAME}-SG --parameter-overrides VPCstack=${STACK_NAME}-VPC
aws cloudformation deploy --template-file IAM.yml  --stack-name ${STACK_NAME}-IAM  --capabilities CAPABILITY_NAMED_IAM 
aws cloudformation deploy --template-file testserver.yml --stack-name ${STACK_NAME}-testserver --parameter-overrides VPCstack=${STACK_NAME}-VPC SGstack=${STACK_NAME}-SG IAMstack=${STACK_NAME}-IAM


■作成時の実行コマンド(変更セットあり)

STACK_NAME="TestCF"
aws cloudformation deploy --template-file VPC.yml --stack-name ${STACK_NAME}-VPC --no-execute-changeset
aws cloudformation deploy --template-file SG.yml --stack-name ${STACK_NAME}-SG --parameter-overrides VPCstack=${STACK_NAME}-VPC --no-execute-changeset
aws cloudformation deploy --template-file IAM.yml  --stack-name ${STACK_NAME}-IAM  --capabilities CAPABILITY_NAMED_IAM  --no-execute-changeset
aws cloudformation deploy --template-file testserver.yml --stack-name ${STACK_NAME}-testserver --parameter-overrides VPCstack=${STACK_NAME}-VPC SGstack=${STACK_NAME}-SG IAMstack=${STACK_NAME}-IAM --no-execute-changeset


■削除時の実行コマンド

STACK_NAME="TestCF"
aws cloudformation delete-stack --stack-name ${STACK_NAME}-testserver
aws cloudformation delete-stack --stack-name ${STACK_NAME}-SG
aws cloudformation delete-stack --stack-name ${STACK_NAME}-IAM
aws cloudformation delete-stack --stack-name ${STACK_NAME}-VPC 

テスト環境用のAWSリソース作成(アプリケーションレイヤ) 【CloudFormation】

■参考にさせて頂いた情報、記事

CloudTech | AWS初学者を導く体系的な動画学習

Fn::ImportValue - AWS CloudFormation



■作成リソース

・EC2

AWSTemplateFormatVersion: 2010-09-09
Parameters:
# 環境名
  EnvironmentName:
    Description: environment name
    Type: String
    AllowedValues: 
      - dev               #開発環境
      - stg               #ステージング環境
      - prd               #本番環境
    Default: dev

# AMI ID
  Ec2ImageId:
    Type: AWS::SSM::Parameter::Value<String>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

# インスタンスタイプ
  Ec2InstanceType:
    Type: String
    Default: t2.micro

#VPC作成スタック名
  VPCstack:
    Type: String
    Default: "testCF"

#SG作成スタック名
  SGstack:
    Type: String
    Default: "testCF-SG"

#IAM作成スタック名
  IAMstack:
    Type: String
    Default: "testCF-IAM"

Resources:
###################################
# EC2作成
###################################
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: taki_asu1
      ImageId: !Ref Ec2ImageId
      InstanceType: !Ref Ec2InstanceType
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: {"Fn::ImportValue" : {"Fn::Sub" : "${EnvironmentName}-${VPCstack}-PublicSubnet1a"}}  #ImportValueでSubの短縮系が使えないため、この記述。https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html
          #インスタンス作成時にSGをアタッチする時はここに入れるしかない。※作成後にここに追加するとEC2の再作成が走るので別途SGをアタッチするCloudformationを作成するのが正しそう。
          GroupSet: 
            - {"Fn::ImportValue" : {"Fn::Sub" : "${EnvironmentName}-${SGstack}-SSHSecurityGroup"}}  #ImportValueでSubの短縮系が使えないため、この記述。https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html
            - {"Fn::ImportValue" : {"Fn::Sub" : "${EnvironmentName}-${SGstack}-HTTPSecurityGroup"}}  #ImportValueでSubの短縮系が使えないため、この記述。https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html
      IamInstanceProfile: {"Fn::ImportValue" : {"Fn::Sub" : "${EnvironmentName}-${IAMstack}-BastionIAMInstanceProfile"}} #ImportValueでSubの短縮系が使えないため、この記述。https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-MyEC2Instance


###################################
# 外部出力
###################################
Outputs:
  MyEC2Instance:
    Value: !Ref MyEC2Instance
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-MyEC2Instance

テスト環境用のAWSリソース作成(セキュリティレイヤ-SG) 【CloudFormation】

Outputsで出力した時の名前にスタックの名前入れるとクロススタック参照させるときに柔軟性に欠けるなぁ。。。


■参考にさせて頂いた情報、記事

CloudTech | AWS初学者を導く体系的な動画学習

Fn::ImportValue - AWS CloudFormation



■作成リソース

・セキュリティグループ

AWSTemplateFormatVersion: 2010-09-09
Parameters:
# 環境名
  EnvironmentName:
    Description: environment name
    Type: String
    AllowedValues: 
      - dev               #開発環境
      - stg               #ステージング環境
      - prd               #本番環境
    Default: dev

#VPC作成スタック名
  VPCstack:
    Type: String
    Default: "testCF"


Resources:
###################################
# セキュリティグループ作成(SSH)
###################################
  SSHSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: "SSHSecurityGroup"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: '0.0.0.0/0'
      VpcId: {"Fn::ImportValue" : {"Fn::Sub" : "${EnvironmentName}-${VPCstack}-VpcId"}}  #ImportValueでSubの短縮系が使えないため、この記述。https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-SSHSecurityGroup

###################################
# セキュリティグループ作成(HTTP/HTTPS)
###################################
  HTTPSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: "HTTPSecurityGroup"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: '0.0.0.0/0'
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: '0.0.0.0/0'
      VpcId: {"Fn::ImportValue" : {"Fn::Sub" : "${EnvironmentName}-${VPCstack}-VpcId"}}  #ImportValueでSubの短縮系が使えないため、この記述。https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-HTTPSecurityGroup


###################################
# 外部出力
###################################
Outputs:
  SSHSecurityGroup:
    Value: !Ref SSHSecurityGroup
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-SSHSecurityGroup

  HTTPSecurityGroup:
    Value: !Ref HTTPSecurityGroup
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-HTTPSecurityGroup

テスト環境用のAWSリソース作成(ネットワークレイヤ) 【CloudFormation】

まだまだ書き方勉強中。。

■参考にさせて頂いた情報、記事

CloudTech | AWS初学者を導く体系的な動画学習

[AWS Black Belt Online Seminar] AWS CloudFormation 資料及び QA 公開 | Amazon Web Services ブログ

AWS CloudFormation ネストされたスタックの変更セットの実行方法 | DevelopersIO



■作成リソース

VPC

・サブネット(パブリック×3、プライベート×3)

・インターネットゲートウェイ

・ルートテーブル

AWSTemplateFormatVersion: 2010-09-09
Parameters:
# 環境名
  EnvironmentName:
    Description: environment name
    Type: String
    AllowedValues: 
      - dev               #開発環境
      - stg               #ステージング環境
      - prd               #本番環境
    Default: dev

# CIDERレンジ
  VpcCIDR:
    Description: Please enter the IP range (CIDR notation) for this VPC
    Type: String
    Default: 192.168.0.0/21


Resources:
###################################
# VPC作成
###################################
  MyVPC1:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock:  !Sub ${VpcCIDR}
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-MyVPC1

###################################
# インターネットゲートウェイ作成
###################################
  MyInternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Name
        Value: !Sub ${EnvironmentName}-${AWS::StackName}-MyInternetGateway

  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref MyInternetGateway
      VpcId: !Ref MyVPC1

###################################
# パブリックサブネット作成1  (ap-northeast-1a  192.168.0.0/24)
###################################
  PublicSubnet1a:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: { "Fn::Select" : ["0", { "Fn::GetAZs" : { "Ref" : "AWS::Region" } } ] } #Default Subnetの0番目指定
      VpcId: !Ref MyVPC1
      CidrBlock:  !Select [ 0, !Cidr [ !GetAtt MyVPC1.CidrBlock, 1, 8 ]] #VPCのCidrを頭から8bit分割し、2つ配列した1番目のサブネットマスク指定(0から始まるため数字は-1される)
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-PublicSubnet1a

###################################
# パブリックサブネット作成2  (ap-northeast-1c  192.168.1.0/24)
###################################
  PublicSubnet1c:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: { "Fn::Select" : ["1", { "Fn::GetAZs" : { "Ref" : "AWS::Region" } } ] } #Default Subnetの1番目指定
      VpcId: !Ref MyVPC1
      CidrBlock:  !Select [ 1, !Cidr [ !GetAtt MyVPC1.CidrBlock, 2, 8 ]] #VPCのCidrを頭から8bit分割し、3つ配列した2番目のサブネットマスク指定(0から始まるため数字は-1される)
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-PublicSubnet1c

###################################
# パブリックサブネット作成3  (ap-northeast-1d  192.168.2.0/24)
###################################
  PublicSubnet1d:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: { "Fn::Select" : ["2", { "Fn::GetAZs" : { "Ref" : "AWS::Region" } } ] } #Default Subnetの2番目指定
      VpcId: !Ref MyVPC1
      CidrBlock:  !Select [ 2, !Cidr [ !GetAtt MyVPC1.CidrBlock, 3, 8 ]] #VPCのCidrを頭から8bit分割し、4つ配列した3番目のサブネットマスク指定(0から始まるため数字は-1される)
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-PublicSubnet1d

###################################
# プライベートサブネット作成1  (ap-northeast-1a  192.168.3.0/24)
###################################
  PrivateSubnet1a:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: { "Fn::Select" : ["0", { "Fn::GetAZs" : { "Ref" : "AWS::Region" } } ] } #Default Subnetの0番目指定
      VpcId: !Ref MyVPC1
      CidrBlock:  !Select [ 3, !Cidr [ !GetAtt MyVPC1.CidrBlock, 4, 8 ]] #VPCのCidrを頭から8bit分割し、5つ配列した4番目のサブネットマスク指定(0から始まるため数字は-1される)
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-PrivateSubnet1a

###################################
# プライベートサブネット作成2  (ap-northeast-1c  192.168.4.0/24)
###################################
  PrivateSubnet1c:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: { "Fn::Select" : ["1", { "Fn::GetAZs" : { "Ref" : "AWS::Region" } } ] } #Default Subnetの1番目指定
      VpcId: !Ref MyVPC1
      CidrBlock:  !Select [ 4, !Cidr [ !GetAtt MyVPC1.CidrBlock, 5, 8 ]] #VPCのCidrを頭から8bit分割し、6つ配列した5番目のサブネットマスク指定(0から始まるため数字は-1される)
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-PrivateSubnet1c

###################################
# プライベートサブネット作成3  (ap-northeast-1d  192.168.5.0/24)
###################################
  PrivateSubnet1d:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: { "Fn::Select" : ["2", { "Fn::GetAZs" : { "Ref" : "AWS::Region" } } ] } #Default Subnetの2番目指定
      VpcId: !Ref MyVPC1
      CidrBlock:  !Select [ 5, !Cidr [ !GetAtt MyVPC1.CidrBlock, 6, 8 ]] #VPCのCidrを頭から8bit分割し、7つ配列した6番目のサブネットマスク指定(0から始まるため数字は-1される)
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-PrivateSubnet1d

###################################
# ルートテーブル(パブリックサブネット用共通)作成
###################################
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref MyVPC1
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-PublicRoutes

  DefaultPublicRoute:
    Type: AWS::EC2::Route
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref MyInternetGateway

  PublicSubnet1aRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet1a

  PublicSubnet1cRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet1c

  PublicSubnet1dRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet1d

###################################
# ルートテーブル(プライベートサブネット用共通)作成
###################################
  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref MyVPC1
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-${AWS::StackName}-PrivateRoutes

  PrivateSubnet1aRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      SubnetId: !Ref PrivateSubnet1a

  PrivateSubnet1cRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      SubnetId: !Ref PrivateSubnet1c

  PrivateSubnet1dRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      SubnetId: !Ref PrivateSubnet1d


###################################
# 外部出力
###################################
Outputs:
  MyVPC1:
    Value: !Ref MyVPC1
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-VpcId

  PublicSubnet1a:
    Value: !Ref PublicSubnet1a
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-PublicSubnet1a

  PublicSubnet1c:
    Value: !Ref PublicSubnet1c
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-PublicSubnet1c

  PublicSubnet1d:
    Value: !Ref PublicSubnet1d
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-PublicSubnet1d

  PrivateSubnet1a:
    Value: !Ref PrivateSubnet1a
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-PrivateSubnet1a

  PrivateSubnet1c:
    Value: !Ref PrivateSubnet1c
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-PrivateSubnet1c

  PrivateSubnet1d:
    Value: !Ref PrivateSubnet1d
    Export:
      Name: !Sub ${EnvironmentName}-${AWS::StackName}-PrivateSubnet1d

大量データを文字列比較してグループ化 【Excel VBA】

f:id:hate_aaa3:20220119180008j:plain
(参考データ)

↓ 

f:id:hate_aaa3:20220119175943j:plain
(参考データ 実行後)

Public find_word As String
Public find_word_len As Integer
Public MaxRow As Integer
Public MaxRow2 As Integer

Public NewWorkSheet As Worksheet
Public BaseWorkSheet As Worksheet


Public StartTime As Single   '処理の開始時刻を格納する変数領域
Public EndTime As Single     '処理の終了時刻を格納する変数領域

Dim atime, ztime As Variant
Dim Start As Single
Dim Finish As Single


'大量データを文字列比較してグループ化
Public Sub message_grp()


Start = Timer

Application.Calculation = xlManual
Application.ScreenUpdating = False




Set BaseWorkSheet = ActiveSheet

'出力用シート作成
Set NewWorkSheet = Worksheets.Add()
NewWorkSheet.Name = "類似文字列集計"
NewWorkSheet.Move After:=BaseWorkSheet
NewWorkSheet.Cells(1, 1) = "No"
NewWorkSheet.Cells(1, 2) = "出力回数"
NewWorkSheet.Cells(1, 3) = "文字列"
NewWorkSheet.Cells(1, 4) = "キー番号"




BaseWorkSheet.Activate
BaseWorkSheet.Columns(16384).Clear    '16384列目に処理済みフラグを記載するのでクリアする。


MaxRow = Range("A1").End(xlDown).Row

m = 2




'最下行の文字列まで処理を実施
For i = 2 To MaxRow

    StartTime = Timer
    
    t = 0
    
    'グループ化済みフラグがたっているものはスキップ
    If Cells(i, 16384) = "" Then


        '対象文字列の左から200文字を比較対象とする
        find_word = Left(Cells(i, 1), 200)
        find_word2 = Cells(i, 1)


        NewWorkSheet.Cells(m, 1) = "=ROW()-1"
        NewWorkSheet.Cells(m, 2) = 1
        NewWorkSheet.Cells(m, 3) = find_word2
        NewWorkSheet.Cells(m, 4) = m - 1
    
    
            For ii = i + 1 To MaxRow
                  
                '処理済みフラグがたっている場合はスキップ
                If Cells(ii, 16384) <> 1 Then
        
                    diff_count = lsDist(find_word, Left(Cells(ii, 1), 200))
                    diff_Percent = diff_count / 100
    
                    '文字列差分が10%以内の場合、同一メッセージとしてみなす
                    If diff_Percent < 0.1 Then
                            NewWorkSheet.Cells(m, 2) = NewWorkSheet.Cells(m, 2) + 1
                            BaseWorkSheet.Cells(ii, 16384) = NewWorkSheet.Cells(m, 1)
                    End If
                       
                        
                    
                    
                End If
                
          
            
            Next ii
    
    
    m = m + 1
    
    End If




Next i


'体裁調整
MaxRow2 = NewWorkSheet.Range("A1").End(xlDown).Row
NewWorkSheet.Range("A1:D" & MaxRow2).Borders.LineStyle = True
NewWorkSheet.Range("A1:D1").Interior.Color = RGB(204, 255, 255)
NewWorkSheet.Range("A2:D" & MaxRow2).Sort Key1:=NewWorkSheet.Cells(2, 2), order1:=xlDescending
NewWorkSheet.Range("B2:C" & MaxRow2).NumberFormatLocal = "0 件"
NewWorkSheet.Range("A:D").Columns.AutoFit


Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True


Finish = Timer

MsgBox ("かかった時間は" & Finish - Start & "秒です")
    
End Sub


'************************************************************************
'* (VBA)文字列の比較 / 第1引数:元のテキスト 第2引数:比較テキスト
'************************************************************************
Public Function lsDist(baseText As String, tryText As String) As Integer
 
    Dim matrix() As Variant
    Dim i As Integer, j As Integer, cost As Integer
 
    lsDist = 0
 
 
    If (baseText = tryText) Then
        Exit Function
    End If
    
    If (Len(baseText) = 0) Then
        lsDist = Len(tryText)
        Exit Function
    End If
    
    
    If (Len(tryText) = 0) Then
        lsDist = Len(baseText)
        Exit Function
    End If
   
   
    ReDim matrix(Len(baseText), Len(tryText))
 
    For i = 0 To Len(baseText)
        matrix(i, 0) = i
    Next i
   
   
    For j = 0 To Len(tryText)
        matrix(0, j) = j
    Next j
 
 
    For i = 1 To Len(baseText)
    
        For j = 1 To Len(tryText)
            
            cost = IIf(Mid$(baseText, i, 1) = Mid$(tryText, j, 1), 0, 1)
            matrix(i, j) = WorksheetFunction.Min(matrix(i - 1, j) + 1, matrix(i, j - 1) + 1, matrix(i - 1, j - 1) + cost)
        
        Next j
    
    Next i

 
 
    lsDist = matrix(Len(baseText), Len(tryText))
 
End Function