以下の内容はhttps://cream-worker.blog.jp/tag/AWSより取得しました。


AWS アクセスキーとか無しでEC2からCodeCommitのリポジトリを操作する

公式のガイド

SSHキーとかHTTPSの認証情報とか先にやっておかないとダメだと思ってたのですが、

EC2からならこういうの必要ないっぽい。


EC2のロールにポリシーでCodeCommitPowerUser辺りを付けておけば、Gitのみでいける。

AWSCLIのインストールは必要ですが、Configはしておく必要ない。

Gitのconfigで下記を実施。credential helperをAWSCLI通してやるっぽい。

git config --global credential.helper "!aws codecommit credential-helper $@"
git config --global credential.UseHttpPath true

これだけでいける。SSHキーもAWSのアクセスキーとかシークレットキーの発行なんかも不要なので基本的はこれでやってくれというのがAWSの推奨らしい。

ただし、一つ罠がある。


Gitのインストール時に↓のCredentialHelperをNoneにしておかないとダメ。

sample

ダメじゃないんだけど、Noneにしておかないと、awscliをcredential-helperにしても、

HTTPSでアクセスした際に必ずuser-name/passを聞かれる。

AWS OpenVPNサーバをEC2上で構築してVPN接続

AWSのClientVPN利用しても良いのですが、接続台数増えると結構高いので、自前でやりたい場合。何個か参考になるサイトはあるのですが、最新のOpenVPNだと設定ファイルのディレクトリ構成微妙に変わっていて、結構ハマるので特記。あとついでに、AWSClientVPN利用の時にイケてないところに対応する方法もついでに記載。

AWS側の設定や細かい内容はこちらのブログを見た方が良いと思います。


EC2はAmazonLinuxで作成する場合、RedHat系なら大体同じじゃないかと。

とりあえず結論のコマンド全部

# EPELを有効にする(AmazonLinuxのデフォのリポジトリにOpenVPNがいないため)
sudo amazon-linux-extras install epel -y
# OpenVpnのインストール
sudo yum -y install openvpn
# EasyRSAのインストール(証明書作成用のツール)
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
tar -xvzf EasyRSA-3.0.8.tgz
sudo mv EasyRSA-3.0.8 /usr/local/EasyRSA
cd /usr/local/EasyRSA/


# 初期化
./easyrsa init-pki

# CA作成
./easyrsa build-ca
## パスフレーズ聞かれるので入力 ex. hogefuga
## CommonNmae聞かれるので入力 ex. samplename

# 暗号アルゴリズムの設定ファイル作成
./easyrsa gen-dh

# サーバキーの作成
./easyrsa build-server-full server nopass
## パスフレーズ聞かれるのでCA作成と同じフレーズを入力: ex. hogefuga

# クライアントキーの作成
./easyrsa build-client-full client1 nopass
## パスフレーズ聞かれるのでCA作成と同じフレーズを入力: ex. hogefuga

# 作成した各証明書系ファイルをopenvpnの設定ディレクトリにコピー
sudo cp pki/ca.crt /etc/openvpn/server/
sudo cp pki/issued/server.crt /etc/openvpn/server/
sudo cp pki/private/server.key /etc/openvpn/server/
sudo cp pki/dh.pem /etc/openvpn/server/dh2048.pem

# openvpnのサンプル設定ファイルを所定の場所にコピーしておく(設定ファイルの中身は後述)
sudo cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/server/server.conf

# 2.4以降デフォで必要になったキーの作成
sudo openvpn --genkey --secret /etc/openvpn/server/ta.key

# IPフォワーディングの許可
sudo vi /etc/sysctl.d/99-sysctl.conf 
## 下記を追記
net.ipv4.ip_forward = 1

# サービスの再読み込み
sudo sysctl -p

# 設定ファイルを更新後
# openvpnの起動と自動起動
sudo systemctl start openvpn-server@server.service
sudo systemctl enable openvpn-server@server.service

サーバの設定ファイル

  • 「/etc/openvpn/server/server.conf」
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
tls-auth ta.key 0
cipher AES-256-CBC
# Clientに振られるIPの範囲
server 10.8.0.0 255.255.255.0
# ここはEC2インスタンスが存在してるサブネットのCidrBlock
push "route 172.123.456.789 255.255.0.0"
keepalive 10 120
persist-key
persist-tun
status openvpn-status.log
verb 3

クライアントの設定ファイル

client
dev tun
proto udp
remote [EC2のグローバルIP] 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3

クライアントはWindowsの前提。まず、クライアントをここからDLしてインストール。

そしたら、設定のインポートでやってもいいのですが、結局証明書ファイルの格納とかもいるので下記の感じでやる。デフォだと下記フォルダ内に任意のフォルダを作成

「C:\Users\[user-name]\OpenVPN\config\」

例えば、myvpnでやる場合。まず下記フォルダを作成。

「C:\Users\[user-name]\OpenVPN\config\myvpn」

そしたら、myvpn.ovpnを新しいファイルで作成。中身は上記の内容。

サーバで作ってる各種証明書のファイルをクライアントに持って来て、このファイルと同じ場所に格納。

格納するのは下記4つ。

  • ca.crt
  • client1.crt
  • client1.key
  • ta.key

オマケ:起動中のログ確認したい場合

sudo cat /etc/openvpn/server/openvpn-status.log`


以下もろもろのやりたいコト別の特記。

プロキシ通してアクセス

会社内の場合はプロキシ通さないとアクセス出来なかったりする。その場合は、

  • サーバ側「/etc/openvpn/server/server.conf」
port 443
proto tcp

TCPの443で待ち受け。

  • クライアント側の設定ファイル
proto tcp
remote [EC2のグローバルIP] 443
http-proxy [proxy server] [proxy port] stdin basic
http-proxy-retry

stdinの場合は、接続時に入力プロンプト上げる場合。

予め設定しておきたい場合は、下記でファイル名にしていたいファイルを設定ファイルと同じフォルダに格納する。

http-proxy [proxy server] [proxy port] [file-name]basic

ファイルは1行目がIDで2行目がパスワード。

一つのクライアント証明で複数端末の接続をしたい場合

デフォだと、クライアント毎に証明書用意しないとダメ。これだと大量のクライアントで接続しないといけない場合にかなりつらい。一つの証明書バラまいて終わりにしたい場合は下記。

  • サーバ側「/etc/openvpn/server/server.conf」
duplicate-cn

上記で、同じ証明書使って複数端末から接続しても、それぞれにIPふってくれるようになる。


ハマった個所

  • 2.4のいつから変わったのか分かりませんが、サーバ側の設定ファイルの場所が変わってる。

/etc/openvpn/
↓
/etc/openvpn/server/

  • systemctlの起動の名称が色々変わってる。
sudo systemctl start openvpn

↓

sudo systemctl start openvpn-server@server.service

ちなみに、↑でserverっていう名前の設定ファイルを見に行くっていう事らしい。

「openvpn-server@[name].service」という事らしい。


オマケでAWSClientVPN使う場合にイケてないところの対応。

まず、イケてない点は下記。

追記

↓はインターネット向けはVPN通したくない場合はスプリットトンネル有効にするだけですね。というか↑の設定が要するにスプリットトンネルした時にサーバから送られてくる設定っぽかった。

  • 全ての通信がVPN通るようになる。

サーバから「0.0.0.0」のルートが送り込まれてるらしく、特定CidrのみVPNにしたい場合はコレだと無理。

さらに、AWSClientVPNのAWS提供クライアントだとここの設定サポートされてなくて、対応不可能。

なので、AWSClientVPN利用でも端末側はOpenVPNのクライアントを利用する。

そのうえで設定ファイルで下記を追加。

route 10.123.456.789 255.255.0.0 vpn_gateway 300
route-nopull

route-nopull入れないとサーバからルートが強制されるので、それを回避するために、nopull入れる。

AWS提供のクライアントだとこのnopullを許可してくれない。。。


参考

AWS ClientVPN接続のあれこれ

接続方法は公式に記載の通りで問題なし。

で、AWSのVPNクライアントだと色々設定が出来ないようなので、OpenVPNで接続するようにする。


やりたい事は下記。

  1. プロキシ通しての接続をしたい
  2. 宛先がAWS側のプライベートIPの時のみVPNになるようにしたい

1. プロキシ
http-proxy 123.456.789.123 8080 stdin basic

通常は認証があると思いますが、この設定でプロキシ接続時にID/PASS入力のダイアログが出る。

2. 先がAWS側のプライベートIPの時のみVPN
route-nopull
route-metric 300
route 172.999.999.0 255.255.240.0 vpn_gateway 300

route-nopull がAWS提供のVPNClientだと対応してなくて、これが出来ない。

route-metricはとりあえずつけてますが、多分要らないと思う。

route *** で指定してるところが、このCIDRBlock宛ての時だけVPN使うようにする設定。

追記

インターネット向けはVPN通したくない場合はスプリットトンネル有効にするだけですね。というか↑の設定が要するにスプリットトンネルした時にサーバから送られてくる設定っぽかった。


あと、プロキシを利用する場合は ClientVPNGatewayを作る時に TCP にしておかないとダメ。デフォだとUDPが選ばれているので留意。


ここから、設定上で困ってた事。

AWS提供のVPNClientだと、接続すると 0.0.0.0をVPNGateway宛てにするルートテーブルが追加される。このせいで全ての宛先がVPNGateway宛てになっちゃう。

なので、まず試したこと。metric指定してこの追加されるルートの優先度を下げる。

指定したmetricにならない。

サーバから設定を強制されてるっぽいので、nopull入れる。

AWS VPNClientはno-pullディレクティブに対応してないエラーが出て設定できない。

という事で、OpenVPNでno-pullつけて、routeを自分で定義する必要ある。

AWS CDK AutoScaling+ALBの制約

AutoScalingをLBのターゲットにするとき、Stack通して1ターゲットでしか使えなくなってる。

下記エラー。

Cannot add AutoScalingGroup to 2nd Target Group

で、これのISSUE

困ってる人はそこそこいるような気がしますが、まだ入らないっぽいですね。

コレ出来ないと、一つのサーバ内でポート分けて複数のアプリを動かすのが無理なんだよなー。

ISSUEに記載の回避策を試してみるか。。。

AWS Windowsのタスクスケジューラ

スタートアップ時に実行するタスク作っても、再起動で実行してくれない。

ハマったけど下記設定だった。。。

sample

AC電源使ってる場合のみっていう謎の設定がある。。。

何かこれないとダメになる事あるのかしら?

AWSというか仮想環境はこれ外さないと全部だめですかね。

AWS RDS DB数のクォータ

RDSのSQLServerでDB作ってたら下記のエラー。

Database creation would exceed quota of 30

サービスクォータでDB数の制限があるっぽいのですが、これクォータの中に無いと思うんだけども。。。

公式のクォータ一覧

上だと、DBの「インスタンス数」には制限あるけど、DB数は無いよね?

と思ったら、こっちの制限っぽいか。

Microsoft SQL Server DB インスタンスの制限

各インスタンスクラスタイプと可用性モードでサポートされるデータベースの最大数を示しています。

らしいので、可用性モードの場合は30までが限界っぽいですね。

うーん。増やせないんだろうか。。。

AWS CDKのCodeCommitのEndpointでSSH使えない?

こんな感じでCodeCommitのエンドポイント設定すると思うのですが、

        self.vpc.add_interface_endpoint("CodeCommitGitEndpointForPrivate",
            service=ec2.InterfaceVpcEndpointAwsService.CODECOMMIT_GIT,
            subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT),
        )

これで作られるエンドポイントのENIのセキュリティグループってデフォだと

HTTPSしか許可してないっぽい?

どうなんでしょ。SSHはダメってことなのかしら?

とりあえず、

        sg_code_commit.add_ingress_rule(ec2.Peer.ipv4('10.0.0.0/16'), ec2.Port.tcp(22), "allow ssh access from the VPC")
        self.vpc.add_interface_endpoint("CodeCommitGitEndpointForPrivate",
            service=ec2.InterfaceVpcEndpointAwsService.CODECOMMIT_GIT,
            subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT),
            security_groups=[sg_code_commit]
        )

って感じにすれば、22と443両方OKになるセキュリティグループにしてくれるっぽいけども。

いちをSSHでの接続も出来た。

デフォでSSH許可してないのは何か理由あるのかしら?

Windowsの日本語化手順2019以降

AWSでマーケットプレイスのWindowsにはAmazon提供の日本語化済みOSはあるのですが、

クイックスタートとかには日本語版が存在しない。

なので、英語版のWindowsを日本語化する手順。2019以降版。


大まかに下記。

  1. 日本語化パックのダウンロード
  2. ロケール周り
  3. キーボード
  4. コンパネの言語周り

特に最後の新規ユーザ用言語設定抜けると、色々やられるので注意。


1. 日本語化パックのダウンロード

スタート→歯車アイコン→時刻と言語で「言語の追加」から日本語を追加。

i1

これで日本語パックのDLがされるはず。昔は個別にDLしないとダメだったのですが、

今はここで追加すればDL・インストールまでやってくれる。

そこそこ時間かかる。

2. ロケール周り

上記インストール後に、スタート→歯車アイコン→時刻と言語で、

「日付と時刻」、「地域」を日本に変更。

時刻はとりあえず、UTCの東京あたりで。JSTにしたい場合はレジストリか何かいじらないとダメだったような?

3. キーボード

上記インストール後に、スタート→歯車アイコン→時刻と言語で、

言語の追加で追加した日本語選択⇒オプション→ハードウェアキーボードレイアウトを

日本語キーボードに変更。(106/109キーってやつ)

4. コンパネの言語周り

コントロールパネルの地域から管理タブの「設定のコピー」と「システムロケールの変更」

システムロケールの方は日本を選択。これやらないとファイル名が文字化けしたりする。

設定のコピーはようこそ画面~ と 新しいユーザーアカウントにチェックつける

i2

これやらないと、例えば、アプリを動かしてるユーザが「LOCAL SERVICE」とか「NETWORK SERVICE」何かの場合に、こいつらがシステムユーザなのでここが日本語環境にならなくて死ぬ。

他にも例えば、IISはアプリケーションプールのIDをApplicationIdentityにしてると、アプリケーションプールの名称の仮想ユーザを作って動くのですが、その仮想ユーザが新しいユーザアカウントの設定で作られるので、日本語環境にならなくて死ぬ。


今のところこんな感じ。他に設定しないといけない場所ってあるのかしら?

AWS SQLServerのRDSの作成+バックアップとリストア

タイトル通りでハマった・迷ったところのみ記載。


作成

公式のドキュメントに載ってるままなのですが、照合順序の指定は最初からやっておかないとなので、作る時に下記が必要。

aws-sample01

日本語ベースで使うなら上記は必須かな。

あとセキュリティーグループで1433のポート開放しておかないと、SSMSで繋げなくなる。


復元

復元する場合、基本的にS3にバックアップファイル上げて、そこから復元する。

S3にアクセスするために、オプショングループの割り当てとか必要なのですが、その辺がいまいちわからなかった。

  • オプショングループ作成

aws-sample02

  • 追加したグループにオプションの追加

aws-sample03

  • で、ハマったのがここ

IAMロールを先に作らないとダメなのかと思って公式に記載のアレコレやってたのですが、そうじゃなくて、単純に「新しいロールの作成」選べば、よしなにやってくれる。

aws-sample04

  • インスタンスの変更からオプショングループを指定

aws-sample05

  • 復元

S3の所定のバケット内にバックアップファイルをアップロードして、SSMSで作ったインスタンスに接続して下記クエリを実行。

exec msdb.dbo.rds_restore_database 
@restore_db_name='復元後のDB名', 
@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name';


バックアップ

バックアップは上記復元の設定が出来てればあとはSQLで下記を実行。

exec msdb.dbo.rds_backup_database
@source_db_name='バックアップ対象のDB名', 
@s3_arn_to_backup_to='arn:aws:s3:::bucket_name/file_name';


バックアップ・復元タスクの状況確認

実行したクエリの状況が見たい場合は下記

exec msdb.dbo.rds_task_status

この辺のSQLは公式のこの辺に記載されてるやつを見た方が良い。


あとバックアップの運用について。

スナップショットを自動で取ってはくれるのですが、スナップショットの復元って、必ず別インスタンスに復元されるじゃないですか?

中身のバックアップとってアタッチしたいだけなんだけどなー。

別インスタンスに復元されたところで、アプリのもろもろの設定変えないと意味ないしの。

まーそこから復旧出来るので十分ではあるのかもですが。

DB毎のDaily/Weeklyバックアップ的なのはSQLServerならSQLエージェント側で上記のバックアップSQLとか組んで実行しておくしかないかな?

他にやり方あるのかしら?

AWS instance-connect利用でブラウザでサーバコンソール触れるようにする

タイトル通り。

2年前くらいはこれなかったと思うのですが、いつから出来るようになったんだろ。

Azureはブラウザからサーバコンソールをちょろっと触れたり出来たので、AWSも出来ないかなーと思ってたところ、今見たら出来そうだったのでお試し。ちょっとはまった。

公式のドキュメント

流れ。

  1. セキュリティポリシーの変更
  2. EC2 Instance Connectをサーバ側にインストール
  3. EC2 Instance Connect の IAM アクセス許可を設定する


セキュリティポリシーの変更

今回はまったのがここ。動かない時は下記のエラーメッセージ出る。

We were unable to connect to your instance. Make sure that your instance’s network settings are configured correctly for EC2 Instance Connect.

普通に制限してるアクセス先のみのIP設定だけでよいと勘違いしてた。どうもそうじゃないらしい。AWSが公開してるリージョンのIPを解放しないとダメな模様。何かを経由してアクセスしてるのかしら?

AWSが公開してるIPの範囲

東京リージョンなら、3.112.23.0/29。(2021/2/2時点)

こんな感じで追加。

sample

EC2 Instance Connectをサーバ側にインストール

最近はデフォで入ってるらしい。入ってない場合は公式のドキュメントに書かれてる感じでインストール。

IAM アクセス許可を設定する

AWS CLI入ってる端末ならどこでも。

公式通りですが、こんな感じで設定。

例えばmy-policy.jsonで↓のような内容でファイル作る。

{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": "ec2-instance-connect:SendSSHPublicKey",
        "Resource": [
            "arn:aws:ec2:region:account-id:instance/i-1234567890abcdef0"
        ],
        "Condition": {
            "StringEquals": {
                "ec2:osuser": "ami-username"
            }
        }
      },
      {
        "Effect": "Allow",
        "Action": "ec2:DescribeInstances",
        "Resource": "*"
      }
    ]
}

regionは東京リージョンなら、「ap-northeast-1」

account-idは対象IAMユーザのアカウントID。712345678901みたいなやつ。

/i-1234567890abcdef0のところは対象のEC2のインスタンスID。

ami-usernameはインスタンスへのログインユーザ名。デフォならec2-user

ファイル作ったら下記コマンド

aws iam create-policy --policy-name my-hogehoge-policy --policy-document file://my-policy.json

policy-nameは適切につけた方がよさげ。

aws iam attach-user-policy --policy-arn arn:aws:iam::account-id:policy/my-hogehoge-policy --user-name IAMユーザのAWSへのログインユーザ名

my-hogehoge-policyは一つ前のコマンドで指定したポリシー名。


これでブラウザからコンソールいじれるという寸法です。


2021/2/11追記

このブラウザ上のコンソール、タイムアウトが結構早い。10分くらい。

これ伸ばせないのかしら?設定的なものが見つからない。。。

電話とか来ると再接続メンドウ。




以上の内容はhttps://cream-worker.blog.jp/tag/AWSより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14