かべぎわブログ

ブログです

sls deployするときにPlease verify that the package.json has a valid "main" entryというエラーがでるときの対処法

概要

CircleCIでsls deployしようとしたらこんなかんじのエラーがでた。

Error: Cannot find module '/home/circleci/repo/node_modules/fs-extra/lib/index.js'. Please verify that the package.json has a valid "main" entry

なんのエラーか

こんなものはないっていわれている

/home/circleci/repo/node_modules/fs-extra/lib/index.js

原因

git add -Aしてnode_modules/配下が全部GitHub上にPushされていて、CircleCIでnpm installしたときにそんなものはないと言われていた。

対策

.gitignoreできちんとそこらへんを対象外にしてあげる

CircleCIでLambda(Python)をsls deployする

概要

CircleCIでLambda(Python)をServerless Frameworkをつかってデプロイしてみます。
GitHubにCommitされるとCircleCIでsls deployしてAWSにデプロイするようなイメージ。

手順

手順です。

1. 事前準備

以下に役に立つページがあります。
手順5まですすめます。

www.kabegiwablog.com

2. CircleCIの設定ファイルを作成する

CircleCIの設定ファイルであるconfig.ymlを作成します。

mkdir .circleci
touch .circleci/config.yml

config.ymlの中身はこんなかんじ。
Serverless Frameworkをインストールして、serverless-python-requirementsをインストールして、sls deployするだけです。

version: 2
jobs:
  build:
    docker:
      - image: circleci/python:3.7.6-stretch-node-browsers
    working_directory: ~/repo
    steps:
      - checkout
      - run:
          name: Install Serverless CLI and dependencies
          command: |
            sudo npm install -g serverless
            npm install 
      - deploy: 
          name: Deploy
          command: |
            npm install --save serverless-python-requirements
            sls deploy 

3. CircleCIの設定

CircleCIからSetup Projectして、Commit契機でうごくようにしておきます。

4. CircleCIをうごかす

addしてcommitしてPushしてCircleCIをうごかします。

5. デプロイされる

デプロイできました。 f:id:kabegiwakun:20200202222554p:plain

おわりに

べんりですね

Serverless FrameworkでLambda(Python)をデプロイする

概要

Serverless FrameworkをつかってLambda(Python)をAWS環境にデプロイしてみます。

手順

手順です。

1. テンプレートを作成する

今回デプロイするAWS Lambda用のServerless Frameworkのテンプレートを作成します。

serverless create --template aws-python3 --name requests-test --path ./requests-test

できました。

ls -l ./requests-test
total 8
-rw-r--r--. 1 vagrant vagrant  497 Feb  2 07:16 handler.py
-rw-r--r--. 1 vagrant vagrant 3201 Feb  2 07:16 serverless.yml

2. Lambda(Python)のコードをかく

デプロイしたいLambdaのコードをかきます。
今回はhandler.pyを以下のように上書きしてしまいます。
requestsをつかってcurlするだけのPythonです。

import requests

def main(event, context):
    response = requests.get('https://www.kabegiwablog.com/')
    print(response)

if __name__ == '__main__':
  main('', '')

ローカルでちゃんと動作することがわかります。

 python3 ./handler.py 
<Response [200]>

3. 必要なパッケージをrequirements.txtにかく

このhandler.pyの実行に必要なパッケージをrequirements.txtに記載してあげます。

pip3 freeze | grep requests > ./requirements.txt

こんなかんじ。

$ cat requirements.txt 
requests==2.22.0

4. serverless.ymlを編集してあげる

serverless.ymlを以下のように編集してあげます。

service: requests-test

provider:
  name: aws
  runtime: python3.7
  region: ap-northeast-1

functions:
  requests-test-lambda:
    handler: handler.main

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: true 

5. serverless-python-requirementsをインストールする

serverless-python-requirementsをインストールしてあげます。
これにより、requirements.txtで依存関係を自動的にバンドルしてくれます。

npm install --save serverless-python-requirements

6. AWS環境にデプロイする

いよいよデプロイです。
以下コマンドを実行してあげると、AWS環境にLambda関数がデプロイされます。
裏でCloudFormationがうごいています。

$ sls deploy

Serverless: Generated requirements from /home/vagrant/requests_test/requirements.txt in /home/vagrant/requests_test/.serverless/requirements.txt...
Serverless: Installing requirements from /home/vagrant/.cache/serverless-python-requirements/f866cf90d6349902a899d904a8c7724b092b63ed16fa2530c859ec177d70c68e_slspyc/requirements.txt ...
Serverless: Using download cache directory /home/vagrant/.cache/serverless-python-requirements/downloadCacheslspyc
Serverless: Running ...
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service requests-test.zip file to S3 (1.92 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.........
Serverless: Stack update finished...
Service Information
service: requests-test
stage: dev
region: ap-northeast-1
stack: requests-test-dev
resources: 6
api keys:
  None
endpoints:
  None
functions:
  requests-test-lambda: requests-test-dev-requests-test-lambda
layers:
  None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.

7. 確認

できました。
f:id:kabegiwakun:20200202171836p:plain

8. ゴミ掃除

removeで全削除できます。

sls remove

おわりに

べんりな世の中になりましたね。

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

  • 作者:Peter Sbarski
  • 出版社/メーカー: 翔泳社
  • 発売日: 2018/03/14
  • メディア: 単行本(ソフトカバー)

curlコマンドをPythonコードに変換する

概要

curlコマンドをPythonコードに変換します。

やりかた

以下のサイトをつかうだけ。

curl.trillworks.com

これが

curl -k https://www.kabegiwablog.com

こうなる

import requests

response = requests.get('https://www.kabegiwablog.com/', verify=False)

おわりに

べんりですね

スッキリわかるPython入門 (スッキリシリーズ)

スッキリわかるPython入門 (スッキリシリーズ)

  • 作者:国本大悟,須藤秋良
  • 出版社/メーカー: インプレス
  • 発売日: 2019/06/13
  • メディア: 単行本(ソフトカバー)

CentOS7にServerless Frameworkをインストールする

概要

CentOS7にServerless Frameworkをインストールしてみます。

前提

Node.jsが必要です。
以下の手順を参考にインストールしましょう。

www.kabegiwablog.com

手順

1. Serverless Frameworkをインストールする

これだけ

sudo npm install -g serverless

2. 確認

sls --version
Framework Core: 1.62.0
Plugin: 3.3.0
SDK: 2.3.0
Components Core: 1.1.2
Components CLI: 1.4.0

おわりに

できましたね

CentOS7にNode.js13 をインストールする

概要

CentOS7にNode.js13.xをインストールしてみます。

インストール手順

1. NodeSourceをyumリポジトリに追加します

curl -sL https://rpm.nodesource.com/setup_13.x | sudo bash -

2. Node.jsをyumでインストールします

これでyum install してあげればOKです。
Node.jsとnpmがインストールされます。

sudo yum install nodejs

3. 確認

確認してみます。

node --version
v13.7.0
npm --version
6.13.6

おわりに

できましたね

Node.js超入門[第2版]

Node.js超入門[第2版]

  • 作者:掌田 津耶乃
  • 出版社/メーカー: 秀和システム
  • 発売日: 2018/08/25
  • メディア: 単行本

CloudFrontでS3に307リダイレクトされるときの原因と対処法

概要

CloudFrontでオリジンをS3にしているときに、設定は間違っていないのにCloudFrontのURLからS3のURLにリダイレクトされてしまって、Access Deiniedってなってんーーーーーーーーーー??????ってなるときの原因と対処法です。

原因

基本的に全部以下に書いてある。
Amazon S3 での HTTP 307 エラーをトラブルシューティングする

Amazon S3 バケットを作成後、そのバケット名がすべての AWS リージョンに伝達されるまで、最大で 24 時間ほどかかる場合があります。その間に、S3 バケットと同じリージョンにないリージョンのエンドポイントにリクエストすると、「307 Temporary Redirect」レスポンスが返る場合があります。

対処法

これも書いてある。
Amazon S3 での HTTP 307 エラーをトラブルシューティングする

Amazon S3 オリジンで Amazon CloudFront ディストリビューションを使用する場合、CloudFront はリクエストをデフォルトの S3 エンドポイント (s3.amazonaws.com) に転送します。このエンドポイントは、us-east-1 リージョンにあります。バケットを作成後 24 時間以内に Amazon S3 にアクセスする必要がある場合は、バケットのリージョンのエンドポイントが含まれるように、このディストリビューションのオリジンドメイン名を変更します。たとえば、バケットが us-west-2 にある場合は、オリジンドメイン名を bucketname.s3.amazonaws.com から bucketname.s3-us-west-2.amazonaws.com に変更することができます。

実際にOrigin Domain Nameをkabegiwa-test-bucket.s3-ap-northeast-1.amazonaws.comといった形にして5分くらいでちゃんとCloudFront経由でやりたいことが実現できた。

おわりに

意外とハマった。

CloudFront経由でのみS3のコンテンツにアクセスさせる

概要

CloudFrontのオリジンアクセスアイデンティティを使用して、CloudFront経由でのみS3バケット内のコンテンツにアクセスさせてみます。

手順

CloudFrontのオリジンの設定で以下のように設定します。
RestrictBucketAccessをYesに、
Origin Access IdentityをCreate a New Identityに、
Grant Read Permissions on BucketをYes, Update Bucket Policyにします。
f:id:kabegiwakun:20200123215915p:plain

すると以下のようにオリジンに設定したバケットのバケットポリシーが自動で設定されます。
f:id:kabegiwakun:20200123220516p:plain

確認

S3バケットに直接アクセスすると以下のようにAccess Deiniedになります。
f:id:kabegiwakun:20200123221206p:plain

しかし、CloudFrontのDNS名経由ではアクセスすることができます。
f:id:kabegiwakun:20200123224342p:plain

おわりに

セキュアですね。

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

AWSCLIでAWSアカウントを作成する

概要

AWSCLIを利用してAWSアカウントをコマンド一撃で作成してみます。

前提

  • AWS Organizationsのマスターアカウントである
  • アカウント作成の権限がある

コマンド

これでいけます。
アカウント名とルートアカウントのメールアドレスを指定してあげるだけです。

aws organizations create-account --email myemail@example.com --account-name kabegiwablog

おわりに

べんりですね

ECS上でApacheを動かしてアクセスする

概要

ECS上でApacheを動かしてアクセスするだけのおはなしです。
具体的には以下のような構成です。

f:id:kabegiwakun:20200121220734p:plain

手順

ALBを作成する

ECSに接続するLBを事前に作成しておきます。
リスナーをHTTPSで
ターゲットグループはポートを8080にします。ヘルスチェックは/healthで作成します。

ECSクラスタを作成する

ふつうにつくればもんだいないです。

タスク定義を作成する

ネットワークモードをbridgeにし、コンテナをhttpdで作成します。
また、ポートマッピングでホストポート8080をコンテナポート80にマッピングしておきます。

サービスの設定

サービスの設定で、さきほど作成したタスク定義を起動するように設定する。

動作確認

https://ALBのドメイン名でアクセスする。
It works!!!

おわりに

ワインをのみながらかいている。

sudoでもリダイレクトがしたい

概要

sudoでリダイレクトがしたくなった。
たとえば以下のようにやるとPermission Deniedってなってしまう。

sudo echo 'wawawa' > /etc/wawawa.txt
bash: permission denied: /etc/wawawa.txt

対処法

bash -cをつかってあげる。
以下のようなかんじ。

sudo bash -c "echo 'wawawa' > /etc/wawawa.txt"

おわりに

おぼえておく。

新しいLinuxの教科書

新しいLinuxの教科書

ALBにACM/SSL証明書を関連付ける

概要

ALBにACM/SSL証明書を関連付けてみます。
画像のような感じです。
基本的なかたちですね。
f:id:kabegiwakun:20200119104941p:plain
ユーザからALBまではHTTPSで、ALBからEC2までの内部通信はHTTPです。

手順

1. ACMで証明書を取得する

以下ですこしやりました。

www.kabegiwablog.com

2. EC2インスタンスの作成と設定

ALBからのアクセスを受けるEC2インスタンスを設定してあげます。
セキュリティグループはALBからの通信を受けられるような設定のものをアタッチしてあげます。

3. ALBの作成と設定

以下のようなかんじの設定でALBを作成してあげます。

3.1. ロードバランサーの設定

名前: すきななまえ スキーマ: インターネット向け
IPアドレスタイプ: ipv4

リスナー: HTTPS

VPC: すきなVPC
アベイラビリティゾーン: すきなAZ

3.2. セキュリティ設定の構成

証明書タイプ: ACM から証明書を選択する
証明書の名前: 手順1 で取得した証明書の名前

3.3. セキュリティグループの設定

セキュリティグループ: インバウンドに任意の場所からHTTPSが許可されたものを選択

3.4. ルーティングの設定

ターゲットグループ: 新しいターゲットグループ
名前: すきななまえ
ターゲットの種類: インスタンス
プロトコル: HTTP
ポート: 80

ヘルスチェックのプロトコル: HTTP
ヘルスチェックのパス: /

3.5. ターゲットの登録

手順2で作成したインスタンスを登録済みに追加する。

4. EC2インスタンスの設定をする(Apache)

インスタンスにssh接続し、以下を実行してApacheの設定をしてあげます。

4.1. Apacheのインストール

sudo yum install -y httpd

4.2. ファイルの設置

sudo mkdir -p /var/www/html
sudo bash -c "echo 'wawawa' > /var/www/html/index.html"

4.3 Apacheの起動

sudo systemctl start httpd

5. ちょっとした確認

この時点でALBからインスタンスにアクセスできるかどうかを確認してみます。

5.1. ターゲットグループのステータスの確認

ターゲットグループのステータスがhealthyかどうかを確認します。

5.2. ALBのDNS名からブラウザでアクセス

ALBのDNS名からブラウザでアクセスして確認してみます。

https://ALBのドメイン名です。
証明書のドメインとALBのドメインが違うため、警告がでますが、無視してさきにすすみます。
wawawaと表示されればOKです。

6. Route53の設定

ALBのDNS名をコピーし、Route53にCNAMEとして追加してあげます。

ホストゾーン: ACM取得したドメイン

タイプ: Aレコード
エイリアス先: 作成したALB

7. 最終確認

ブラウザからドメイン名でアクセスします。
HTTPSで通信ができているはずです!!!

おわりに

べんりですね

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

  • 作者:山本 陽平
  • 出版社/メーカー: 技術評論社
  • 発売日: 2010/04/08
  • メディア: 単行本(ソフトカバー)

お名前.comで取得したドメインの証明書をACMで取得する

概要

お名前.comで取得したドメインの証明書をACMで取得してみます。

手順

こんなかんじの手順です。

1. Route53 Hosted Zoneを作成

Route53でACMを取得するドメイン名でHosted Zoneを作成します。
作成されたときにできるNSレコードを控えておきます。
次の手順で使います。

2. お名前.comでネームサーバを変更

続いて、お名前.comの[ドメイン設定]-[ネームサーバーの変更]へ遷移し、ACMを取得するドメインを選択、先の手順で控えたNSレコードを入力します。
f:id:kabegiwakun:20200118184818p:plain
インターネットの環境により、反映完了まで24時間から72時間程度かかる場合があるらしい。

3. ACMで証明書を取得

マネジメントコンソールから[証明書のリクエスト]であとは画面にそってしすすみます。
検証方法はDNSによる検証で良いと思います。
画面にそってすすんでステップ5で[Route53でのレコードの作成]を選択してRoute53にCNAMEレコードを追加してあげます。

4. 完了

できました。
f:id:kabegiwakun:20200118185543p:plain

おわりに

かんたんですね。

図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

  • 作者:小笠原 種高
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/11/07
  • メディア: 単行本(ソフトカバー)

Kubernetesでクラスタを切り替える

概要

Kubernetes クラスタを切り替えます。

こうやる

手順です。

クラスタ一覧を取得

$ kubectl config get-clusters

NAME
test.ap-northeast-1.eksctl.io
wawawa.ap-northeast-1.eksctl.io

現在のクラスタを確認する

$ kubectl config current-context

kabegiwa@wawawa.ap-northeast-1.eksctl.io

クラスタ切り替え

$ kubectl config use-context kabegiwa@test.ap-northeast-1.eksctl.io

Switched to context "kabegiwa@test.ap-northeast-1.eksctl.io".

おわりに

べんりですね

Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術 (impress top gear)

Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術 (impress top gear)

  • 作者:北山 晋吾,早川 博
  • 出版社/メーカー: インプレス
  • 発売日: 2019/07/12
  • メディア: 単行本(ソフトカバー)

EKSクラスタを作成してpodをたてるまで

概要

EKSクラスタを作成してpodをつくるまでのメモです。

手順

手順です。

EKSクラスタの作成

こんなかんじ
podはひとつだけ
作成に10分くらいかかる

$ eksctl create cluster --name test --nodes 1

kubectlで使えるようにconfigに追記させる。

$ eksctl utils write-kubeconfig --name test --kubeconfig ~/.kubeconfig

確認

クラスタができている。

$ eksctl get cluster
NAME    REGION
test    ap-northeast-1

fargateではないのでnodegroupがインスタンスで動作している。

$ eksctl get nodegroup --cluster test
CLUSTER NODEGROUP   CREATED         MIN SIZE    MAX SIZE    DESIRED CAPACITY    INSTANCE TYPE   IMAGE ID
test    ng-67463005 2020-01-02T04:08:54Z    1       1       1           m5.large    ami-02e124a380df41614

podの作成

podをつくります。

$ kubectl create -f sample-pod.yaml

podの設定ファイル

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: linux
      image: centos

確認

podができている。

$ kubectl get pods
NAME         READY   STATUS             RESTARTS   AGE
sample-pod   0/1     CrashLoopBackOff   8          10m

おわりに

むずかしいですね

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)

  • 作者:青山 真也
  • 出版社/メーカー: インプレス
  • 発売日: 2018/09/21
  • メディア: 単行本(ソフトカバー)