68851


### 実現したいこと

ローカルのDockerコンテナ内に作成したRailsアプリを、Capistranoを用いてAWSのEC2サーバにデプロイしたいです。

### 表示されているエラー

dockerのRailsコンテナ内で「bundle exec cap production deploy」すると、以下のエラーが出ます。

[code]

    SSHKit::Runner::ExecuteError: Exception while executing as ec2-user@(IPアドレス): Authentication failed for user ec2-user@(IPアドレス)
    
[/code]

全文  
![エラー内容](https://i.stack.imgur.com/xVJP1.png)

### 困っていること

エラー内容から、SSHの鍵の問題かと推測し調査中です。  
推測される原因や解決方法をご教示いただきたいと考えています。

### 現状のCapistrano設定ファイル

### Capfile

[code]

    require "capistrano/setup"
    require "capistrano/deploy"
    
    require 'capistrano/scm/git'
    install_plugin Capistrano::SCM::Git
    
    # add requires
    require 'capistrano/bundler'
    require 'capistrano/rbenv'
    require 'capistrano/rails/assets'
    require 'capistrano/rails/migrations'
    require 'capistrano/puma'
    
    # Load custom tasks from `lib/capistrano/tasks` if you have any defined
    Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
    
[/code]

### config/deploy.rb

[code]

    lock "3.7.0"
    
    # Capistranoのログの表示に利用する
    set :application, "myfavrest-app"
    
    # どのリポジトリからアプリをpullするかを指定する
    set :repo_url, "git@github.com:gcp632dsh/myfavrest-app.git"
    
    # サーバ上でのソースの配置先
    set :deploy_to, "/var/www/apps/myapp"
    
    # Rubyをrbenv経由で使う
    set :rbenv_type, :system
    set :rbenv_ruby, File.read('.ruby-version').strip
    set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} #{fetch(:rbenv_path)}/bin/rbenv exec"
    
    # アプリケーションで使用するgemをリリース間で共有
    append :linked_dirs, '.bundle'
    
    # サーバの並列数
    set :bundle_jobs, 2
    
    # リリース間での共有リソース定義
    append :linked_files, "config/master.key"
    append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets"
    
[/code]

### config/deploy/production.rb

[code]

    # EC2サーバーのIP、EC2サーバーにログインするユーザー名、サーバーのロールを記述
    server '(IPアドレス)', user: 'ec2-user', roles: %w{app db web} 
    
    set :ssh_options, {
      # capistranoコマンド実行者の秘密鍵
      keys: %w(~/.ssh/id_rsa),
      forward_agent: true,
      auth_methods: %w(publickey)
    }
    
[/code]

### Gemfile（関連部分のみ抜粋）

[code]

    ruby '2.6.5'
    gem 'rails', '~> 5.2.4'
    gem 'mysql2', '>= 0.4.4', '< 0.6.0'
    gem 'puma', '~> 3.11'
    
    group :development do
      gem 'capistrano-rails'
      gem 'capistrano-bundler'
      gem 'capistrano-rbenv'
      gem 'capistrano-rbenv-vars'
      gem 'capistrano3-puma'
    end
    
[/code]

### docker-compose.yml

[code]

    version: '3'
    services:
      db:
        image: mysql:5.7
        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
        environment:
           （省略）
        volumes:
          - db-volume:/var/lib/mysql
        ports:
          - "3306:3306"
      app:
        build:
          context: .
          dockerfile: ./docker/rails/Dockerfile
        command: bundle exec pumactl start
        tty: true
        stdin_open: true
        volumes:
          - .:/myapp
          - public-data:/myapp/public
          - tmp-data:/myapp/tmp
          - log-data:/myapp/log
          - sockets:/myapp/tmp/sockets
        privileged: true
        depends_on:
          - db
      web:
        build:
          context: .
          dockerfile: ./docker/nginx/Dockerfile
        ports:
          - '80:80'
        volumes:
          - public-data:/myapp/public
          - tmp-data:/myapp/tmp
          - sockets:/myapp/tmp/sockets
        depends_on: 
          - app
    volumes:
      db-volume:
      public-data:
      tmp-data:
      log-data:
      sockets:
    
[/code]

### 参考にした情報・試したこと

Capistranoの設定は下記記事を参照しました。  
[Capistrano 3によるRails 5.2 + puma +
nginxのデプロイをステップバイステップで学ぶ](https://qiita.com/tkykmw/items/a34441aae142e0e41b65)

また、エラー内容から推測し、鍵の設定の問題かと思い、下記の記事を参照して、  
deploy/production.rbの:ssh_optionsの箇所を修正し、再びデプロイ実行しましたがエラー内容は変わらずでした。  
[capistranoでデプロイする時のssh-
key周りのTips](https://qiita.com/Takkiii/items/c4f2cfd143e97e061e66)  
→この記事における、**「これだけだとgithubからソースコードを取ってこれないのでgithubの方にも自分の公開鍵を置く必要がある。さらに自分のssh-
keyをssh-
agentで使用する場合は以下のコマンドをローカル環境で実行する必要がある。」**という文章は、具体的に何の操作をすればいいのか、全くわからず何も出来ていない状態です。。

「どこの何の鍵を、どこに置けばいいのか？」  
「何かの鍵を新しく生成する必要があるのか？」  
等、混乱しており、少しずつ調べているところです。

SSHクライアント（Rlogin）を通じて、EC2にはSSH接続できており（EIPで固定IP化もしています）  
var/www/app/myappというデプロイ用ディレクトリも作成しています。

### 環境

Ruby 2.6.5  
Rails 5.2.4  
puma 3.11  
EC2のAMIはAmazon Linux 2 (t2.micro)  
ホストOS：Windows10 Home  
Virtual Box上にDocker-
composeを使ってコンテナを構築しており、そちらは問題なく動いており、アプリにもブラウザでアクセスできます。（Puma(Rails)+Nginx+Mysqlのコンテナがそれぞれ存在）

なお、こちらの質問は、恐れ入りますがteratailでも質問中です。  
<https://teratail.com/questions/278675>  
teratailでもし情報アップデートありましたら、すぐこちらにも反映させていただきます。

不明点、不足情報等ございましたら、お手数をお掛けし恐縮ですがご教示いただけますと幸いです。  
継続して鍵のことについて勉強・調査中ですが、皆さんのお力添え頂きたく、宜しくお願い致します。


CC BY-SA 4.0
2020-07-18T11:13:57.783
68703
2020-07-23T02:35:04.737
2020-07-18T13:08:14.837
40311
40311
question
ruby-on-rails aws ssh amazon-ec2 capistrano
Capistranoを用いてAWS EC2へRailsアプリをデプロイ時、SSHの認証エラーが出てデプロイできない


自己解決しました。  
ローカル側の.sshディレクトリと秘密鍵の権限が過剰でした。  
.sshディレクトリは700（drwx------）、秘密鍵については600または400にすべきでした。

[code]

    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/id_rsa
    chmod 600 ~/.ssh/myportfolio-ssh-key.pem
    
[/code]

[SSHでPermission deniedがでたら](https://hacknote.jp/archives/2225/)

鍵の権限が過剰であるといけないということを知りませんでした。  
dockerコンテナ上の.sshディレクトリに秘密鍵を置き、権限を上記設定したところ、SSHのエラーが解消されることが確認できました。


CC BY-SA 4.0
2020-07-23T02:35:04.737
68851
2020-07-23T02:35:04.737
40311
68703
answer