開発日誌
更新日 (2021/09/06)
AmazonLinux2 で lego を使い Route53 認証でサーバ証明書を取得する
AmazonLinux2  lego を使いRoute53 を使った DNS 認証サーバ証明書を取得する手順す

※lego・・・Go製のCLIツールです。

前提条件
AWS EC2 AmazonLinux2
IAM ポリシーを作成する
<INSERT_YOUR_HOSTED_ZONE_ID_HERE> 部分は Route53 の管理画面該当 DNS Zone 情報から取得

	{
	    "Version": "2012-10-17",
	    "Statement": [
	        {
	            "Effect": "Allow",
	            "Action": [
	                "route53:GetChange",
	                "route53:ListHostedZonesByName",
	                "route53:ListResourceRecordSets"
	            ],
	            "Resource": [
	                "*"
	            ]
	        },
	        {
	            "Effect": "Allow",
	            "Action": [
	                "route53:ChangeResourceRecordSets"
	            ],
	            "Resource": [
	                "arn:aws:route53:::hostedzone/<INSERT_YOUR_HOSTED_ZONE_ID_HERE>"
	            ]
	        }
	    ]
	}
 
インストールする
AmazonLinux2 lego をインストール
mkdir tmp
cd tmp
wget https://github.com/go-acme/lego/releases/download/v3.7.0/lego_v3.7.0_linux_amd64.tar.gz
tar zxvf lego_v3.7.0_linux_amd64.tar.gz
mv lego /usr/local/bin/
chmod 755 /usr/local/bin/lego
chown root:root /usr/local/bin/lego
サーバ証明書を取得する
lego を使い、サーバ証明書を取得。 

lego --accept-tos \
--path=/etc/letsencrypt \
--email="email@example.com" \
--dns="route53" \
--domains="www.example.com" \
run
サーバ証明書を更新する
サーバ証明書を更新

lego --accept-tos \
--path=/etc/letsencrypt \
--email="email@example.com" \
--dns="route53" \
--domains="www.example.com" \
renew \
--days 30



開発日誌
更新日 (2021/09/06)
AWS CDKに感動した話

CDKとは

AWS クラウド開発キット (AWS CDK) は、使い慣れたプログラミング言語を使用してクラウドアプリケーションリソースを定義するためのオープンソースのソフトウェア開発フレームワークです。 出展:https://aws.amazon.com/jp/cdk/
AWS CDK(以降CDKに省略)はソースコードでインフラ構築・管理を行うフレームワークです ソースコードによるインフラ構築であればCloudFormationも候補に上がりますが、 CloudFormationの場合、ソースコードとしてjsonファイルもしくはyamlファイルに論理名の紐付けなど細かく記載する必要があります。 しかし、CDKの場合はTypeScritp、Python、Javaなど普段使い慣れたプログラム言語を使用することができ、細かい設定はCDKが吸収してくれるため、実装負荷が大変少ないです。

CDKで変わったインフラ構築

これまではAWSのコンソール上からインフラを構築していました。 しかし、コンソール上から手作業でインフラを用意するのは下記のこともあり”とても”大変です。
  • 構築に時間がかかる インフラ構築にはVPC、EC2、RDSなどさまざまなものを構築する必要がある それぞれ人の手で行うと一つの環境を作るのに数時間掛かってしまう
  • 構築ミスが発生 人の手による作業なので当然構築ミスも発生する 当然、ミスが出た際の問題解決に時間が割かれてしまう
  • 殆ど同じ環境を作らなければいけない苦行 web開発では通常、 PROD,STG,DEV+α環境と多くの環境を作ることが求められる。 そのため、同じ作業を複数回行わなければならず、マラソンをやっているような気持ちになる ※こちらとても私的な意見です
上記の問題はCDKを使うことで大幅に改善される

CDKのソースコードがあれば短時間でインフラ構築が完了する

CDKではソースコードさえあればターミナル上で片手で数えられるコード入力のみでインフラの構築が済んでしまう   例えば、下記のコマンド一発でソースコード記載のインフラ構築ができてしまいます。
cdk deploy --all
複数のインフラ構築作業が圧倒的に楽になりますね。

ミスが少なくて済む

ソースコードを読み込んでインフラ構築を行うため、いつでも同じ環境を作成することができる 属人化を防ぐ意味でも良いですね また、CDKはライブラリを使用するため、エディタの補完機能を使用することができ、ソースコード作成時のミスも少なくて済みます。

バージョン管理ができる

CDKはソースコードでインフラ構築ができるため、gitなどでバージョン管理ができます 下記のコマンド一発でソースコード記載のインフラ環境と実際にインフラ環境の差分が表示されます
cdk diff

CDKはいいぞ

CDKは便利の一言です   一度ソースコードを組んでしまえば同じ環境をいくらでも量産できるので、ちょっと新しい環境を作って試してみたいことがあった際に簡単にスクラップ&ビルドを行えてしまいます。 開発速度の向上が期待できますね。 また、インフラ構築自体はコマンド一発で出来上がってしまうので、属人化しないのが非常に良いですね。極論を言ってしまえば、ソースコードさえあればサルでもインフラ構築ができてしまいます。   問題のソースコードの実装自体は慣れさえすれば簡単です。特にAWSを使用したことがある方であれば構築時の設定と同じ内容を記載すれば良いので、すぐに感覚が掴めると思います。   一度触ってしまったらコンソール上でのインフラ構築には戻れません CDKにはそれほどの魅了が詰まっています 初心者用にAWSがワークショップを作ってくれているのも敷居が低くて大変良いです 皆さんも是非機会がありまたら触ってみてください!



開発日誌
更新日 (2021/09/06)
Autoscaling起動時にEIPをアタッチさせる
 外部APIとの接続があるときautoscalingで起動されたec2にも固定IPをつけたくなることがあると思います。その場合はNATゲートウェイを使うのがベストプラクティスだそうです。しかし、NATゲートウェイは意外と料金が高くつくので今回はEIPをAutoscaling時に自動でアタッチさせる方法を試してみます。 

実装手順

  1.  1. アタッチさせるEIPを事前にプールしておく
  2.  2. IAMポリシーの作成
  3.  3. シェルスクリプトの設定
 
  1. 1. アタッチさせるEIPを事前にプールしておく
    今回はこちらのIPを使っていきます。概要欄に割り当てIDが表示されているのでコピーしておきます。
  1. 2. IAMポリシーの作成
   EC2 APIの多くはリソースレベルでのアクセス許可制限が可能ですがすべてのEC2アクションでリソースを指定できるわけではないそうです。そして今回のアクションがリソースレベルのアクセス許可がサポートされていないアクションだそうです。。。       スクリプトを貼り付けて実行するだけでは権限が足りないようでこんなエラーが出ます。
An error occurred (UnauthorizedOperation) when calling the DescribeAddresses operation: You are not authorized to perform this operation.
{
    "Version": "2012-10-17",
    "Statement": [
        {
           "Sid": "ec2eip",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateImage",
                "ec2:CreateSnapshot",
                "ec2:Describe*",
                "ec2:DescribeInstances",
                "ec2:DescribeAddresses",
                "ec2:AssociateAddress"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "ec2",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1::instance/"
            ]
        }
    ]
}
なのでAutoscalingのEC2にアタッチするポリシーを作る必要があります。ポリシーを作成してAutoscalingで利用するロールにアタッチします。  
  1. 3. シェルスクリプトの設定
 インスタンスの起動時にスクリプトを実行させるためユーザーデータの設定に下記のコードを設定します。
    ・ Autoscaling起動設定の作成 ->追加設定 -> ユーザーデータ
#!/bin/bash

yum install jq -y

# EIPの割り当てID
eip_alloc_ids="eipalloc-07fad2290f8915762"
export AWS_DEFAULT_REGION=ap-northeast-1 instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

available_alloc_id=$(aws ec2 describe-addresses --allocation-ids ${eip_alloc_ids} | jq -r '[.Addresses[] | select(.InstanceId == null)][0] | .AllocationId')

echo $available_alloc_id

aws ec2 associate-address --instance-id ${instance_id} --allocation-id ${available_alloc_id}
■まとめ
 今回はAutoscaling起動時のec2のIPを固定化するためにEIPをアタッチさせました。EIPは月に300円程度なのでNatゲートウェイを使うよりも安く収まります。しかし、Natゲートウェイを利用したほうがec2をプライベートサブネットに置くことができるなどのメリットがあるのでNatゲートウェイの利用をおすすめします。

■参考
https://aws.amazon.com/jp/blogs/security/demystifying-ec2-resource-level-permissions/?nc1=h_ls
https://dev.classmethod.jp/articles/choose-eip-from-addresspool/