かべぎわブログ

ブログです

Serverlessでstageごとに別のRoleをつかう

Serverlessでstageごとに別のRoleをつかってデプロイしてあげたい。

serverless.yml

service: lambda-test

provider:
  name: aws
  runtime: python3.8
  region: ap-northeast-1
  profile: ${self:custom.profiles.${opt:stage,self:provider.stage}}
  stage: ${opt:stage}

functions:
  hikisuu: 
    handler: handler.lambda_handler

custom:
  pythonRequirements:
    dockerizePip: true
  profiles:
    dev: dev_role
    prod: prod_role

こうデプロイする

sls deploy --stage dev

docker volumeでPermission deniedが発生したとき

dockerでボリュームマウントしたときにPermissionDeniedとなってマウントしたものにアクセスできない事象が発生した。

$ docker run -v /home/vagrant/docker_ansible/playbooks/:/work  local_ansible ls 
ls: cannot open directory '.': Permission denied

なんやろなーと思っていたらSELinuxが悪さをしている。
じゃあsetenforce 0しましょうっていうのもちょっと微妙だなー安直すぎるなーみたいなときにしらべていた解決法。

解決法

このとおり。
:zをつけてあげる

コンテナでデータを管理する — Docker-docs-ja 1.9.0b ドキュメント

たとえばこんなかんじ。

$ docker run -v /home/vagrant/docker_ansible/playbooks/:/work:z  local_ansible ls 

DockerでAnsibleをうごかす

ローカルで適当にうごかすかーみたいなときによくやる構成。

ディレクトリ構成

.
├── Dockerfile
└── playbooks
    └── playbook.yml

Dockerfile

FROM python:3.8

RUN pip install pip --upgrade
RUN pip install ansible

WORKDIR /work

ビルドして

docker build . -t local_ansible

マウントして実行

docker run -v /Users/kabegiwa/git/docker_ansible/playbooks/:/work local_ansible ansible-playbook playbook.yml

ansible-vaultで秘密鍵を暗号化する

秘密鍵も含めてGitHubにプッシュしたかった。
プライベートリポジトリとはいえそのままプッシュするのはためらわれたのでansible-vaultで暗号化してみる。

秘密鍵の暗号化

ansible-vaultで秘密鍵を暗号化 パスワードは適当に入力

ansible-vault .ssh/private_key

ここでprivate-keyをcatすると暗号化されているのがわかるはず。
​ そしてパスワードはこうする

echo 'password' > ./password.yml

playbook

playbookの最初でこうする

---
- hosts: localhost
  gather_facts: false
  vars:
    src_key: /work/.ssh/private_key
    dest_key: /work/.ssh/decrypted_private_key
  tasks:
  - file:
      dest: "{{ dest_key | dirname }}"
      mode: 0700
      state: directory
  - copy:
      src: "{{ src_key }}"
      dest: "{{ dest_key }}"
      mode: 0600

- hosts: remote-server
  tasks:
  ~~~省略~~~

インベントリ

インベントリで復号化後のsshキーを指定しておく

all:
  children:
    remote-server:
      hosts:
        example.com:
      vars:
        ansible_user: ec2-user
        ansible_ssh_private_key_file: /work/.ssh/decrypted_private_key

環境変数

パスワードをいちいち聞かれたくないのでパスワードファイルの場所を設定しておく。
パスワードファイルは.gitignoreとかでpushしないようにしておく。

ANSIBLE_VAULT_PASSWORD_FILE=/work/.ssh/password.yml

​ ​

おわりに

おわり