あしあと

自分自身のログ(足跡)となります。ソフトウェアエンジニアです。ブログはテック系の内容が少し多めです。

AWS CLIでAPI Gatewayのリソースポリシーを変更する(2019-06-03時点で公式ドキュメント不備あり)

AWS CLIを利用して、API Gatewayのリソースポリシーを変更する方法です。

前提

  • API自体の作成は完成している
  • リージョンは東京(ap-northeast-1)

手順

1. リソースポリシーをJSONの形にする

ポリシーの書き方がわからない場合は、コンソール画面で試してみると良いです。

f:id:pyo_hei:20190603073654p:plain

JSONへの変換は適当におこなってください。
私は、ターミナルから実行しました。

$ node
> a = {
...     "Version": "2012-10-17",
...     "Statement": [
...         {
.....             "Effect": "Allow",
.....             "Principal": "*",
.....             "Action": "execute-api:Invoke",
.....             "Resource": "arn:aws:execute-api:ap-northeast-1:xxxxxxxxx:xxxxxxxxx/{{stageNameOrWildcard}}/{{httpVerbOrWildcard}}/{{resourcePathOrWildcard}}",
.....             "Condition": {
.......                 "NotIpAddress": {
.........                     "aws:SourceIp": [
.........                         "{{sourceIpOrCIDRBlock}}",
.........                         "{{sourceIpOrCIDRBlock}}"
.........                     ]
.........                 }
.......             }
.....         }
...     ]
... }
{ Version: '2012-10-17',
  Statement:
   [ { Effect: 'Allow',
       Principal: '*',
       Action: 'execute-api:Invoke',
       Resource:
        'arn:aws:execute-api:ap-northeast-1:xxxx:xxxx/{{stageNameOrWildcard}}/{{httpVerbOrWildcard}}/{{resourcePathOrWildcard}}',
       Condition: [Object] } ] }
> console.log(JSON.stringify(a).replace(/\"/g, '\\"'))
{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"execute-api:Invoke\",\"Resource\":\"arn:aws:execute-api:ap-northeast-1:xxxxxxxxx:xxxxxxxxx/{{stageNameOrWildcard}}/{{httpVerbOrWildcard}}/{{resourcePathOrWildcard}}\",\"Condition\":{\"NotIpAddress\":{\"aws:SourceIp\":[\"{{sourceIpOrCIDRBlock}}\",\"{{sourceIpOrCIDRBlock}}\"]}}}]}

注意点としては、ダブルクオート(")はバックスラッシュ()でエスケープしておく必要があります。
最後に出力された値を利用します。

2. AWS CLIを実行する

あとは、以下のコマンドで実行すればOKです。

aws apigateway update-rest-api \
    --rest-api-id xxxx \
    --region ap-northeast-1 \
    --patch-operations "op=replace,path=/policy,value='{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"execute-api:Invoke\",\"Resource\":\"arn:aws:execute-api:ap-northeast-1:xxxx:xxxx/{{stageNameOrWildcard}}/{{httpVerbOrWildcard}}/{{resourcePathOrWildcard}}\",\"Condition\":{\"NotIpAddress\":{\"aws:SourceIp\":[\"{{sourceIpOrCIDRBlock}}\",\"{{sourceIpOrCIDRBlock}}\"]}}}]}'"

xxxxの箇所は実際の値を入れるようにしてください。

注意

--patch-operations の引数で"op=....と記載しています。
2019-06-03時点の公式ドキュメントでは、

f:id:pyo_hei:20190603074901p:plain

とダブルクオートの記載がありません。
ダブルクオートがないとエラーになるため、注意が必要です。