#概要
ラズパイで撮影した画像をS3に送る時に、「Access Denied」が発生してS3にアクセスすることができず、解消に手間取ったので備忘録。
#事象
aws s3 cp test.jpg s3://test/
上記のコマンドでS3へ画像を送ると以下のエラーが発生する。
upload failed: ./kaitlyn-baker-vZJdYl5JVXY-unsplash.jpg to s3://test/kaitlyn-baker-vZJdYl5JVXY-unsplash.jpg An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
IAMポリシーとか、IAMロールとかいろいろ見たけどどれも問題なさそう。
ちなみにIAMユーザーに対してS3フルアクセスの権限を与えているので、ポリシーレベルでは問題ないはず。
#原因
MFAでの認証が取れていないため、アクセス拒否されていた。
会社のAWS環境でなく個人のAWS環境で同じようにS3へアップロードしたところ問題なくUPすることができた。唯一の差分といえばIAMユーザーに対しMFAが割り当てられているかどうかぐらいだった。
#解消法
CLIでMFAの認証を通してから、S3へアップロードしたところ本事象が解消した。
MFAが有効になっているかどうかは、Identity and Access Management (IAM)の画面で確認することができる。
IAMユーザーの一覧画面でMFA項目が「仮想」になっていたらMFAが有効になっている。
その場合、AWS CLIでaws configureコマンドで設定を行ったあと、一時的なアクセスキーとシークレットキーを払い出し、環境変数に設定する必要がある。
以下のリンク先を参考にすればMFAの認証を行うことができる。
「AWS CLIのみでMFAを有効にする方法」
http://blog.serverworks.co.jp/tech/2019/08/16/cli-mfa/
※上記リンクの「6.CLIでのMFA認証方法」から参照してください。
#実行例
例として、「ターミナルを開いてからS3へアップするまでのコマンド」を上げておきます。
###1.AWSへの接続情報を準備
$ aws configure
AWS Access Key ID [none]: {アクセスキー}
AWS Secret Access Key [none]: {シークレットキー}
Default region name [none]: {リージョン}
Default output format [none]: {フォーマット形式}
上記のキー設定・取得方法は以下を参照
「AWS CLIのインストールから初期設定メモ」
https://qiita.com/n0bisuke/items/1ea245318283fa118f4a
###2.環境変数に接続情報を設定
$ export AWS_ACCESS_KEY_ID= {アクセスキー}
$ export AWS_SECRET_ACCESS_KEY={シークレットキー}
$ export AWS_DEFAULT_REGION= {リージョン}
$ export AWS_DEFAULT_OUTPUT= {フォーマット形式}
ここは1をやっていればやらなくても大丈夫かもしれないが念のため。
たとえばすでに別のAWSアカウントでCLIの接続をしたことがある場合。
環境変数に古い値が設定されていると1で設定した内容よりも環境変数で設定されている内容をAWS側で優先して見てしまうので念のため設定しておくことをお勧めする。
###3.一時情報の取得
$ aws sts get-session-token --serial-number {IAMユーザーのユーザーの ARN} --token-code {MFAの認証コード6桁}
MFAの認証コード6桁については以下を参照
「AWSでMFA(二段階認証)を有効にする方法を超丁寧に説明するよ」
https://qiita.com/viptakechan/items/6d19aee635b2ab189e47
###4.取得した一時情報を環境変数に設定する
3を実行すると以下のような結果が取得できる
"Credentials": {
"SecretAccessKey": "シークレットアクセスキー",
"SessionToken": "セッショントークン",
"Expiration": "2020-01-13T13:33:35Z",
"AccessKeyId": "アクセスキー"
}
それを環境変数に以下のような形式で設定する。
export AWS_ACCESS_KEY_ID={アクセスキー}
export AWS_SECRET_ACCESS_KEY={シークレットアクセスキー}
export AWS_SESSION_TOKEN={セッショントークン}
###5.S3へアップロードする
aws s3 cp {ローカル状の画像の配置パス} s3://{バケット名}/
#あとがき
この手順でS3にアップロードできるかと思います。
もしAccess Deniedが発生して、「ポリシーもロールも問題ないんだけどなぁ」って感じであれば、試してみてください!