端末のセットアップ(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. 括弧の色付け
- VSCodeのメニューから[ファイル]→[ユーザ設定]→[設定]で画面を開く。
- ウィンドウの検索バーに
bracket
と入力する。 - [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】
↓
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