かべぎわブログ

ブログです

CircleCIでsls deployを実行したときだけdockerizePipをfalseにする

概要

CircleCIでserverless frameworkのsls deployを実行したときだけ、dockerizePipを無効にしてデプロイをしてみたいと思います。

なぜこんなことをするか

dockerizePipがtureだと以下のようなエラーが出力される。

ERROR: Could not open requirements file: [Errno 2] No such file or directory: '/var/task/requirements.txt'

原因はよくわからない。
docker-in-dockerだし…
公式のissueでも話題になっているけれど根本的な解決はなさそう。

対処法

こうする。

  custom:
    pythonRequirements:
      dockerizePip: ${self:custom.isCI.${env:CI}, self:custom.isCI.false}
    isCI:
      true: true
      false: non-linux

CircleCIで実行するときはCI=Trueとなる。
ローカル環境で実行する場合はexport CI=Falseなどで変数CIを事前に設定してあげる必要があるけれど。

おわりに

解決

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

  • 作者:山田 明憲
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/08/25
  • メディア: 単行本(ソフトカバー)

CircleCIで特定ブランチのみCIを実行させる

概要

CircleCIで特定ブランチに変更があった場合のみCIがうごくようにしてみます。

.circleci/config.yml

developブランチでしかCIが動かないように設定します。
filtersを設定してdeployはdevelopブランチの場合のみ実行されるようにしています。

version: 2
jobs:
  test:
    ~~~省略~~~
  deploy:
    ~~~省略~~~

workflows:
  version: 2
  test_and_deploy:
    jobs:
      - test
      - deploy:
          requires:
            - test
          filters:
            branches:
              only: 
                - develop 

動かしてみる

masterにpushすると

git push origin master

testしか実行されていないことがわかる。
f:id:kabegiwakun:20200206223514p:plain

developにpushすると

git push origin develop

testとdeployの両方が実行されていることがわかる。
f:id:kabegiwakun:20200206224009p:plain

おわりに

べんりですね。

CakePHPで学ぶ継続的インテグレーション (impress top gear)

CakePHPで学ぶ継続的インテグレーション (impress top gear)

CircleCIで順番に実行されるWorkflowをつくる

概要

CircleCIで順番に実行されるworkflowをつくってみます。
ユニットテストの後、デプロイするようなイメージです。

コード等はこれを利用しています。

github.com

.circleci/config.yml

testとdeployのjobをつくって、Workflowの箇所でrequiresを設定してあげています。

version: 2
jobs:
  test:
    docker:
      - image: circleci/python:3.7
    working_directory: ~/repo
    steps:
      - checkout
      - run:
          name: unittest 
          command: |
            python ./handler.py

  deploy:
    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 

workflows:
  version: 2
  test_and_deploy:
    jobs:
      - test
      - deploy:
          requires:
            - test

結果

無事できました。
f:id:kabegiwakun:20200206220749p:plain

おまけ

Pythonでのunittest

import requests
import unittest

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

class test(unittest.TestCase):
    def test_main(self):
        self.assertEqual(main('',''),200)

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

CCNA Collaboration CICD 210-060 Official Cert Guide

CCNA Collaboration CICD 210-060 Official Cert Guide

  • 作者:Michael H. Valentine
  • 出版社/メーカー: Cisco Press
  • 発売日: 2015/10/23
  • メディア: ハードカバー

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
  • メディア: 単行本(ソフトカバー)